sommeil-every.ino

Arduino Nano Every · Fichier : sommeil-every.ino · Langage : Arduino · Usage : Veille et réveil minute sur le 4809

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
}

← Retour à la fiche