esp32-mycropython-ide
This commit is contained in:
+149
@@ -0,0 +1,149 @@
|
|||||||
|
import time
|
||||||
|
import machine
|
||||||
|
import network
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# CONFIG
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
CONFIG = {
|
||||||
|
# Wi-Fi du poste de test
|
||||||
|
"WIFI_SSID": "",
|
||||||
|
"WIFI_PASSWORD": "",
|
||||||
|
|
||||||
|
# Identité de dispositif (doit exister côté backend)
|
||||||
|
"DEVICE_ID": "esp32-01",
|
||||||
|
"DEVICE_SECRET": "demo-secret-esp32-01",
|
||||||
|
|
||||||
|
"BACKEND_URL": "",
|
||||||
|
|
||||||
|
# Capteur
|
||||||
|
"LDR_GPIO": 34,
|
||||||
|
|
||||||
|
# Test sans envoi : True affiche le payload, n'envoie rien
|
||||||
|
"DRY_RUN": False,
|
||||||
|
|
||||||
|
# Rythme d'envoi en secondes
|
||||||
|
"SEND_INTERVAL": 3,
|
||||||
|
}
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Lecture capteur (LDR sur GPIO34)
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
def read_ldr():
|
||||||
|
"""Retourne la valeur brute de la LDR (0..4095, ADC 12 bits)."""
|
||||||
|
pin = machine.Pin(CONFIG["LDR_GPIO"], machine.Pin.IN)
|
||||||
|
adc = machine.ADC(pin)
|
||||||
|
return adc.read_u16() >> 4
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Payload JSON minimal
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
def build_payload(raw_value):
|
||||||
|
"""Timestamp ISO local au format de base (MicroPython n'a pas datetime)."""
|
||||||
|
y, m, d, hh, mm, ss, _, _ = time.localtime()
|
||||||
|
ts = "{:04d}-{:02d}-{:02d}T{:02d}:{:02d}:{:02d}".format(y, m, d, hh, mm, ss)
|
||||||
|
return {
|
||||||
|
"device_id": CONFIG["DEVICE_ID"],
|
||||||
|
"timestamp": ts,
|
||||||
|
"light_value": int(raw_value),
|
||||||
|
}
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Envoi HTTP/HTTPS
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
def send_measure(payload):
|
||||||
|
import urequests # fourni par la plupart des firmwares MicroPython
|
||||||
|
|
||||||
|
headers = {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
"X-Device-ID": CONFIG["DEVICE_ID"],
|
||||||
|
"X-Device-Secret": CONFIG["DEVICE_SECRET"],
|
||||||
|
}
|
||||||
|
try:
|
||||||
|
resp = urequests.post(CONFIG["BACKEND_URL"], json=payload, headers=headers)
|
||||||
|
status = resp.status_code
|
||||||
|
resp.close()
|
||||||
|
print("[send] device={} status={} ok={}".format(
|
||||||
|
CONFIG["DEVICE_ID"], status, 200 <= status < 300))
|
||||||
|
return status, (200 <= status < 300)
|
||||||
|
except OSError as exc:
|
||||||
|
# Erreur réseau : le errno aide à comprendre (voir debug ci-dessous).
|
||||||
|
errno = exc.args[0] if exc.args else None
|
||||||
|
print("[http] OSError envoi (device={}) errno={}".format(
|
||||||
|
CONFIG["DEVICE_ID"], errno))
|
||||||
|
_print_debug_network()
|
||||||
|
_print_debug_url()
|
||||||
|
return None, False
|
||||||
|
except Exception as exc:
|
||||||
|
print("[http] erreur envoi (device={}) : {}".format(
|
||||||
|
CONFIG["DEVICE_ID"], type(exc).__name__))
|
||||||
|
return None, False
|
||||||
|
|
||||||
|
def _print_debug_network():
|
||||||
|
"""Affiche l'IP que l'ESP32 a reçue + l'état Wi-Fi (debug)."""
|
||||||
|
try:
|
||||||
|
import network
|
||||||
|
wlan = network.WLAN(network.STA_IF)
|
||||||
|
if wlan.isconnected():
|
||||||
|
ip = wlan.ifconfig()[0]
|
||||||
|
print("[http] IP locale de l'ESP32 :", ip)
|
||||||
|
else:
|
||||||
|
print("[http] Wi-Fi NON connecté — l'envoi ne peut pas aboutir")
|
||||||
|
except Exception:
|
||||||
|
print("[http] état Wi-Fi indisponible")
|
||||||
|
|
||||||
|
|
||||||
|
def _print_debug_url():
|
||||||
|
"""Affiche la cible et aide à diagnostiquer l'OSError."""
|
||||||
|
url = CONFIG["BACKEND_URL"]
|
||||||
|
print("[http] URL cible :", url)
|
||||||
|
print("[http] Astuces :")
|
||||||
|
print("[http] - OSError negatif (~ -2 / -202) -> probleme DNS : "
|
||||||
|
"preferer une IP (192.168.x.y) a un nom d'hote")
|
||||||
|
print("[http] - errno ~ -3 / 111 (refus) -> backend injoignable : "
|
||||||
|
"verifier IP/port du PC, backend sur 0.0.0.0, firewall")
|
||||||
|
print("[http] - Rappel : 127.0.0.1 = l'ESP32 lui-meme, pas votre PC")
|
||||||
|
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Wi-Fi
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
def connect_wifi():
|
||||||
|
if not CONFIG["WIFI_SSID"]:
|
||||||
|
print("[wifi] SSID vide, on continue en local")
|
||||||
|
return False
|
||||||
|
wlan = network.WLAN(network.STA_IF)
|
||||||
|
wlan.active(True)
|
||||||
|
if not wlan.isconnected():
|
||||||
|
wlan.connect(CONFIG["WIFI_SSID"], CONFIG["WIFI_PASSWORD"])
|
||||||
|
for _ in range(20):
|
||||||
|
if wlan.isconnected():
|
||||||
|
break
|
||||||
|
time.sleep(0.5)
|
||||||
|
if wlan.isconnected():
|
||||||
|
print("[wifi] connecté, IP :", wlan.ifconfig()[0])
|
||||||
|
else:
|
||||||
|
print("[wifi] échec de connexion")
|
||||||
|
return wlan.isconnected()
|
||||||
|
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Boucle principale
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
def main():
|
||||||
|
connect_wifi()
|
||||||
|
|
||||||
|
if CONFIG["DRY_RUN"]:
|
||||||
|
print("[dry-run] payload :", build_payload(read_ldr()))
|
||||||
|
return
|
||||||
|
|
||||||
|
while True:
|
||||||
|
raw = read_ldr()
|
||||||
|
payload = build_payload(raw)
|
||||||
|
send_measure(payload)
|
||||||
|
time.sleep(CONFIG["SEND_INTERVAL"])
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
|
|
||||||
Reference in New Issue
Block a user