RTC на ds1307 проблемы при выключенном питании

Модуль HW-111 c чипом DS1307 запускается программой

#include <RtcDS1307.h>
RtcDS1307<TwoWire> rtc(Wire);


void setup () 
{
   Serial.begin(115200);

   Serial.print("compiled: ");
   Serial.print(__DATE__);Serial.print(",");
   Serial.println(__TIME__);

   rtc.Begin();

   RtcDateTime compiled = RtcDateTime(__DATE__, __TIME__);
   printDateTime(compiled);
   Serial.println();Serial.println("11");

compiled +=40;
   if (!rtc.IsDateTimeValid()){
       if (rtc.LastError() != 0){
           Serial.print("RTC communications error = ");
           Serial.println(rtc.LastError());
       }
       else{
           Serial.println("RTC lost confidence in the DateTime!");
           rtc.SetDateTime(compiled);
       }
   }

   if (!rtc.GetIsRunning()) {
       Serial.println("RTC was not actively running, starting now");
       rtc.SetIsRunning(true);
   }

   RtcDateTime now = rtc.GetDateTime();
   if (now < compiled) {
       Serial.println("RTC is older than compile time!  (Updating DateTime)");
       rtc.SetDateTime(compiled);
   }
   else if (now > compiled) {
       Serial.println("RTC is newer than compile time. (this is expected)");
   }
   else if (now == compiled) {
       Serial.println("RTC is the same as compile time! (not expected but all is fine)");
   }

   rtc.SetSquareWavePin(DS1307SquareWaveOut_Low); 
} // The end of setup 

void loop () 
{
   if (!rtc.IsDateTimeValid()) 
   {
       if (rtc.LastError() != 0){
           // we have a communications error
           // see https://www.arduino.cc/en/Reference/WireEndTransmission for 
           // what the number means
           Serial.print("RTC communications error = ");
           Serial.println(rtc.LastError());
       }
       else{
           // Common Causes:
           //    1) the battery on the device is low or even missing and the power line was disconnected
           Serial.println("RTC lost confidence in the DateTime!");
       }
   }

   RtcDateTime now = rtc.GetDateTime();

   printDateTime(now);
   Serial.println();

   delay(10000); // ten minutes //seconds
} // The end of loop

#define countof(a) (sizeof(a) / sizeof(a[0]))

void printDateTime(const RtcDateTime& dt)
{
   char datestring[25];
   char daysOfTheWeek[7][4] = {"Sun","Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};

   snprintf_P(datestring, 
           countof(datestring),
           PSTR("%3s, %02u.%02u.%04u %02u:%02u:%02u"),
           daysOfTheWeek[dt.DayOfWeek()],
           dt.Day(),
           dt.Month(),
           dt.Year(),
           dt.Hour(),
           dt.Minute(),
           dt.Second() );
        /*Days=monthDay0 +(timeClient.getHours()*1.+timeClient.getMinutes()*1./60+timeClient.getSeconds()*1./3600)/24;
  */
       float Days=dt.Day()+(dt.Hour()*1.+dt.Minute()*1./60+dt.Second()*1./3600)/24;
   Serial.print(datestring);Serial.print(" ");Serial.print(Days,8);
}```
Время определяется и выводится правильно с точностью до секунды совпадающее с временем на ПК. Но после отсоединения от компьютера и последующего включения сообщаемое время продолжается от момента выключения с отставанием от времени на ПЛ.

Так в чем проблема-то?

Код вставлен “как всегда”. Описание проблемы см. последнюю строку кода.

1 лайк

Для начала заменить батарейку


Удаляйте лишние детали, как написано, и будет счастье. R7 тоже лишний.

Я R7 не удалял, да и R4 тоже не мешает. Все работает. А вот диод нужно удалить обязательно

А на первом модуле у меня его и не было ))

R7 не мешает, но батарейку должен слегка подсаживать. При батарейном питании.

R7 к батарейке не относится. R4 - да, но там токи микроамперные. По сути он там и не нужен, но зачем-то же его всунули )))

Здрасьте! А генератор от батарейки не работает?

Работает. А R7 к батарейке не подключен :wink:

Генератор работает от батарейки, которая разряжается через R7 в т.ч.

А может быть подключить внешний Li-аккумулятор. У меня их много от акк-блоков сдохших компов.

А в чем проблема поставить нормальную батарейку? Копейки же стоит, а хватит на пару лет точно

1 лайк

Эта схема рассчитана на никелевый аккумулятор. Если поставить 3х вольтовую батарейку, без удаления деталей, как выше описали, она бабахнет от 5 вольт. Да и делитель R4 R6 не даст нормально работать.

Спасибо, кэп. Именно это мы и обсуждали выше ))

to GREEN: Не понял зачем удалять R6 и что такое jmper wire.

Не нужен он там

Перемычка. Резистор удалить, цепь замкнуть, иначе батарейка не будет соединяться с выводом Vbat чипа

Подвожу итог двухдневным опытам с HW-111. У меня был приобретен около года назад один такой модуль, который из случайного скетча загрузился по onewire, но установить время не удалось и опыт прервался. Столкнувшись с трудностями приема времени по NTPC и обнаружив библиотеку RTC, я вернулся к старому HW и получил время. Сгоряча заказал еще пару HW, из которых заработал только один. Два работосgособных HW оказались на работающих платах и к вечеру только один из них продолжал показывать время. Ошибки были RTC communications error = 5 и
RTC communications error = 2
RTC was not actively running, starting now
У двух новых HW были удалены D1 и R6, вставлены перемычки на место R6, но ничего не изменилось. Работающий HW по прежнему пропускает время, в течении которого плата с ним была отключена от ПК.
Что этот пропуск дефект HW или дефект программы?

Думаю, начинать нужно с ревизии платы на предмет неконтакта, раз нет связи с модулем

Потом отложить свой скетч и загрузить примеры, что идут с библиотекой, ну а потом уже делать вывод, что косячит - модуль или прошивка