wifi_bridge.py
Cuando el WiFi embarcado falla, el puerto serie de la MKR WiFi 1010 es el plan B: este puente Python lee líneas clave:valor y las envía como JSON a cualquier colector. Un PC por USB basta para seguir recogiendo durante el diagnóstico de radio.
Hardware
Una Arduino MKR WiFi 1010 (microcontrolador SAMD21, módulo Wi-Fi WINC1500, sin Bluetooth, alimentación USB o LiPo en J6). PC con Python 3, pyserial y requests, cable USB a la placa que imprime líneas en Serial.
Cableado
Un cable micro-USB; el sketch de la placa solo imprime líneas con formato sensor:valor.
Funcionamiento
El bucle for sobre el puerto serie itera línea a línea; partition separa clave y valor, y requests.post envía un JSON mínimo. Los errores de conexión se registran sin parar la lectura.
Ejecución
Instala Arduino SAMD Boards y la librería WiFi101, selecciona la placa y carga. El Wi-Fi funciona solo en 2,4 GHz: comprueba que tu punto de acceso no sea solo de 5 GHz.
Variantes
Añade una cola local (archivo JSONL) para no perder nada durante caídas del servidor, o sustituye requests por paho-mqtt para 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())