sommeil-every.ino

Arduino Nano Every · Archivo : sommeil-every.ino · Lenguaje : Arduino · Uso : Veille et réveil minute sur le 4809

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
}

← Volver a la ficha