import time
import dht
import network
from machine import ADC, PWM, Pin
from umqtt.simple import MQTTClient
# Configuração do loop do sistema
verification_interval = 5 # 5 segundos
# Configurações de conexão MQTT
MQTT_CLIENT_ID = "W7T3SRR5d3"
MQTT_BROKER = "800e09aa3578481cadf03b7a7c270b37.s1.eu.hivemq.cloud"
MQTT_PORT = 0
MQTT_USERNAME = "W7T3SRR5d3"
MQTT_PASSWORD = "100%Jesus"
# Tópicos para leituras de sensores
topic_temp = "sensores/temperatura"
topic_hum = "sensores/umidade"
topic_soil = "sensores/solo"
# Tópicos para controle do atuador
topic_fan_control = "atuadores/ventilador"
topic_pump_control = "atuadores/bomba"
topic_verification_interval = "comandos/intervalo"
# Instância do cliente MQTT
client = MQTTClient(
MQTT_CLIENT_ID,
MQTT_BROKER,
port=MQTT_PORT,
user=MQTT_USERNAME,
password=MQTT_PASSWORD,
keepalive=60,
ssl=True,
ssl_params={
"server_hostname": "800e09aa3578481cadf03b7a7c270b37.s1.eu.hivemq.cloud"
},
)
# Configuração da interface Wi-Fi
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
# Configuração dos sensores
dht_sensor = dht.DHT22(Pin(15)) # Sensor DHT22 para temperatura e umidade
soil_sensor = ADC(Pin(34)) # Potenciômetro emula sensor de umidade do solo
soil_sensor.atten(ADC.ATTN_11DB) # Faixa completa de 0-3.3V para ESP32
# Configuração dos atuadores
fan_servo = PWM(Pin(2), freq=50) # Ventilador controlado por PWM via servo
fan_auto = False # Define se ventilador deve sempre ficar ligado
pump_relay = Pin(4, Pin.OUT) # Relé para controlar a bomba de água
pump_auto = False # Define se bomba deve sempre ficar ligada
# Estado inicial dos atuadores
fan_servo.duty(40) # Posição inicial do servo para ventilador desligado (0°)
pump_relay.value(0) # Define o relé inicialmente desligado (bomba desligada)
def connect_wifi():
"""Conecta ao Wi-Fi com tentativas repetidas até estabelecer conexão."""
print("Conectando ao WI-FI", end="")
sta_if.connect("Wokwi-GUEST", "")
while not sta_if.isconnected():
print(".", end="")
time.sleep(0.5)
print("\nConectado ao WI-FI!")
def read_sensors():
"""Realiza a leitura dos sensores de temperatura, umidade e umidade do solo."""
dht_sensor.measure()
temp = dht_sensor.temperature()
hum = dht_sensor.humidity()
# Lê o nível de umidade do solo
soil_value = soil_sensor.read()
soil_moisture = (soil_value / 4095) * 100 # Converte para porcentagem (0-100%)
print(f"Temperatura: {temp}°C, Umidade: {hum}%, Umidade do Solo: {soil_moisture}%")
return temp, hum, soil_moisture
def publish_sensors(temp, hum, soil_moisture):
"""Realiza a publicação das informações dos sensores."""
client.publish(topic_temp, str(temp))
client.publish(topic_hum, str(hum))
client.publish(topic_soil, str(soil_moisture))
print("Dados publicados nos tópicos MQTT")
def control_actuators(temp, hum, soil_moisture):
"""Controla os atuadores (ventilador, bomba) com base nos valores dos sensores."""
print("Iniciando controle dos atuadores")
# Controle do ventilador e movimento contínuo do servo baseado em temperatura e umidade
if not fan_auto:
if temp > 25 or hum > 80:
# Ligar ventilador e iniciar movimento contínuo do servo
rotate_servo()
print("Ventilador LIGADO, Servo em movimento contínuo")
else:
# Desligar ventilador e parar o servo
fan_servo.duty(0) # Parar o servo
print("Ventilador DESLIGADO, Servo parado")
# Controle da bomba de água com base na umidade do solo usando o relé
if not pump_auto:
if soil_moisture < 40:
pump_relay.value(1) # Liga o relé para acionar a bomba
print("Relé LIGADO devido à baixa umidade do solo")
elif soil_moisture >= 60:
pump_relay.value(0) # Desliga o relé para parar a bomba
print("Relé DESLIGADO, umidade do solo adequada")
print("Controle dos atuadores concluído")
def rotate_servo():
"""Simula movimento contínuo do ventilador com um servo comum."""
step_delay = 0.02 # Atraso entre cada passo de rotação (em segundos)
min_position = 40 # Posição mínima para o servo (0°)
max_position = 115 # Posição máxima para o servo (aproximadamente 180°)
# Movimento de ida (0° a 180°)
for position in range(min_position, max_position, 5):
fan_servo.duty(position)
time.sleep(step_delay)
# Movimento de volta (180° a 0°)
for position in range(max_position, min_position, -5):
fan_servo.duty(position)
time.sleep(step_delay)
def callback(topic, msg):
"""Processa mensagens recebidas dos tópicos de controle remoto via MQTT."""
global fan_auto, pump_auto, verification_interval
topic = topic.decode()
msg = msg.decode()
print(f"Mensagem recebida no tópico {topic}: {msg}")
# Controle remoto do ventilador e bomba
if topic == topic_fan_control:
if msg == "AUTO":
fan_auto = True
rotate_servo() # Inicia o movimento contínuo se no modo automático
else:
fan_auto = False
fan_servo.duty(0) # Parar o servo
elif topic == topic_pump_control:
if msg == "AUTO":
pump_auto = True
pump_relay.value(1) # Liga o relé no modo automático
else:
pump_auto = False
pump_relay.value(0) # Desliga o relé
elif topic == topic_verification_interval:
verification_interval = int(msg)
# Inicializa conexão Wi-Fi e MQTT
connect_wifi()
# Configurações de subscrição e callback MQTT
client.set_callback(callback)
print("Conectando ao servidor MQTT...")
client.connect()
print("Conectado ao MQTT!")
client.subscribe(topic_fan_control)
client.subscribe(topic_pump_control)
client.subscribe(topic_verification_interval)
# Loop principal do sistema
while True:
print("Iniciando loop de monitoramento")
# Verifica e processa mensagens MQTT recebidas
client.check_msg()
# Lê os dados dos sensores
temp, hum, soil_moisture = read_sensors()
# Publica os dados dos sensores nos tópicos MQTT
publish_sensors(temp, hum, soil_moisture)
# Controla os atuadores com base nas leituras dos sensores
control_actuators(temp, hum, soil_moisture)
# Aguarda o intervalo antes de realizar a próxima verificação
time.sleep(verification_interval)