wifi_bridge.py

Arduino MKR WiFi 1010 · Fichier : wifi_bridge.py · Langage : Python · Usage : Relayer les mesures série de la carte vers un serveur

Quand le WiFi embarqué est en défaut, le port série de la MKR WiFi 1010 devient le plan B : ce pont Python lit les lignes clé:valeur et les poste en JSON vers n'importe quel collecteur. Un PC branché en USB suffit à continuer la collecte pendant le diagnostic radio.

Matériel requis

Une Arduino MKR WiFi 1010 (microcontrôleur SAMD21, module Wi-Fi WINC1500, pas de Bluetooth, alimentation USB ou LiPo sur J6). PC avec Python 3, pyserial et requests, câble USB vers la carte émettant des lignes sur Serial.

Câblage

Un câble micro-USB ; le croquis carte doit simplement imprimer des lignes au format capteur:valeur.

Fonctionnement

La boucle for sur le port série itère ligne à ligne ; partition sépare clé et valeur, puis requests.post envoie un JSON minimal. Les erreurs de connexion sont journalisées sans interrompre la lecture.

Exécution

Installez Arduino SAMD Boards et la bibliothèque WiFi101, sélectionnez la carte, téléversez. Le Wi-Fi fonctionne en 2,4 GHz uniquement : vérifiez que votre point d'accès n'est pas en 5 GHz seul.

Variantes

Ajoutez une file locale (fichier JSONL) pour ne rien perdre pendant les pannes serveur, ou remplacez requests par paho-mqtt pour du MQTT.

wifi_bridge.py

#!/usr/bin/env python3
"""Relais serie -> HTTP pour une MKR WiFi 1010 en mode fallback.

Si le WiFi de la carte est capricieux, son port serie devient le
reseau de secours : chaque ligne "cle:valeur" est POSTee en JSON.
Usage : python wifi_bridge.py [port] [url]
"""
import json
import sys

import requests
import serial

PORT = sys.argv[1] if len(sys.argv) > 1 else "/dev/ttyACM0"
URL = sys.argv[2] if len(sys.argv) > 2 else "http://127.0.0.1:5000/mesures"


def main() -> int:
    with serial.Serial(PORT, 9600, timeout=1) as carte:
        print(f"Relais {PORT} -> {URL}")
        for ligne in carte:
            l = ligne.decode(errors="replace").strip()
            if ":" not in l:
                continue
            cle, _, valeur = l.partition(":")
            try:
                requests.post(URL, json={cle: valeur}, timeout=5)
            except requests.ConnectionError:
                print("serveur injoignable, ligne perdue:", l)
    return 0


if __name__ == "__main__":
    sys.exit(main())

← Retour à la fiche