DS3231 mini не держит время

Craftim

✩✩✩✩✩✩✩
4 Окт 2019
14
1
Господа, помощи!
Подключаю, заливаю скетч - часы работают. После отключения питания, все по новой... время не продолжается. Разные библиотеки пробовал, работают, но время сбрасывается. Батарейка на модуле живая - 3в. В чем подвох?

Пример Алекса. как есть...:
// демо возможностей библиотеки
#include <microDS3231.h>
MicroDS3231 rtc;

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

  // проверка наличия модуля на линии i2c
  // вызов rtc.begin() не обязателен для работы
  if (!rtc.begin()) {
    Serial.println("DS3231 not found");
    for(;;);
  }

  // ======== УСТАНОВКА ВРЕМЕНИ АВТОМАТИЧЕСКИ ========
  // rtc.setTime(COMPILE_TIME);     // установить время == времени компиляции

  // визуально громоздкий, но более "лёгкий" с точки зрения памяти способ установить время компиляции
  rtc.setTime(BUILD_SEC, BUILD_MIN, BUILD_HOUR, BUILD_DAY, BUILD_MONTH, BUILD_YEAR);
   
  if (rtc.lostPower()) {            // выполнится при сбросе батарейки
    Serial.println("lost power!");
    // тут можно однократно установить время == времени компиляции
  }

  // ======== УСТАНОВКА ВРЕМЕНИ ВРУЧНУЮ ========  
  // установить время вручную можно двумя способами (подставить реальные числа)
  //rtc.setTime(SEC, MIN, HOUR, DAY, MONTH, YEAR);
  //rtc.setHMSDMY(HOUR, MIN, SEC, DAY, MONTH, YEAR);

  // также можно установить время через DateTime
  /*
  DateTime now;
  now.second = 0;
  now.minute = 10;
  now.hour = 50;
  now.date = 2;
  now.month = 9;
  now.year = 2021;

  rtc.setTime(now);  // загружаем в RTC
  */
}

void loop() {
  // получение и вывод каждой компоненты
  Serial.print(rtc.getHours());
  Serial.print(":");
  Serial.print(rtc.getMinutes());
  Serial.print(":");
  Serial.print(rtc.getSeconds());
  Serial.print(" ");
  Serial.print(rtc.getDay());
  Serial.print(" ");
  Serial.print(rtc.getDate());
  Serial.print("/");
  Serial.print(rtc.getMonth());
  Serial.print("/");
  Serial.println(rtc.getYear());

  /*
  // можно через DateTime (более оптимально):
  DateTime now = rtc.getTime();
  Serial.print(now.hour);
  Serial.print(":");
  Serial.print(now.minute);
  Serial.print(":");
  Serial.print(now.second);
  Serial.print(" ");
  Serial.print(now.day);
  Serial.print(" ");
  Serial.print(now.date);
  Serial.print("/");
  Serial.print(now.month);
  Serial.print("/");
  Serial.println(now.year);
  */

  // вывод температуры чипа
  Serial.println(rtc.getTemperatureFloat());
  //Serial.println(rtc.getTemperature());

  // вывод времени готовой строкой String
  Serial.println(rtc.getTimeString());

  // вывод даты готовой строкой String
  Serial.println(rtc.getDateString());

  // вывод времени через char array
  char time[9]; // буфер минимум на 9 символов (8 данные + 1 нулевой)
  rtc.getTimeChar(time);
  Serial.println(time);

  // вывод даты через char array
  char date[11]; // буфер минимум на 11 символов (10 данные + 1 нулевой)
  rtc.getDateChar(date);
  Serial.println(date);

  Serial.println();
  delay(500);
}
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,266
1,303
Москва
Вот этот код:
C++:
  // визуально громоздкий, но более "лёгкий" с точки зрения памяти способ установить время компиляции
  rtc.setTime(BUILD_SEC, BUILD_MIN, BUILD_HOUR, BUILD_DAY, BUILD_MONTH, BUILD_YEAR);
При рестарте модуля устанавливает в RTC время компиляции. Каждый раз при нажатии ресета , при потери питания будет возврат к этим установкам. Это безусловная инструкция для модуля
 

Craftim

✩✩✩✩✩✩✩
4 Окт 2019
14
1
Благодарствую! Понял) Сначала залил скетч, чтобы время выставилось, затем закомментировал эту строчку и снова залил скетч.
 
  • Лойс +1
Реакции: Glukkozzoid

Glukkozzoid

✩✩✩✩✩✩✩
4 Июн 2023
1
0
Закомментировать строчку времени компиляции и снова залить скетч! Гениально! Чесслово!
Как я сразу до этого не додумал? Полез через другой МК внутрь модуля колдовать с регистрами и флагами. Решил, что микросхема кончилась - начал эксперименты с другим модулем!... Никак не привыкну, что в Ардуине все так просто....
 

eri

✩✩✩✩✩✩✩
9 Сен 2024
1
0
if (rtc.lostPower())добавьте. сбрасываться на время компиляции будет только при отключении батарейки.