import network
import ujson
import time
import dht
import ubinascii # Biblioteca para geração do ID único do cliente MQTT
import machine # Biblioteca para geração do ID único do cliente MQTT
from machine import Pin, PWM
from time import sleep
from umqtt.simple import MQTTClient
# Define os pinos do sensor simulado, da bomba e do buzzer
pino_dht = machine.Pin(13) #Pino do sensor DHT22
pino_bomba = machine.Pin(5, machine.Pin.OUT) # Pino da bomba, configurado como saída
sensor_dht = dht.DHT22(pino_dht) # Inicializa o sensor DHT22
# Define os pinos do LED RGB
led_vermelho = PWM(Pin(18)) # Pino do LED R
led_verde = PWM(Pin(19)) # Pino LED G
led_azul = PWM(Pin(21)) # Pino LED B
# Parâmetros de conexão MQTT
ID_CLIENTE_MQTT = ubinascii.hexlify(machine.unique_id()).decode() # Gera um ID único
BROKER_MQTT = "broker.mqttdashboard.com" # Endereço do Broker
USUARIO_MQTT = "" # Usuário (se houver)
SENHA_MQTT = "" # Senha (se houver)
TOPICO_MQTT = "SENSORirrigacao" # Tópico MQTT
# Conecta ao WiFi
print("Conectando ao WiFi...", end="")
wifi = network.WLAN(network.STA_IF)
wifi.active(True)
wifi.connect("Wokwi-GUEST", "")
while not wifi.isconnected():
sleep(0.5)
print(".", end="")
print("Concluído")
# Conecta ao Broker MQTT
print("Conectando ao servidor MQTT... ", end="")
cliente = MQTTClient(ID_CLIENTE_MQTT, BROKER_MQTT, user=USUARIO_MQTT, password=SENHA_MQTT)
cliente.connect()
print("Concluído")
# Função para ler temperatura e umidade do sensor DHT22
def ler_dht():
try:
sensor_dht.measure()
temperatura = sensor_dht.temperature()
umidade = sensor_dht.humidity()
# Verifica se a leitura foi bem-sucedida
if temperatura is not None and umidade is not None:
return temperatura, umidade
else:
print("Falha ao ler dados do DHT22")
return None, None
except Exception as e:
print("Erro ao ler dados do DHT22:", e)
return None, None
# Função para publicar temperatura, umidade e estado da bomba no MQTT
def publicar_dados(temperatura, umidade, estado_bomba):
# Prepara os dados a serem enviados
dados = {
"temperatura": temperatura,
"umidade": umidade,
"bomba": estado_bomba # Inclui o estado da bomba nos dados
}
# Publica os dados no tópico
cliente.publish(TOPICO_MQTT, ujson.dumps(dados))
print("Dados publicados: ", dados)
# Função para controlar a bomba de água
def controlar_bomba(umidade):
if umidade < 50:
pino_bomba.on() # Liga a bomba
estado_bomba = "ligada"
print("Bomba ligada")
else:
pino_bomba.off() # Desliga a bomba
estado_bomba = "desligada"
print("Bomba desligada")
return estado_bomba
# Função para controlar o LED RGB com base na temperatura
def controlar_led(temperatura):
if temperatura <= 20: # Cor fria
led_vermelho.duty(0)
led_verde.duty(1023)
led_azul.duty(1023)
elif temperatura > 20 and temperatura <= 30: # Cor neutra
led_vermelho.duty(1023)
led_verde.duty(1023)
led_azul.duty(0)
else: # Cor quente
led_vermelho.duty(1023)
led_verde.duty(0)
led_azul.duty(0)
return
# Inicializa os valores anteriores
temperatura_anterior = None
umidade_anterior = None
estado_bomba_anterior = None
# Loop principal para ler os dados do sensor e publicá-los se houver mudança
while True:
temperatura, umidade = ler_dht()
if temperatura is not None and umidade is not None:
# Verifica se a temperatura ou umidade mudaram
if temperatura != temperatura_anterior or umidade != umidade_anterior:
estado_bomba = controlar_bomba(umidade) # Controla a bomba com base na umidade
controlar_led(temperatura) # Controla o LED com base na temperatura
publicar_dados(temperatura, umidade, estado_bomba) # Publica os dados incluindo o estado da bomba
temperatura_anterior = temperatura
umidade_anterior = umidade
sleep(1)