import network #biblioteca para configurar a rede
from machine import Pin, PWM, time_pulse_us #biblioteca para controlar pinos digitais, GPIO sinais PWM e medir pulsos
from time import sleep #biblioteca para fazer o esp32 pausar
from umqtt.simple import MQTTClient #biblioteca de protocolo mqtt que permite conectar receber e publicar mensagens
wlan = network.WLAN(network.STA_IF) #cria um interface de rede e define o modo station que vai conectar a um roteador
wlan.active(True) #liga o radio wifi do esp32
wlan.connect('Wokwi-GUEST', '') #conecta o esp32 a rede simulada com o nome Wokwi-GUEST e sem senha
while not wlan.isconnected(): #enquanto o esp32 nao conseguir se conectar no wifi sera exibido a mensagem
print('conectando...') #exibe enquanto o esp nao esta conectado a internet
print('conectado!') #exibido apos a conexao com a internet
broker = 'mqtt-dashboard.com' #informa o broker para onde a mensagem foi enviada
client_id = 'esp32teste!' #nome do cliente para identificaçao no broker
topico = 'enviar/projeto/esp32' #endereço do broker para onde as mensagens sao publicadas
topico2 = 'receber/projeto/esp32' #endereço do broker para onde as mensagens vao ser publicadas para o esp
led = Pin(23, Pin.OUT) #informa que o led esta no pino 23 e que esta configurado como saida de dados
buzzer = PWM(Pin(22)) #informa que o buzzer esta no pino 22 e que e controlado por sinal PWM
buzzer.freq(1000) #define a frequencia do buzzer
buzzer.duty(0) #define o volume do buzzer como desligado
sensor = Pin(34, Pin.IN) #informa que o sensor esta no pino 34 e que esta configurado como entrada de dados
trig = Pin(12, Pin.OUT) # Pino TRIG do HC-SR04 (serve para enviar o pulso) - Sensor ultrassônico
echo = Pin(14, Pin.IN) # Pino ECHO do HC-SR04 (serve para receber o echo) - Sensor ultrassônico
def callback(topic, msg): #funcao para receber as mensagens do usuario pelo mqtt
if msg.decode() == 'ligar': #se no topico for publicado 'ligar' o led o buzzer serao ligados
led.value(1) #liga o led
buzzer.duty(600) #liga o buzzer
client.publish(topico, 'ligado') #ira publicar que o led e o buzzer foram ligados
elif msg.decode() == 'desligar': #se no topico for publicado 'desligar' o led e o buzzer serao desligados
led.value(0) #desliga o led
buzzer.duty(0) #desliga o buzzer
client.publish(topico, 'desligado') #ira publicar que led e o buzzer foram desligados
client = MQTTClient(client_id, broker) #cria um objeto cliente mqtt com o id e endereço do broker
client.set_callback(callback) #define a funcao callback que sera executada quando uma mensagem for recebida
client.connect(True) #conecta o cliente ao broker
client.subscribe(topico2) #se inscreve no topico2 para receber as mensagens enviadas
def medir_distancia(): #funcao que mede a distancia do sensor ultrassonico
#envia um pulso de 10 microssegundos no pino TRIG para iniciar a medição
trig.value(0)
sleep(0.000001)
trig.value(1)
sleep(0.00001)
trig.value(0)
duracao = time_pulse_us(echo, 1) #mede o tempo que o sinal leva para ir e voltar até o objeto
distancia_cm = duracao / 58.0 #converte o tempo em distância (cm), baseado na velocidade do som (aprox. 343 m/s)
return distancia_cm #retorna a distância medida em centímetros
while True: #incia o loop
client.check_msg() #verifica as mensagens e chama o callback()
if sensor.value() == 1: #se o sensor for ativado o movimento sera detectado
print('Movimento detectado!') #exibe movimento detectado quando o sensor e ativado
dist = medir_distancia() # Usa valor escolhido - para simulação de distância entre o intruso e o sensor
print("Distância real: {:.2f} cm".format(dist)) #informa a distancia simulada
if dist <= 50: # Se distância for igual ou menor que 50cm (ou outro valor escolhido)
print("Aproximação detectada! Alarme ativado!") # Imprime na tela se algo foi detectado pelo sensor, baseando-se no valor escolhido
while sensor.value() == 1: #inicia loop caso o primeiro sensor verifique movimento
led.value(1) #liga o led
buzzer.duty(600) #liga o buzzer
sleep(0.3) #faz uma pausa de 0.3s
led.value(0) #desliga o led
buzzer.duty(0) #desliga o buzzer
sleep(0.3) #faz uma pausa de 0.3s
client.publish(topico, 'INVASAO DETECTADA!') #se o sensor for ativado o esp32 publica uma mensagem no topico
print('mensagem enviada') #informa se a mensagem foi enviada