import time
import network
import machine
from machine import Pin
from umqtt.simple import MQTTClient
import dht
# Configuração dos PINs
TRIGGER_PIN = 27
ECHO_PIN = 28
DHT_PIN = 35
LED_PIN = 2
BUZZER_PIN = 15
# Configuração MQTT
MQTT_SERVER = "broker.hivemq.com"
MQTT_PORT = 1883
MQTT_TOPIC = "sensoragua"
# Conecta ao Wi-Fi
def connect_wifi(ssid, password):
sta_if = network.WLAN(network.STA_IF)
if not sta_if.isconnected():
print("Connecting to WiFi...")
sta_if.active(True)
sta_if.connect(ssid, password)
while not sta_if.isconnected():
time.sleep(0.5)
print("Connected to WiFi")
# Configuração MQTT
def connect_mqtt():
client = MQTTClient("ESP32Client", MQTT_SERVER, port=MQTT_PORT)
client.connect()
print("Connected to MQTT")
return client
# Medição da distância pelo sensor ultrassônico
def measure_distance(trigger, echo):
trigger.low()
time.sleep_us(2)
trigger.high()
time.sleep_us(10)
trigger.low()
while echo.value() == 0:
pass
start = time.ticks_us()
while echo.value() == 1:
pass
duration = time.ticks_diff(time.ticks_us(), start)
return (duration * 0.0343) / 2
# Publica dados via MQTT
def publish_data(client, topic, message):
client.publish(topic, message)
print(f"Published: {message}")
# Main function
def main():
connect_wifi('Wokwi-GUEST', '')
client = connect_mqtt()
# Configuração dos pinos
trigger = Pin(TRIGGER_PIN, Pin.OUT)
echo = Pin(ECHO_PIN, Pin.IN)
dht_sensor = dht.DHT22(Pin(DHT_PIN))
led = Pin(LED_PIN, Pin.OUT)
buzzer = Pin(BUZZER_PIN, Pin.OUT)
water_threshold = 58
humidity_threshold = 70
last_height_report = None
while True:
distance = measure_distance(trigger, echo)
dht_sensor.measure()
temperature = dht_sensor.temperature()
humidity = dht_sensor.humidity()
# Alerta de nível de água
if distance <= water_threshold:
led.on()
buzzer.on()
publish_data(client, MQTT_TOPIC, f"Alerta de alagamento: Nível da água em {distance:.2f} cm")
else:
led.off()
buzzer.off()
# Alerta de umidade
if humidity > humidity_threshold:
publish_data(client, MQTT_TOPIC, f"Alerta de chuva: Umidade em {humidity:.2f}%")
# Reportar alterações no nível da água
if last_height_report is None or abs(last_height_report - distance) >= 1:
last_height_report = distance
publish_data(client, MQTT_TOPIC, f"Atualização nível da água: {distance:.2f} cm")
time.sleep(20)
main()