logging_qspi.py
Les 2 Mo de flash QSPI exposés en système de fichiers font un enregistreur autonome : ce script journalise une mesure analogique en CSV toutes les 10 s, avec horodatage relatif. Le fichier se récupère ensuite en branchant la carte en USB.
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 seule ; un capteur 0-3,3 V sur A0 (ou rien : le canal flottant donne des valeurs de test). Un PC pour lire journal.csv ensuite.
Câblage
Capteur sur A0/3V3/GND selon sa fiche. La flash QSPI est interne à la carte — rien à câbler, et les écritures survivent à la coupure.
Fonctionnement
open("/journal.csv", "a") ajoute une ligne à chaque cycle ; CircuitPython écrit sur la partition CIRCUITPY en flash QSPI. time.monotonic donne des secondes relatives since boot, suffisant pour une courbe.
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
Horodater en absolu avec un module DS3231 (I2C), compresser en binaire pour gagner de la place, ou vider le journal vers un téléphone en BLE avant rotation.
logging_qspi.py
# Journal CSV sur la flash QSPI de 2 Mo (le système de fichiers).
# Les fichiers survivent à la coupure d'alimentation.
import time
import board
import analogio
import rtc
entree = analogio.AnalogIn(board.A0)
CHEMIN = "/journal.csv"
# Horloge interne : figée à minuit au boot, d'où le temps relatif.
t0 = time.monotonic()
with open(CHEMIN, "a") as f:
f.write("t_s,brut,volts\n") if False else None # en-tête optionnel
while True:
brut = entree.value
with open(CHEMIN, "a") as f:
f.write("%d,%d,%.3f\n" % (
time.monotonic() - t0, brut, brut * 3.3 / 65535))
time.sleep(10) # une ligne toutes les 10 s