Часы реального времени DS3231 умерли?

Согласен.

Ок, теперь объясните четко, почему вы решили, что так быть не должно . Объясните по каждому условию отдельно

Тут у меня нет конкретного ответа. Я лишь сравниваю, то как это работало еще в начале моего проекта. Я начал проект именно с часов.

#include <TM1637Display.h>  // подключение библиотеки дисплея ТМ1637
#include "RTClib.h"         // подключение библиотеки часов реального времени

//--------------------------------------------- переменные ---------------------------------------
uint32_t last_time;  // переменная для таймера millis

int CounterI;  // Переменная для счетчика в фуекции вкл/выкл двоеточия часов


RTC_DS3231 rtc;

TM1637Display displayW(A1, A2);  // Определение выводов для дисплея "Часы"

unsigned long startTime;


//---------------------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------------
void setup() {
  Serial.begin(9600);         // подключаем сериал порт на скорости 9600 бод.
  displayW.setBrightness(2);  // яркость дисплея часов.
 
  if (!rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1)
      ;
  }
  if (rtc.lostPower()) {
    Serial.println("RTC lost power, lets set the time!");
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    //rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
  }
  displayW.clear();
 
}


//---------------------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------------
void loop() {
  DateTime now = rtc.now();

  int displaytime = (now.hour() * 100) + now.minute();

  Serial.println("RTC lost power, lets set the time!");
  //Serial.println(displaytime);
  //Serial.println(future.minute());
  delay(1000);
  if (CounterI == 0) {
    CounterI += 1;
    displayW.showNumberDecEx(displaytime, 0b11100000, true);
  }

  if (CounterI == 2) {
    CounterI += 1;
    displayW.showNumberDec(displaytime, true);
  }

  if (millis() - last_time >= 1000) {
    CounterI += 1;
    last_time = millis();
  }

  if (CounterI >= 4) {
    CounterI = 0;
  }
}

Тут при каждой компиляции на дисплей выводилось текущее время как на компьютере, ну с опозданием на несколько секунд конечно из за-за загрузки в Ардуино. И сколько бы раз я не загружал этот код, каждый раз время устанавливалось как на компьютере. То есть срабатывали if. Теперь этого не происходит. При загрузки в Ардуино время остается не изменным. Сейчас вот на компе 13.43, на часах 13.01.

Я вас просил по обоим условиям. Давайте по порядку. По первому вы ничего не сказали. Вы вообще понимаете, что это за условие и как работает?

Первое проверяет работает ли RTC, второе проверяет потерю питания. Кажется так?

Почти так - первое проверяет, подключен ли модуль часов. У вас он подключен, верно? Тогда почему вас удивляет, что печатается строка 11111? Что в этом неправильного?

1 лайк

Спасибо огромное! Я разобрался. Если отключить батарею и отключить питание Ардуины, то все срабатывает по первому условию. Значит делаю вывод, раньше либо батарея не контачила, либо что еще. Ну вобщем не пропадало питание и оно не регистрировалось как потеря питания.

Я почему это пишу - потому что вы все время жалуетесь, что “условИЯ не срабатывают”. Зачем вы сваливаете два РАЗНЫХ условия вместе?

Так было в примере самой библиотеки. Я эти проверки скопировал в свой проект.

Не торопитесь.
Теперь давайте поставим еще один опыт с тем кодом, где вы добавили строчки с единицами. Просто отключите девайс от питания и выньте батарейку из часов.
Снова включите питание, батарейку не ставьте. Что печатает код?

1111111111111111111111
“RTC lost power, lets set the time!”

Увы, опять все в кучу. У вас нет понимания вовсе. И выводы поэтому неверные.

Значит модуль исправен.
Мы проверили оба условия и каждое работает именно так как должно.
Проблема в вас - вы не понимаете логики кода.

Попробую пояснить, как я понимаю.
Первое условие проверяет, работает ли rtc, ну или есть ли он вообще. Если нет (так как проверяет на инверсию “!” то сообщает “Couldn’t find RTC”, в проливном случае 1111111111111.
Второе условие, проверяет попадало ри питание, если да то сообщает RTC lost power, lets set the time!, иначе 111111111111111. Это верно?

Примерно так.

Благодарю. Некоторые вещи мне действительно не понятны. В Visula Basic некоторые вещи проще мне дались чес С++

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

Да. Безусловно. Еще раз благодарю.

Это называется “горе от ума” - придумать себе проблему там, где ее нету и считать неисправным штатно работающий модуль ))

Логика везде одна и та же, просто записывается немного разными словами

2 лайка

Ну, слава Богу. Я Вам про это написал в самом начале обсуждения, но Вы предпочли обидеться а не прислушаться.

2 лайка