import network
import machine
import ssd1306
import dht
import time
from umqtt.simple import MQTTClient # Librería para conectar al broker

# Configuración WiFi
SSID = "Wokwi-GUEST"
PASSWORD = ""

# Configuración MQTT
MQTT_BROKER = "test.mosquitto.org" # Broker MQTT
MQTT_TOPIC = b"esp32/sensordata" # Topic al que se publica los datos

# Conectar a WiFi
def connect_wifi():
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    if not wlan.isconnected():
        print('Conectando a la red WiFi...')
        wlan.connect(SSID, PASSWORD)
        while not wlan.isconnected():
            time.sleep(1)
    print('Conectado a la red:', wlan.ifconfig())

# Publicar datos en MQTT
def publish_data(client, temperature, humidity, estado_bomba):
    # Datos que se publican en el topic: 
    message = f"{{'temperature': {temperature}, 'humidity': {humidity}, 'estado_bomba': '{estado_bomba}'}}"
    client.publish(MQTT_TOPIC, message)

# Inicializar MQTT
client = MQTTClient("esp32_client", MQTT_BROKER)

# Configurar pines
dht_pin = machine.Pin(2)
relay_pin = machine.Pin(4, machine.Pin.OUT)
i2c = machine.I2C(scl=machine.Pin(22), sda=machine.Pin(21))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
dht_sensor = dht.DHT22(dht_pin)

connect_wifi()
client.connect()

while True:
    try:
        dht_sensor.measure()
        temperature = dht_sensor.temperature()
        humidity = dht_sensor.humidity()

        # Determina el estado de la bomba de agua
        if humidity < 40:
            relay_pin.on()
            estado_bomba = "encendida"
            print(f"Humedad baja: {humidity}%. Encendiendo bomba de agua.")
        elif humidity > 60:
            relay_pin.off()
            estado_bomba = "apagada"
            print(f"Humedad alta: {humidity}%. Apagando bomba de agua.")
        else:
            relay_pin.off()
            estado_bomba = "apagada"
        
        # Actualiza la pantalla OLED
        oled.fill(0)
        oled.text("Temperatura:", 0, 0)
        oled.text(f"{temperature:.1f} C", 0, 16)
        oled.text("Humedad:", 0, 32)
        oled.text(f"{humidity:.1f} %", 0, 48)
        oled.text(f"Bomba: {estado_bomba}", 0, 56)  # Muestra el estado de la bomba
        oled.show()

        # Publica los datos en MQTT (incluyendo el estado de la bomba)
        publish_data(client, temperature, humidity, estado_bomba)

    except Exception as e:
        print("Error:", e)

    time.sleep(5)  # Espera 5 segundos antes de la siguiente lectura
NOCOMNCVCCGNDINLED1PWRRelay Module