sommeil_alarme.py

Adafruit Feather nRF52840 Express · Fichier : sommeil_alarme.py · Langage : Python · Usage : Réveil sur bouton après sommeil profond

Le nRF52840 descend en micro-ampères en deep sleep, et un appui sur D5 le réveille via PinAlarm. Le script distingue réveil et démarrage, fait son travail utile, puis se rendort — le patron des capteurs à pile qui durent des mois.

Matériel requis

Une Adafruit Feather nRF52840 Express (SoC nRF52840 Cortex-M4F, BLE 5 / 802.15.4) avec NeoPixel embarqué, LED rouge, 2 Mo de flash QSPI pour le système de fichiers CircuitPython et connecteur batterie LiPo. La Feather sur batterie LiPo (connecteur JST) ou pile ; un bouton sur D5. Idéalement un mesureur de consommation pour vérifier le courant de veille.

Câblage

Bouton entre D5 et GND (le pull=True de PinAlarm active le pull-up interne). Batterie sur le connecteur JST de la Feather pour l’autonomie.

Fonctionnement

alarm.exit_and_deep_sleep_until_alarms coupe tout sauf le comparateur de broche ; au réveil, alarm.past contient l’alarme déclenchée — le code la reconnaît, agit, puis se rendort. microcontroller reste dispo pour un reset.

Exécution

CircuitPython (build feather_nrf52840_express) installé via le bootloader UF2 (double reset) ; éditer code.py sur le lecteur CIRCUITPY, console dans Mu/Thonny.

Variantes

Réveiller périodiquement avec TimeAlarm (NMEA), combiner PinAlarm + TimeAlarm, ou envoyer une rafale BLE au réveil avant de se rendormir.

sommeil_alarme.py

# Sommeil profond jusqu'appui sur D5 (alarme sur broche).
# En deep sleep, seul le circuit d'alarme reste armé : micro-ampères.
import board
import digitalio
import time
import alarm
import microcontroller

bouton = digitalio.DigitalInOut(board.D5)
bouton.switch_to_input(pull=digitalio.Pull.UP)

# Réveillé par l'alarme broche ? (sinon : premier démarrage)
reveille = False
for a in alarm.past:
    if isinstance(a, alarm.PinAlarm):
        reveille = True
alarm.reset()

if reveille:
    # Réveil : faire le travail utile ici (mesure, envoi BLE...)
    led = digitalio.DigitalInOut(board.LED)
    led.direction = digitalio.Direction.OUTPUT
    led.value = True
    time.sleep(0.3)
    led.value = False

# Endormir jusqu'au prochain appui (D5 passe à l'état bas)
print("Endormissement...")
alarm.exit_and_deep_sleep_until_alarms(
    alarm.PinAlarm(pin=board.D5, value=False, pull=True)
)

← Retour à la fiche