sommeil_alarme.py

Adafruit Feather nRF52840 Express · Archivo : sommeil_alarme.py · Lenguaje : Python · Uso : Réveil sur bouton après sommeil profond

El nRF52840 cae a microamperios en sueño profundo y una pulsación en D5 lo despierta vía PinAlarm. El script distingue despertar de arranque, hace su trabajo útil y se re-duerme: el patrón tras los sensores a pila que duran meses.

Hardware

Una Adafruit Feather nRF52840 Express (nRF52840, BLE 5) con NeoPixel, LED rojo, 2 MB de flash QSPI para CircuitPython y conector LiPo. La Feather con batería LiPo (conector JST) o pila; un botón en D5. Idealmente un medidor de consumo para verificar la corriente de reposo.

Cableado

Botón entre D5 y GND (pull=True de PinAlarm activa el pull-up interno). Batería en el conector JST de la Feather para la autonomía.

Funcionamiento

alarm.exit_and_deep_sleep_until_alarms corta todo salvo el comparador de pin; al despertar, alarm.past contiene la alarma disparada: el código la reconoce, actúa y se re-duerme. microcontroller sigue disponible para un reset.

Ejecución

CircuitPython (build feather_nrf52840_express) vía bootloader UF2 (doble reset); editar code.py en la unidad CIRCUITPY.

Variantes

Despertar periódicamente con TimeAlarm (NMEA), combinar PinAlarm + TimeAlarm, o lanzar una ráfaga BLE al despertar antes de re-dormir.

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)
)

← Volver a la ficha