Hi. I had a problem a little while ago whereby some motors on my project kept tripping up my DS1307RTC unit and halting everything. I was advised to install some flyback diodes across the motors which i thought had worked but in my final phase of testing the project just now, the fault seems to be back, albeit not as much.
My questions is… is there any other way of holding time in Arduino other than an RTC? I spent weeks before trying to resolve the above issue and cannot spend more so thought it would be easier to just remove the RTC and try a different way.
Things I need time to do…
Display time in hours, minutes and seconds on a monitor device.
Allow functions to trigger such as turn motors on and off (all driven via a relay bank)
Ps. I am using Blynk to control/monitor all of the functions.
I use the DS1307 library with my RTC, and Blynk to update it every now and again. So if your clock deviates, Blynk will reprogram it many times.
#include <WidgetRTC.h>
#include <RTClib.h> // RealTimeClock Library for DS1307 and DS3231
#define BLYNK_PRINT Serial
RTC_DS1307 RTC;
float UTCOffset = -5.0; // Your timezone relative to UTC (http://en.wikipedia.org/wiki/UTC_offset)
WidgetLCD lcdA(V7); //Set LCD widget to Advanced Mode - Widget to display project clock
WidgetTerminal terminal(V8);
WidgetRTC rtcWidget; // requires RTC widget in app
BlynkTimer timer; // SimpleTimer instance named timer
void displayDateTime()
{
Serial.println("displayDateTime");
DateTime now = RTC.now(); // reads time at beginning of loop
byte HOUR = now.hour();
byte twelveHour = now.hour() - 12; // Variable used to display 13+ hours in 12 hour format
byte zeroHour = 12; // Variable use to convert "0" zero hour to display it as 12:00+
byte displayHour;
byte MIN = now.minute();
byte SEC = now.second();
char* meridian;
if (now.hour() == 0) // First we test if the hour reads "0"
{
displayHour = zeroHour;
meridian = "AM";
}
else if (now.hour() >= 13) // if no, Second we test if the hour reads "13 or more"
{
displayHour = twelveHour;
meridian = "PM";
}
else
{
displayHour = now.hour();
meridian = "AM";
}
if (Blynk.connected())
{
char stamp[16];
lcdA.clear();
sprintf(stamp, "%02d:%02d:%02d-%02s", displayHour, MIN, SEC, meridian);
lcdA.print(3, 0, stamp);
sprintf(stamp, "%02d/%02d/%04d", now.month(), now.day(), now.year());
lcdA.print(3, 1, stamp);
}
}
// synchronize the RTC hardware device with our server provided date/time values
void syncRTCHardware()
{
if (!Blynk.connected())
{
Serial.println("Blynk not connected. Exiting syncRTCHardware.");
return;
}
Serial.println("syncRTCHardware");
DateTime now = RTC.now(); // reads time at beginning of loop
char currentTime[16];
char currentDate[16];
sprintf(currentDate, "%02d/%02d/%04d", month(), day(), year());
sprintf(currentTime, "%02d:%02d:%02d", hour(), minute(), second());
Serial.print("Server Time: ");
Serial.print(currentDate);
Serial.print (" ");
Serial.println(currentTime);
// time library is synchronized by the Blynk WidgetRTC
if (Blynk.connected())
{
bool syncClocks;
if (now.hour() != hour() && now.minute() != minute()) syncClocks = true;
if (syncClocks == true)
{
syncClocks = false;
Serial.println("Resynching RTC Time...");
terminal.println("Resynching RTC Time...");
RTC.adjust(DateTime(year(), month(), day(), hour(), minute(), second()));
terminal.flush();
}
}
}
BLYNK_CONNECTED()
{
Serial.println("BLYNK_CONNECTED");
rtcWidget.begin(); // Synchronize with widget (server) time on connection
setSyncInterval(5 * 60); // subsequent time sync interval in seconds (5 minutes)
}
void setup() {
timer.setInterval(15000L, syncRTCHardware); // synchronize the RTC device with the server time every 15 seconds
timer.setInterval(5000L, displayDateTime); // update the LCD Widget every 5 seconds
}
void loop()
{
// only attempt Blynk-related functions when connected to Blynk
if (Blynk.connected())
{
Blynk.run();
}
timer.run();
}
I’m pretty sure that’s all of it (RTC code). I may need to edit and add more/less.
Forum member @myggle hasn’t been seen since February 2019, so I doubt you’ll get a response to your question.
The code that was posted was incomplete, and won’t compile without some changes. As you’ve not shared information about how you’ve changed the code it will be difficult for anyone to assist you with this example.
You currently have another active topic about using an external RTC module with the Bl6nk RTC widget, but in that topic you aren’t providing the necessary information to allow us to assist you.
I’d suggest you focus on your active topic, simplify the code you are using, and provide full details about how you are connecting your external devices to your Uno. It would also be helpful if you gave more in-depth responses to questions, and be clearer about the information you post.
The reason why I am using this concept is, I don’t have stable internet in my village.It may go down any time and it will be out for hours. So I wanted to use DS3231 as my timer. I wanted to sync with Blynk Server one in day to avoid time issue with my setup.
I ON my outside house light in the even after 6PM. I ran into issue when there was no internet and light didnt on as i was not able to sync with the Blynk Server.