RTC, сколько времени прошло, как реализовать?

Используется библиотека 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 или в реальной работе так же может зависнуть?

Сейчас используется вот такой конфиг загрузчика, что бесит… Надо отключать постоянно монитор порта.


на обычных 328p такого нет…
Прошивается пока только так… через minicore не хочет.

Ошибка при попытки прошить через miniCore


конфиг

Там изначально китаец залил другой загрузчик и чип(загрузчик) претворяется 328P … надо перешить загрузчик на minicorовский

1 лайк

Для точного времени - нужен его источник ака интернет, gps … …

1 лайк

Нам не ведомо, что вы пробовали, и почему оно не работает. Так же не понятно, что такое стартовое время? Если это время включения вашего девайса, то самый простой способ

static uint32_t startTime = rtc.now().unixtime(); // Время включения устройства
1 лайк

Время примерное, что бы знать сколько дней прошло.
Изначально использовал внутренний таймер.
Точнее 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 сек. в день + на старте загрузки еще несколько)

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

Никогда не размещайте два вопроса в одной теме, это путь к болтовне ни о чём.

Так вот именно эту проблему и надо решать и, скорее всего, со временем она никак не связана. Вы же пытаетесь не решить проблему, а замаскировать её (через собаку, или ещё как).

А для решения этой проблемы надо смотреть на скетч целиком.

1 лайк

Пробовал так, не помогло.

const uint32_t startTime = rtc.now().unixtime(); 

static работает как надо. Неописуемое спасибо, почему так происходит?
По идее const записывает один раз… но не в этом случаи.
static справился.

Непонятно по какой именно “идеи” – марскистко-ленинской? Или по идее чучхэ? Не знаю, где Вы таких идей набрались :slight_smile:

1 лайк

Сколько времени прошло с момента чего?
Если с момента выключения, то раньше пользовался “марксистко ленинской идеей” - ежесекундно сохранять текущее время. Затем, при включении видел это время выключения… И, соответственно, вычислял сколько времени прошло.

1 лайк

Понимаю, что не правильно, спонтанно как-то возникло.
Там было подключено 3 библиотеки и 5 таймеров

// экран
#include <GyverOLED.h>
GyverOLED<SSD1306_128x32, OLED_NO_BUFFER> oled;

// энкодер
#include <EncButton.h>
EncButton<EB_TICK, 4, 5, 6> enc; 

// датчик температуры и влажности
#include <Thinary_AHT10.h>
AHT10Class AHT10;


// таймеры
uint32_t tmr, tmr2, tmr3, tmr4, tmr5;

Первое на что грешу, это библиотека oled по i2c…
экран сильно загружал, что энкодер не всегда срабатывал.
И последнее, что там были таймеры.
Спасибо за отклик и наставления.

Спасибо за отклик, вопрос решился через static.
Сохранять в память каждую секунду, это зло)
Каждых 15 минут еще пойдет. В моем случаи
все на много проще, достаточно запомнить один раз.

Вы, главное, для себя решите свой вопрос. Своими словами. Что бы себе всё было понятно. А нет - тогда уже и другим пудрите мОзги! А не наоборот.)

Что за шиза?

Это впечатлительность. “Нельзя писать часто!”