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