sommeil-every.ino
Le 4809 embarque une RTC pilotée par l'horloge 32 kHz : ce croquis l'utilise comme alarme minute et endort le cœur en mode idle entre deux réveils. La LED cligne à chaque minute, prouvant que le réveil fonctionne alors que le CPU ne tourne plus.
Matériel requis
Un Arduino Nano Every (ATmega4809 à 20 MHz, brochage identique au Nano, USB micro-B, convertisseur UART séparé, broches 5 V, pile de compatibilité avec le Nano classique). Nano Every seule ; la RTC et son horloge 32 kHz sont internes à la puce.
Câblage
Aucun câblage ; la LED_BUILTIN (broche 13) sert de témoin visuel du réveil.
Fonctionnement
La RTC du core megaAVR (classe RTCzero) génère une interruption matérielle à chaque alarme ; l'instruction sleep place le cœur en idle, réveillé aussitôt par l'IRQ.
Exécution
Installez le package Arduino megaAVR Boards dans l'IDE, sélectionnez Arduino Nano Every, téléversez. Le Serial USB est séparé du Serial1 matériel (broches RX/TX) : le code série classique fonctionne tel quel.
Variantes
Passez en SLEEP_MODE_STANDBY pour plus d'économie (l'RAM est conservée), ou réveillez aussi sur un bouton via PORT interrupt.
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
}