import network
import urequests
import utime
from machine import Pin, ADC

# Configuration du Wi-Fi
WIFI_SSID = "Wokwi-GUEST"  # Nom du réseau Wi-Fi (modifié si nécessaire)
WIFI_PASSWORD = ""  # Mot de passe vide pour le réseau invité de Wokwi

# Configuration de ThingSpeak
THINGSPEAK_API_KEY = "M6DUD31GPWYE1YT7"  # Remplacez par votre propre clé API
THINGSPEAK_URL = f"https://api.thingspeak.com/update?api_key={THINGSPEAK_API_KEY}"

# Configuration du potentiomètre
potentiometer = ADC(Pin(34))  # Broche GPIO34 pour l'entrée analogique
potentiometer.atten(ADC.ATTN_11DB)  # Plage de mesure 0-3.3V
potentiometer.width(ADC.WIDTH_12BIT)  # Résolution de 12 bits (0-4095)

# Paramètres
VCC = 220  # Tension fixe en volts
MAX_CONSUMPTION = 200  # Consommation maximale simulée en watts
CONSUMPTION_THRESHOLD = 150  # Seuil de consommation pour l'alerte (en watts)

# Fonction pour se connecter au Wi-Fi
def connect_to_wifi():
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    wlan.connect(WIFI_SSID, WIFI_PASSWORD)
    
    print("Connexion au Wi-Fi en cours...")
    while not wlan.isconnected():
        utime.sleep(1)
    print("Connecté au Wi-Fi!")
    print("Adresse IP:", wlan.ifconfig()[0])

# Fonction pour obtenir la puissance depuis le potentiomètre
def get_power_from_potentiometer():
    analog_value = potentiometer.read()  # Lire la valeur analogique (0-4095)
    power = (analog_value / 4095.0) * MAX_CONSUMPTION  # Calcul de la puissance
    return power

# Fonction pour envoyer les données à ThingSpeak
def send_to_thingspeak(power, total_energy, alert):
    try:
        # Construire l'URL avec les données à envoyer
        url = f"{THINGSPEAK_URL}&field1={power:.2f}&field2={total_energy:.4f}&field3={alert}"

        # Envoyer la requête GET avec l'URL construite
        response = urequests.get(url)
        
        # Afficher la réponse de ThingSpeak
        print("Données envoyées à ThingSpeak:", response.text)
        
        # Fermer la réponse pour libérer la ressource
        response.close()
        
    except Exception as e:
        print("Erreur lors de l'envoi à ThingSpeak:", e)

# Fonction principale
def main():
    total_energy = 0  # Énergie totale initiale
    elapsed_time = 0  # Temps écoulé en secondes
    alert = 0  # Alerte initiale (pas d'alerte)

    # Connexion au Wi-Fi
    connect_to_wifi()

    # Boucle infinie pour mesurer et envoyer les données en temps réel
    while True:
        # Obtenir la puissance actuelle
        power = get_power_from_potentiometer()

        # Calculer l'énergie consommée (en Wh)
        time_interval = 1 / 3600  # 1 seconde en heures (pour une mesure horaire)
        total_energy += power * time_interval

        # Vérifier si la consommation dépasse le seuil
        if power > CONSUMPTION_THRESHOLD:
            alert = 1  # Alerte activée si consommation dépasse le seuil
            print(f"Alerte : Consommation élevée détectée! ({power:.2f} W)")
        else:
            alert = 0  # Alerte désactivée si consommation est sous le seuil

        # Afficher les données dans la console
        print(f"Puissance : {power:.2f} W | Énergie totale : {total_energy:.4f} Wh | Alerte : {alert}")

        # Envoi des données à ThingSpeak
        send_to_thingspeak(power, total_energy, alert)

        # Pause d'une seconde (simulation en temps réel)
        utime.sleep(10)
        elapsed_time += 1

# Lancer le programme
main()