from machine import Pin, I2C, ADC
import dht
import time
import network
import json
import machine
from umqtt.simple import MQTTClient
# --- Configuration Réseau et MQTT ---
SSID = 'Wokwi-GUEST'
PASSWORD = ''
MQTT_BROKER = 'broker.emqx.io'
CLIENT_ID = 'esp32_hardware_soufiane'
TOPIC_TELEMETRY = b'soufiane/course/telemetrie'
# --- Configuration des Capteurs ---
# 1. Capteurs Numériques & I2C
sensor_temp_pneu = dht.DHT22(Pin(15))
i2c = I2C(0, scl=Pin(22), sda=Pin(21))
MPU6050_ADDR = 0x68
# 2. Capteurs Analogiques (Potentiomètres)
pot_vitesse = ADC(Pin(32))
pot_huile = ADC(Pin(33))
pot_moteur = ADC(Pin(34))
# Configuration de l'atténuation pour lire toute la plage de tension (0-3.3V)
pot_vitesse.atten(ADC.ATTN_11DB)
pot_huile.atten(ADC.ATTN_11DB)
pot_moteur.atten(ADC.ATTN_11DB)
def init_mpu():
try:
i2c.writeto_mem(MPU6050_ADDR, 0x6B, b'\x00')
except OSError:
pass
def connect_wifi():
print("Connexion au Wi-Fi...", end="")
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
sta_if.connect(SSID, PASSWORD)
while not sta_if.isconnected():
print(".", end="")
time.sleep(0.5)
print(" Connecté ! IP:", sta_if.ifconfig()[0])
init_mpu()
connect_wifi()
print("Connexion au Broker MQTT...")
client = MQTTClient(CLIENT_ID, MQTT_BROKER)
client.connect()
print("Connecté !")
# --- Variables d'état ---
compteur_inactivite = 0
en_veille = False
# --- Boucle Principale ---
while True:
try:
# On lit TOUJOURS la vitesse pour savoir si la moto bouge
vitesse = round((pot_vitesse.read() / 4095.0) * 300.0, 0)
# --- LOGIQUE D'OPTIMISATION ÉNERGÉTIQUE ---
if vitesse < 5: # La moto est à l'arrêt
compteur_inactivite += 1
else: # La moto roule
compteur_inactivite = 0
if en_veille:
print("🏍️ Mouvement détecté ! Réveil de l'ESP32...")
client.publish(TOPIC_TELEMETRY, json.dumps({"status": "online", "message": "Réveil"}))
en_veille = False # On sort de la veille
if compteur_inactivite > 5 and not en_veille:
print("⚠️ Moto à l'arrêt prolongé.")
print("🔋 Activation du mode DEEP SLEEP pour préserver la batterie...")
client.publish(TOPIC_TELEMETRY, json.dumps({"status": "offline", "message": "Deep Sleep"}))
en_veille = True # On active la veille virtuelle
# --- COMPORTEMENT EN VEILLE ---
if en_veille:
print("Zzz... ESP32 en veille (Augmentez la vitesse pour le réveiller)...")
time.sleep(2)
continue # On saute le reste de la boucle (économie d'énergie)
# --- LECTURE DES AUTRES CAPTEURS (Seulement si on n'est pas en veille) ---
sensor_temp_pneu.measure()
temp_pneu = sensor_temp_pneu.temperature()
accel_data = i2c.readfrom_mem(MPU6050_ADDR, 0x3B, 2)
accel_x = (accel_data[0] << 8 | accel_data[1])
if accel_x > 32767: accel_x -= 65536
force_g = round(accel_x / 16384.0, 2)
temp_huile = round(40.0 + (pot_huile.read() / 4095.0) * 110.0, 1)
temp_moteur = round(50.0 + (pot_moteur.read() / 4095.0) * 110.0, 1)
# --- ENVOI DES DONNÉES ---
payload = {
"vitesse_kmh": vitesse,
"force_g": force_g,
"temp_pneu": temp_pneu,
"temp_huile": temp_huile,
"temp_moteur": temp_moteur,
"timestamp": time.ticks_ms()
}
json_payload = json.dumps(payload)
client.publish(TOPIC_TELEMETRY, json_payload)
print(f"Hardware Data : {json_payload}")
except OSError as e:
print("Erreur réseau détectée :", e)
print("🔄 Tentative de reconnexion au Broker MQTT...")
try:
client.connect()
print("✅ Reconnexion réussie ! Reprise de la télémétrie.")
except Exception as reconnect_error:
print("Échec de la reconnexion :", reconnect_error)
except Exception as e:
print("Erreur inattendue :", e)
time.sleep(2)