Неверно построенное значение DateTime

Я работаю над проектом будильника, используя Arduino Nano (v 3.0, клон) и модуль RTC ZS-042 (содержащий DS3231 и EEPROM AT24C32).

Цель состоит в том, чтобы загрузить часы и минуты из EEPROM при запуске, использовать текущую дату (чтобы избежать проблем с нулевой датой) и составить объект DateTime, чтобы использовать объект TimeSpan, что упрощает вычисления времени, чем использование простой целочисленной математики. Проблема в том, что значение в объекте DateTime построено неправильно, хотя все компоненты, используемые для его построения, кажутся нормальными.

Со следующим кодом

/* Аппаратные определения */
//RTC using I2C, pins 4,5
#include <Wire.h> 
#include <RTClib.h>
RTC_DS3231 rtc;

#include <extEEPROM.h>
extEEPROM e2p(kbits_32, 1, 32, 0x57);

DateTime  alarm1Time;

void setup(){
  Wire.begin(); 
  rtc.begin();
  Serial.begin(115200);
  uint8_t e2pStatus = e2p.begin(extEEPROM::twiClock400kHz);      //go fast!
  DateTime t = rtc.now(); //get current time from RTC
  Serial.print("t.year: ");  Serial.print(t.year());
  Serial.print(" t.month: ");  Serial.print(t.month());
  Serial.print(" t.day: ");  Serial.println(t.day());
  alarm1Time = (t.year(),t.month(),t.day(),e2p.read(1),e2p.read(2),0);
  Serial.print("E2P : ");
  Serial.print(e2p.read(1));
  Serial.print(":");
  Serial.println(e2p.read(2));
  char buf1[] = "YYMMDD-hh:mm:ss";
  Serial.println(alarm1Time.toString(buf1));  
}

Я получаю на последовательном мониторе следующее:

t.year: 2021 t.month: 1 t.day: 31
E2P : 7:15
060206-06:28:16

Компоненты даты (год, месяц, дата) соответствуют текущей дате. Поскольку байты на адресах 1 и 2 в EEPROM читают 7 и 15, я ожидаю, что Alarm1Time будет 2021-01-31, 07:15, а это не так. Выход является постоянным, независимо от текущей даты и времени хранения EEPROM. Позже в моем коде alarm1Time разбирается на 6 часов и 28 минут в соответствии с последней строкой вывода последовательного монитора.

Что может быть (или лучше - где я ошибаюсь) неправильно? Спасибо.

Используемые библиотеки:

RTClib (https://github.com/adafruit/RTClib)

extEEPROM (https://github.com/JChristensen/extEEPROM/blob/master/extEEPROM.h)

, 👍1


1 ответ


1

Здесь:

alarm1Time = (t.year(),t.month(),t.day(),e2p.read(1),e2p.read(2),0);

вы неоднократно используете оператор запятой, что по сути означает “отбросить все значения, кроме последнего”. Если вы хотите вызвать конструктор DateTime, который принимает эти аргументы, вы должны вызвать его явно:

alarm1Time = DateTime(t.year(),t.month(),t.day(),e2p.read(1),e2p.read(2),0);

или, что еще лучше, вы можете объявить и инициализировать alarm1Time одновременно :

DateTime alarm1Time(t.year(),t.month(),t.day(),e2p.read(1),e2p.read(2),0);
,

Вы абсолютно правы, я неправильно использую конструктор. Неужели я так глупа или так устала? Хммм. Вероятно, это потому, что я новичок в C++ после многих лет использования других языков. Что касается объявления и инициализации сразу - мне нужно объявить его глобальным, а не с помощью setup(), иначе я бы сделал это так, как вы предлагаете. Спасибо., @murphy