import network
import time
from machine import Pin, PWM
from umqtt.simple import MQTTClient
# --- CONFIGURAÇÕES DE REDE E MQTT ---
SSID = "Wokwi-GUEST"
PASSWORD = ""
MQTT_BROKER = "broker.hivemq.com"
CLIENT_ID = "2WVgnliag4" # ID único para não dar conflito
TOPIC_CMD = "ALARMECASA/comando" # Tópico para RECEBER comandos do celular
TOPIC_STATUS = "ALARMECASA/estado" # Tópico para ENVIAR status para o celular
# --- CONFIGURAÇÃO DOS PINOS (Conforme seu Diagrama) ---
# Saídas
servo = PWM(Pin(5), freq=50) # Servo no pino 5
buzzer = PWM(Pin(12), freq=1000, duty=0) # Buzzer no pino 12
led_vermelho = Pin(22, Pin.OUT) # LED Vermelho (Armado)
led_verde = Pin(23, Pin.OUT) # LED Verde (Desarmado)
# Entradas
pir = Pin(15, Pin.IN) # Sensor de Movimento
btn = Pin(14, Pin.IN, Pin.PULL_UP) # Botão físico
# Variáveis de Controle
sistema_armado = False
ultimo_click = 0
# --- FUNÇÕES AUXILIARES ---
def mover_servo(angulo):
# Converte angulo (0-180) para duty (40-115) para ESP32
duty = int(((angulo) / 180 * 75) + 40)
servo.duty(duty)
def tocar_sirene():
# Faz um som de sirene
for i in range(3):
buzzer.freq(800)
buzzer.duty(512)
time.sleep(0.1)
buzzer.freq(1200)
time.sleep(0.1)
buzzer.duty(0) # Desliga som
def conectar_wifi():
print("Conectando ao WiFi...", end="")
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
sta_if.connect(SSID, PASSWORD)
while not sta_if.isconnected():
print(".", end="")
time.sleep(0.1)
print(" Conectado!")
def mensagem_recebida(topic, msg):
global sistema_armado
comando = msg.decode().upper()
print(f"Mensagem recebida: {comando}")
if comando == "ABRIR":
mover_servo(90) # Abre a trava (100 graus)
client.publish(TOPIC_STATUS, "Trava Aberta")
elif comando == "FECHAR":
mover_servo(-30) # Fecha a trava (0 graus)
client.publish(TOPIC_STATUS, "Trava Fechada")
elif comando == "LIGAR_ALARME":
sistema_armado = True
atualizar_leds()
client.publish(TOPIC_STATUS, "Alarme ARMADO")
elif comando == "DESLIGAR_ALARME":
sistema_armado = False
atualizar_leds()
client.publish(TOPIC_STATUS, "Alarme DESARMADO")
def atualizar_leds():
if sistema_armado:
led_vermelho.on()
led_verde.off()
else:
led_vermelho.off()
led_verde.on()
# --- INICIALIZAÇÃO ---
conectar_wifi()
print("Conectando ao Broker MQTT...")
client = MQTTClient(CLIENT_ID, MQTT_BROKER)
client.set_callback(mensagem_recebida)
client.connect()
client.subscribe(TOPIC_CMD)
print(f"Sistema Pronto! Tópico de comando: {TOPIC_CMD}")
# Estado inicial
mover_servo(0) # Começa fechado
atualizar_leds() # Atualiza as luzes
# --- LOOP PRINCIPAL ---
while True:
try:
client.check_msg() # Verifica se chegou mensagem do celular
# 1. Verifica Botão Físico (Armar/Desarmar manualmente)
if btn.value() == 0: # Botão pressionado
if (time.time() - ultimo_click) > 1: # Debounce simples
sistema_armado = not sistema_armado # Inverte o estado
atualizar_leds()
estado_str = "ARMADO" if sistema_armado else "DESARMADO"
print(f"Botão Pressionado. Sistema: {estado_str}")
client.publish(TOPIC_STATUS, f"Manual: {estado_str}")
ultimo_click = time.time()
# 2. Verifica Sensor PIR (Apenas se estiver armado)
if sistema_armado:
if pir.value() == 1:
print("MOVIMENTO DETECTADO!")
client.publish(TOPIC_STATUS, "PERIGO: MOVIMENTO!!")
tocar_sirene()
time.sleep(2) # Pausa para não floodar o broker
time.sleep(0.1) # Pequena pausa para estabilidade
except OSError as e:
print("Erro de conexão. Tentando reconectar...")
time.sleep(5)
try:
client.connect()
client.subscribe(TOPIC_CMD)
except:
pass