import network
import utime
from machine import Pin
from HC1SR04 import HCSR04
import urequests
import ujson

SSID = "Wokwi-GUEST"  # Nombre de la red Wi-Fi en Wokwi
PASSWORD = ""  # No requiere contraseña

# Conexión a la red Wi-Fi
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(SSID, PASSWORD)

# Esperar hasta que la conexión Wi-Fi sea exitosa
max_attempts = 10
attempt = 0
while not wlan.isconnected() and attempt < max_attempts:
    print(f"Conectando a WiFi... (Intento {attempt + 1})")
    utime.sleep(2)
    attempt += 1

if wlan.isconnected():
    print("Conectado a WiFi:", wlan.ifconfig())
else:
    print("No se pudo conectar a WiFi.")
    # Puedes decidir qué hacer si no se conecta
    raise Exception("No se pudo conectar a la red Wi-Fi")

# Configuración del sensor de ultrasonido y el LED
medidor = HCSR04(trigger_pin=4, echo_pin=5)  # Verifica que los pines son correctos en tu proyecto Wokwi
led = Pin(2, Pin.OUT)  # Cambia el pin según tu configuración

# Parámetros del tanque
ALTURA_TANQUE = 100   # Altura total del tanque en cm
UMBRAL_NIVEL_AGUA = 30    # Umbral para activar la alerta del LED
TIEMPO_PARPADEO = 0.5  # Tiempo de parpadeo del LED en segundos
TIEMPO_MEDICION = 4  # Tiempo de espera entre mediciones

# URL de tu servidor Flask (actualiza con la IP correcta de tu servidor Flask)
url = "https://medidor-agua.onrender.com/data"  # Esta es la IP de tu servidor Flask en tu red local

while True:  
    try:  
        # Medir la distancia usando el sensor de ultrasonido
        distancia = medidor.distance_cm()  
        if distancia is None:
            print("No se detectó eco. No se pudo medir la distancia.")
            nivel_agua = 0
        else:
            print("Distancia medida:", distancia, "cm")  
            # Calcular el nivel de agua en el tanque
            nivel_agua = int(ALTURA_TANQUE - distancia)  
            print("Nivel de agua calculado:", nivel_agua, "cm")  

        # Enviar el nivel de agua a la API Flask
        payload = {'mensaje': f'Nivel de agua: {nivel_agua} cm'}
        print("Enviando solicitud a:", url)

        # Enviar la solicitud usando urequests
        try:
            # Convertir el payload a JSON
            json_data = ujson.dumps(payload)
            response = urequests.post(url, data=json_data, headers={'Content-Type': 'application/json'})  
            print("Respuesta del servidor:", response.text)  
            response.close()  # Cerrar la conexión
        except Exception as e:
            print("Error al enviar la solicitud:", str(e))

        # Controlar el LED según el nivel de agua
        if nivel_agua < UMBRAL_NIVEL_AGUA:  
            print("Alerta! El nivel de agua es demasiado bajo!")  
            led.value(1)  # Enciende el LED
            utime.sleep(TIEMPO_PARPADEO)  
            led.value(0)  # Apaga el LED
            utime.sleep(TIEMPO_PARPADEO)  
        else:  
            led.value(0)  # Asegúrate de que el LED esté apagado si el nivel es normal
            print("Nivel de agua normal.")  

    except Exception as e:  
        print("Error al medir la distancia:", str(e))  
        
    utime.sleep(TIEMPO_MEDICION)  # Espera antes de la siguiente medición