Сигнализация Arduino Zero RTC не работает в цикле
Используя ATSAMD21 с ядром Arduino, я столкнулся с проблемой, когда обратный вызов сигнала тревоги RTCZero не продолжает выполнять функцию loop(). Если я запланирую еще один будильник внутри обратного вызова, второй будильник выполнит функцию loop() после выполнения обратного вызова. Каждый второй раз это работает, каждый второй раз - нет.
Минимальный пример, в котором я ожидаю, что светодиод будет менять состояние каждые 2 секунды, чего не происходит:
#include <RTCZero.h>
#include <time.h>
RTCZero rtc;
void setup()
{
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);
rtc.begin();
rtc.attachInterrupt(alarmMatch);
schedule_wake_up();
rtc.enableAlarm(rtc.MATCH_HHMMSS);
}
void loop()
{
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
schedule_wake_up();
rtc.standbyMode(); // Спим до следующего совпадения будильника
}
void schedule_wake_up() {
time_t wakeupTimestamp = rtc.getEpoch();
wakeupTimestamp += 2;
struct tm *wakeupTimeStruct = gmtime(&wakeupTimestamp);
rtc.setAlarmSeconds( wakeupTimeStruct->tm_sec );
rtc.setAlarmMinutes( wakeupTimeStruct->tm_min );
rtc.setAlarmHours( wakeupTimeStruct->tm_hour );
}
void alarmMatch()
{
// Ничего не делать, просто проснуться
}
- IDE для Arduino 1.8.9
- RTCZero, версия 1.6.0
- Испробовано ядро SAMD версии 1.8.4 и 1.6.20
@JPM, 👍0
1 ответ
Лучший ответ:
В итоге я удалил свою копию RTCZero и установил новую через диспетчер библиотек Arduino IDE. Это решило проблему.
Разница между моей локальной копией и вышестоящей копией заключается в функции standbyMode(). У меня был следующий PR, объединенный с моей локальной копией этой функции: https://github.com/arduino-libraries/RTCZero/pull/46/files
После того, как я установил чистую копию, я пошел и заменил содержимое функции standbyMode() следующим: https://github.com/arduino-libraries/ArduinoLowPower/blob/ 892594adbccf45b198fc067ea994048c76523936/src/samd/ArduinoLowPower.cpp#L18
- Высокочастотный PWM на Adafruit Feather M0
- Несколько записей variant.cpp для одного и того же физического контакта
- Проблемы загрузки нулевого загрузчика arduino в atsamd21g18a
- Связывание загрузчика Arduino В Atmel Studio
- Достижение низкой мощности с Seeeduino Cortex-M0+ работает от батареи 12V
- Проблемы с подключением к точке доступа WiFi101
- Перевод платы на базе samd в спящий режим
- Преобразование в Unix Timestamp и обратно