from machine import Pin, ADC
from ntptime import settime
from rede import Rede
from time import ticks_ms, ticks_diff, localtime, sleep_ms
from json import dumps
import dht
from umqtt.robust import MQTTClient
DHT = dht.DHT22(Pin(21))
LDR = ADC(Pin(35), atten=ADC.ATTN_11DB)
PORTA = Pin(16, Pin.IN, Pin.PULL_UP)
LIMITES = {"temperatura": 20, "umidade": 55, "luminosidade": 300}
proprietario = "BELG"
categoria = "A"
serial = "240207"
verificacao = "1"
ID_CONTAINER = f"{proprietario}{categoria}{serial}{verificacao}"
# Wi-Fi
wifi = Rede("Wokwi-GUEST", "", conecta=False)
try:
wifi.conectar(tentativas=50, intervalo=500)
if wifi.conectado:
settime()
print("WiFi conectado!")
except:
print("Falha no WiFi")
# MQTT
client = MQTTClient("goldenz", "broker.hivemq.com")
TOPICO = "ifrs/dados/BELGA0224071"
TOPICO_ALERTAS = "ifrs/alertas/BELGA0224071"
try:
client.connect()
print("HiveMQ conectado!")
except:
print("Erro MQTT")
def horario():
d = localtime()
return f"{d[0]}-{d[1]:02d}-{d[2]:02d}T{d[3]:02d}:{d[4]:02d}:{d[5]:02d}"
def enviar_alerta(tipo, valor, limite, mensagem):
alerta = {
"timestamp": horario(),
"id_container": ID_CONTAINER,
"tipo": tipo,
"valor": valor,
"limite": limite,
"mensagem": mensagem
}
client.publish(TOPICO_ALERTAS, dumps(alerta))
print("[ALERTA ENVIADO]", alerta)
def checar_porta(estado):
global autorizado
atual = PORTA.value()
if atual != estado:
sleep_ms(50)
if PORTA.value() == atual:
if atual == 0:
if autorizado:
print("[ALERTA] Porta aberta com autorização")
autorizado = False
else:
print("[ALERTA] Porta aberta SEM autorização!")
enviar_alerta(
"porta",
"aberta",
"fechada",
"Porta aberta sem autorização"
)
return atual
return estado
autorizado = False
estado_porta = PORTA.value()
ultima_leitura = ticks_ms()
while True:
estado_porta = checar_porta(estado_porta)
if ticks_diff(ticks_ms(), ultima_leitura) >= 3000:
try:
DHT.measure()
dados = {
"timestamp": horario(),
"temperatura": DHT.temperature(),
"umidade": DHT.humidity(),
"luminosidade": LDR.read_u16(),
"porta": "aberta" if estado_porta == 0 else "fechada",
"id_container": ID_CONTAINER
}
print(dados)
# ALERTA DE TEMPERATURA
if dados["temperatura"] > LIMITES["temperatura"]:
enviar_alerta(
"temperatura",
dados["temperatura"],
LIMITES["temperatura"],
"Temperatura acima do limite"
)
# ALERTA DE UMIDADE
if dados["umidade"] < LIMITES["umidade"]:
enviar_alerta(
"umidade",
dados["umidade"],
LIMITES["umidade"],
"Umidade abaixo do limite"
)
# ALERTA DE LUMINOSIDADE
if dados["luminosidade"] > LIMITES["luminosidade"]:
enviar_alerta(
"luminosidade",
dados["luminosidade"],
LIMITES["luminosidade"],
"Luminosidade acima do limite"
)
# ENVIA DADOS NORMAIS
client.publish(TOPICO, dumps(dados))
print("Dados enviados!")
except Exception as e:
print("Erro:", e)
ultima_leitura = ticks_ms()