import math
import random
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_simulateur_soufiane'
TOPIC_TELEMETRY = b'soufiane/course/telemetrie'
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])
connect_wifi()
print("Connexion au Broker MQTT EMQX...")
client = MQTTClient(CLIENT_ID, MQTT_BROKER)
client.connect()
print("Connecté au Broker !")
print("-" * 30)
# --- Variables de Simulation ---
t = 0 # Compteur de temps (simulation d'avancement sur le circuit)
temp_pneu_base = 40.0 # Le pneu démarre froid
# --- Variables d'état ---
compteur_inactivite = 0
en_veille = False
# --- Boucle Principale de Simulation ---
while True:
try:
# 1. Calcul de la Vitesse (Oscille entre 80 et 280 km/h avec un sinus)
vitesse = 180 + 100 * math.sin(t * 0.5) + random.uniform(-5, 5)
# --- 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)
# 2. Calcul des G (Forte force G en virage, quand la vitesse est basse)
force_g = abs(1.2 * math.cos(t * 0.5)) + random.uniform(0.0, 0.2)
# 3. Température du Pneu (Chauffe progressivement au fil des tours jusqu'à 95°C)
if temp_pneu_base < 95:
temp_pneu_base += 0.5
temperature_pneu = temp_pneu_base + random.uniform(-1, 1)
# 4. Températures Mécaniques (Dépendantes de la vitesse)
temperature_huile = 85 + (vitesse / 280) * 20 + random.uniform(-2, 2)
temperature_moteur = temperature_huile + 10 + random.uniform(-3, 3) # Le moteur est toujours un peu plus chaud que l'huile
# Création du format JSON enrichi
payload = {
"vitesse_kmh": round(vitesse, 0),
"force_g": round(force_g, 2),
"temp_pneu": round(temperature_pneu, 1),
"temp_huile": round(temperature_huile, 1),
"temp_moteur": round(temperature_moteur, 1),
"timestamp": time.ticks_ms()
}
json_payload = json.dumps(payload)
client.publish(TOPIC_TELEMETRY, json_payload)
print(f"Tour {t} : {json_payload}")
except Exception as e:
print("Erreur :", e)
t += 1 # On avance dans le temps
time.sleep(2) # Envoi toutes les 2 secondes