Используется библиотека RTClib.h часы RTC 1307
Ответ искал, не нашел и сделал сам.
Все работает, только время надо вручную устанавливать.
Код
#include "RTClib.h"
RTC_DS1307 rtc;
void setup () {
Serial.begin(9600);
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
Serial.flush();
while (1) delay(10);
}
//установка даты и вр. с ПК
if (! rtc.isrunning()) {
Serial.println("RTC is NOT running, let's set the time!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
}
void loop () {
//запуск
DateTime now = rtc.now();
uint32_t startTime = 1714551312; //Стартовое время, ручная установка
uint32_t nowTime = now.unixtime(); //Время сейчас
uint32_t passedTime = nowTime - startTime;//разница
//форматирование
byte sec = passedTime % 60;
byte minutes = (passedTime % 3600)/60;
byte hour = passedTime / 3600;
byte day = passedTime / 86400;
//вывод для отладки
Serial.print("стартовое время: ");
Serial.println(startTime);
Serial.print("сейчас: ");
Serial.println(nowTime);
Serial.print ("вычисленная разница: ");
Serial.println(passedTime);
Serial.print ("сек: ");
Serial.println(sec);
Serial.print ("мин: ");
Serial.println(minutes);
Serial.print ("ч: ");
Serial.println(hour);
Serial.print ("д: ");
Serial.println(day);
Serial.println();
delay(3000);
}
Как автоматически установить время в startTime ?
Что пробовал не работает. Ошибка или перезаписывает.
Вопрос не по теме, у кого есть 328PB. Нормально что у нее отваливается порт… или такие зависания… Это чисто с IDE или в реальной работе так же может зависнуть?
Нам не ведомо, что вы пробовали, и почему оно не работает. Так же не понятно, что такое стартовое время? Если это время включения вашего девайса, то самый простой способ
static uint32_t startTime = rtc.now().unixtime(); // Время включения устройства
Время примерное, что бы знать сколько дней прошло.
Изначально использовал внутренний таймер.
Точнее 3 для коротких циклов до 15 минут
и один как счетчик дней. После 15-20 дней,
МК мог просто зависнуть. Решил попробовать RTC.
Таймер от alexgyver
unsigned long my_timer;
void setup() {
my_timer = millis(); // "сбросить" таймер
}
void loop() {
if (millis() - my_timer >= period_time) {
my_timer = millis(); // "сбросить" таймер
// дейтвия, которые хотим выполнить один раз за период
}
}
Вся проблема, что МК зависает и не пытается перезагрузиться.
Искал решение через сторожевую собаку, тоже
ничего рабочего не нашлось. Наверное с таймерами,
вообще по хорошему избраться от переменных.
Погрешность 1307 5 сек. в день + на старте загрузки еще несколько)
Перепрошивка загрузчика, это уже через программатор?
Особо не питай, я только начал познавать
Никогда не размещайте два вопроса в одной теме, это путь к болтовне ни о чём.
Так вот именно эту проблему и надо решать и, скорее всего, со временем она никак не связана. Вы же пытаетесь не решить проблему, а замаскировать её (через собаку, или ещё как).
А для решения этой проблемы надо смотреть на скетч целиком.
Сколько времени прошло с момента чего?
Если с момента выключения, то раньше пользовался “марксистко ленинской идеей” - ежесекундно сохранять текущее время. Затем, при включении видел это время выключения… И, соответственно, вычислял сколько времени прошло.
Первое на что грешу, это библиотека oled по i2c…
экран сильно загружал, что энкодер не всегда срабатывал.
И последнее, что там были таймеры.
Спасибо за отклик и наставления.
Спасибо за отклик, вопрос решился через static.
Сохранять в память каждую секунду, это зло)
Каждых 15 минут еще пойдет. В моем случаи
все на много проще, достаточно запомнить один раз.