Прошу помощи в вычислении момента времени

В этом скетче к текущему моменту времени добавляется 10 секунд (пока).
Существуют ли такие библиотеки, чтобы к текущему моменту добавлять любой временной отрезок (не только секунды) без подобных танцев?
Спасибо!

Спойлер
#include "iarduino_RTC.h"

// Подключение часов DS1302
#define CLK 8
#define DAT 9
#define RST 10
iarduino_RTC time (RTC_DS1302, RST, CLK, DAT);

struct tm // структура для работы с датой/временем
{
  byte sec, minut, hour, day, mes, year;
};

tm getpoint; // текущий момент времени
tm modipoint; // модифицированный момент времени

byte arraym[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // количество дней в месяцах

void setup() {
  Serial.begin(9600);
  time.begin();
  get_time2(getpoint); // текущее время с DS1302
  modipoint = getpoint; // приготовить структуру modipoint к модификации
  addsec2(modipoint); // добавить 10 секунд
  out_time2(getpoint); // вывод исходного времени
  out_time2(modipoint); // вывод модифицированного времени
}

void loop()
{
}

void get_time2(tm &tmr)
{
  time.gettime();
  tmr.hour = time.Hours;
  tmr.minut = time.minutes;
  tmr.sec = time.seconds;
  tmr.day = time.day;
  tmr.mes = time.month;
  tmr.year = time.year;
}
void addsec2(tm &tma)
{
  time.gettime();
  tma.hour = time.Hours;
  tma.minut = time.minutes;
  tma.sec = time.seconds;
  tma.day = time.day;
  tma.mes = time.month;
  tma.year = time.year;
  tma.sec += 10;
  if (tma.sec > 59)
  {
    tma.sec -= 60;
    tma.minut++;
  }
  if (tma.minut > 59)
  {
    tma.minut -= 60;
    tma.hour++;
  }
  if (tma.hour > 23)
  {
    tma.hour -= 24;
    tma.day++;
  }
  if (tma.year % 4 == 0) arraym[2] = 29;
  else arraym[2] = 28;
  if (tma.day > arraym[tma.mes])
  {
    tma.day -= arraym[tma.mes];
    tma.mes++;
  }
  if (tma.mes > 12)
  {
    tma.mes -= 12;
    tma.year++;
  }
}
void out_time2(tm tmout)
{
  String toport = String(tmout.hour);
  toport += " ";
  toport += String(tmout.minut);
  toport += " ";
  toport += String(tmout.sec);
  toport += " ";
  toport += String(tmout.day);
  toport += " ";
  toport += String(tmout.mes);
  toport += " ";
  toport += String(tmout.year);
  Serial.println(toport);
}

#include <time.h>

1 лайк

Подключил эту библиотеку. Появились ошибки в строках 7 и 9: переопределение…

Ошибки исправил. Разбираюсь дальше.

ты просто открой time.h посмотри какие функции в ей есть и разберись, для чего они нужны. Потом выкинь нахрен всё, что у тебя написано и напиши своё, используя то, что ты почерпнул из time.h

А шоб не скучно было, почитай

1 лайк

Волшебные слова unix time. Если их освоишь любые работы со временем сведутся к сложению - вычитанию-сравнению двух чисел.

1 лайк

Это и изучаю между работой.

Библиотеку time.h за короткое время осилить так и не смог. Но желаемый результат получил другим методом.

Спойлер
#include <TimeLib.h>

time_t t;
TimeElements tm;

void setup()
{
  Serial.begin(9600);
  // Установка: 11-01-2025 22-14-30
  tm.Day = 11; 
  tm.Month = 1;
  tm.Year = 2025 - 1970;
  tm.Hour = 22;
  tm.Minute = 14;
  tm.Second = 30;

  t = makeTime(tm);

  t += 50 * 60 + 1; // к установленному моменту добавляется 50 минут 1 секунда

  // получается то, что ожидалось: 11-01-2025 23-04-31
  Serial.println(day(t));
  Serial.println(month(t));
  Serial.println(year(t));
  Serial.println(hour(t));
  Serial.println(minute(t));
  Serial.println(second(t));
}

void loop()
{
}

Может это тебе поможет разобраться:
Unix time - это количество секунд, прошедших с 1 января 1970 (00:00:00) года до текущей даты и времени. И всего-то…

1 лайк

Это мне известно давно. Я даже могу посчитать это количество секунд до текущего момента. Причем, если бы я занялся таким подсчетом, то учитывал, что календарь повторяется каждые 28 лет, чо невисокосный год каким днем недели начинается, таким и заканчивается. И т. д.
Я сейчас не знаю, как с этим работать:

Struct tm *p;

как с простым uint32_t.

1 лайк

Не знаю как работать с указателем на структуру.

Посмотри пример unixtime - Wokwi ESP32, STM32, Arduino Simulator (не мой).
Если заменить 23 строку на
stamp.getDateTime(unix+10);
то будет как раз время (12 стока) +10 секунд.

1 лайк