Сигнализация Arduino Zero RTC не работает в цикле

rtc arduino-zero samd21g

Используя 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

, 👍0


1 ответ


Лучший ответ:

0

В итоге я удалил свою копию 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

,