ARDUINO Гирлянда на STM32, вопрос по часам DS3231

Vint

✩✩✩✩✩✩✩
14 Ноя 2019
3
2
Коллеги, нужна помощь. Контроллер STM32, часы DS3231, Блютус, матрица 10х15. Всё работает, но засада с часами. При первом включении время с DS3231 считывает верно, но эти часы и минуты так и остаются. т.е. эффекты крутятся, часы в ДС-ке тикают но на экран выводятся только то время которое прочиталось при включении. Где копнуть, есть идеи?
 

Александр Симонов

★★★★✩✩✩
2 Авг 2018
727
207
Коллеги, нужна помощь. Контроллер STM32, часы DS3231, Блютус, матрица 10х15. Всё работает, но засада с часами. При первом включении время с DS3231 считывает верно, но эти часы и минуты так и остаются. т.е. эффекты крутятся, часы в ДС-ке тикают но на экран выводятся только то время которое прочиталось при включении. Где копнуть, есть идеи?
Нужен скетч для анализа
 
  • Лойс +1
Реакции: Vint

Александр Симонов

★★★★✩✩✩
2 Авг 2018
727
207
Каждый раз при включении устанавливается время, когда был прошит скетч. Скорей всего дело в этом.
 

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

★★★★★★★
14 Авг 2019
4,188
1,280
Москва
Я проследил вывод часов.. или я не правильно понял чтото..
при включении если было отключение
C++:
if (rtc.lostPower()) {
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  }
происходит коррекция времени. Как определяется потеря питания не смотрел.

Далее имеем безусловное получение информации с часов:
C++:
DateTime now = rtc.now();
  secs = now.second();
  mins = now.minute();
  hrs = now.hour();
Вернее условно-безусловное. если USE_CLOCK равен 1.
кстати, в начале есть такая строка, которая определяет переменные минут, секунд и часов по умолчанию:
C++:
int8_t hrs = 10, mins = 25, secs;
Видим, что rtc.now() - это получение текущего времени из часов. (предполагаем, что автор, как и я, не знаком с используемой библиотекой часов)
Так же понимаем, что это время полученное в setup , а что бы получать верное время меняться оно должно где ? в LOOP конечно.

Далее я ищу где еще используется rtc.now(); и вижу что только 2-х местах в файле clock , в функции clockTicker и clockRoutine. причем clockTicker вызывается из clockRoutine при определенном условии. Именно в этой функции идет отрисовка часов на ленте функцией drawClock.
А поискав еще я нашел вторую функцию clockRoutine - пустую!

Теперь вопрос. Часы как отображаются на гирлянде ?

Функция clockRoutine вызывается в файле custom из функции customModes, причем в 3-х случаях, когда режим равен 2, 10 и 23, а сама customModes вызывается из функции customRoutine, которая есть в цикле loop.

Таким образом, при определенных условиях, работать должно!

Остается проверить как все работает , выводя отладочные сообщения в Serial. Я бы начал с определения того, какая функция из 2-х clockRoutine активна в прошивке. Если есть визуалкод или как он там, то с ним попроще, чем с ide - он умеет сворачивать условия. можно наглядно понять что не выполняется. Причем это условие задается через define т.к.
C++:
#else
void clockRoutine() {
  return;
}
#endif
Писал специально подробно, показывая, что ничего сложного в раскопках кода нет, может кому пригодиться как урок

а вот похоже и разгадка:
#define MCU_TYPE 2 // микроконтроллер:
это из основного файла, а далее в тексте
C++:
#if (MCU_TYPE == 0 || MCU_TYPE == 1)
    DateTime now = rtc.now();
    secs = now.second();
    mins = now.minute();
    hrs = now.hour();
#endif