Неверно построенное значение 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)
@murphy, 👍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);
- Не удалось выделить SSD1306 при добавлении константы
- Ошибка модуля часов реального Времени-DS3231
- Программа Arduino, использующая i2c, перестает работать после нескольких раз печати на OLED
- TimeAlarms перестает работать при использовании setSyncProvider(RTC.get) DS1307
- Проблема понимания того, как запрограммировать DS3231 RTC
- Проблема с SD-картой Arduino RTC
- Помогите в личном проекте будильника, не могу записать время на семисегментный дисплей
- Звук перестает воспроизводиться после подключения rtc
Вы абсолютно правы, я неправильно использую конструктор. Неужели я так глупа или так устала? Хммм. Вероятно, это потому, что я новичок в C++ после многих лет использования других языков. Что касается объявления и инициализации сразу - мне нужно объявить его глобальным, а не с помощью setup(), иначе я бы сделал это так, как вы предлагаете. Спасибо., @murphy