sommeil-every.ino
El 4809 lleva una RTC pilotada por el reloj de 32 kHz: este sketch la usa como alarma de minuto y duerme el núcleo en modo idle entre despertares. El LED parpadea cada minuto, probando que el despertar funciona mientras la CPU ya no gira.
Hardware
Un Arduino Nano Every (ATmega4809 a 20 MHz, mismo formato que el Nano, USB micro-B, chip UART separado, pines de 5 V, compatibilidad directa con el Nano clásico). Nano Every sola; la RTC y su reloj de 32 kHz son internos del chip.
Cableado
Sin cableado; el LED_BUILTIN (pin 13) sirve de testigo visual del despertar.
Funcionamiento
La RTC del core megaAVR (clase RTCzero) genera una interrupción de hardware en cada alarma; la instrucción sleep deja el núcleo en idle, despertado al instante por la IRQ.
Ejecución
Instala el paquete Arduino megaAVR Boards en el IDE, selecciona Arduino Nano Every y carga. El Serial USB está separado del Serial1 de hardware (pines RX/TX): el código serie clásico funciona tal cual.
Variantes
Pásate a SLEEP_MODE_STANDBY para más ahorro (la RAM se conserva) o despierta también con botón vía interrupción de PORT.
sommeil-every.ino
// Sommeil idle/standby sur le Nano Every avec reveil par RTC interne.
// Le core megaAVR expose une RTC 32 bits : on l'utilise comme reveil.
#include <RTC.h>
RTCzero rtc; // nom de classe du core megaAVR pour la RTC 4809
volatile bool minute = false;
void onMinute() { minute = true; }
void setup() {
Serial.begin(9600);
rtc.begin();
// reveil toutes les minutes pile (MATCH_SS = secondes)
rtc.setAlarmEvery(60);
rtc.enableAlarm(rtc.MATCH_SS);
rtc.attachInterrupt(onMinute);
pinMode(LED_BUILTIN, OUTPUT);
Serial.println(F("Endormi, reveil chaque minute"));
}
void loop() {
if (minute) {
minute = false;
digitalWrite(LED_BUILTIN, HIGH); // temoin de reveil
Serial.print(F("Reveil a "));
Serial.print(rtc.getHours()); Serial.print(':');
Serial.print(rtc.getMinutes()); Serial.print(':');
Serial.println(rtc.getSeconds());
digitalWrite(LED_BUILTIN, LOW);
}
// idle() economise sans perdre la RTC ni l'USB
// (le 4809 garde l'horloge 32 kHz pour la RTC)
asm("sleep"); // mode idle : reveil immediat sur interruption
}