# coding: utf-8
# Importar as bibliotecas necessárias
from machine import Pin, PWM # Para usar os pinos do ESP32 (led, sirene e sensor)
import network # Para usar o módulo de internet do ESP32
import socket # Inteface entre a internet e o python
import time # Usar sleep para retardar alguns procedimentos
import _thread # Serve para criar mini programas paralelos (threads)
# Configurar os pinos do ESP32
sensor = Pin(15, Pin.IN)
buzzer = PWM(Pin(23, Pin.OUT), freq=500, duty=0)
led1 = Pin(18, Pin.OUT)
led2 = Pin(19, Pin.OUT)
# Inicializar os piscadores desligados
led1.value(0)
led2.value(0)
# Configurar o Wi-Fi (nome e senha)
ssid = 'Wokwi-GUEST'
password = ''
# Ligar o componente de Wi-Fi do ESP32 e Conectar ao Wi-Fi
wlan = network.WLAN(network.STA_IF) # Criar uma interface com o módulo Wi-Fi
wlan.active(True) # Ativar a interface
wlan.connect(ssid, password)
# Rodar o laço até conectar ao Wi-Fi
while not wlan.isconnected():
print('Conectando ao Wi-Fi...')
time.sleep(1)
print('Conectado ao Wi-Fi')
print('Configuração de rede: ', wlan.ifconfig())
# Configurar o servidor (IP e porta)
server_ip = '0.0.0.0'
server_port = 1026
# Criar um socket do servidor
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Criar um socket TCP/IP
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # Deixar reutilizar um IP
server_socket.bind((server_ip, server_port)) # Receber conexão do ip server_ip na porta server_port
server_socket.listen(5) # Número máximo de conexões recebidas
# Inicializar o estado do sistema e o estado do alarme
system_status = True # True - ligado, False - desligado
alarm_status = False # True - ligado, False - desligado
# Cria um html adequado para o servidor
def create_html():
# HTML do servidor
html = '''
<!DOCTYPE html>
<html>
<head>
<title>Sistema de Vigilância Residencial</title>
<meta charset="utf-8">
</head>
<body>
<h1>Sistema de Vigilância Residencial</h1>
<h2>Estado do sistema: <strong>{}</strong></h2>
<h2>Estado do alarme: <strong>{}</strong></h2>
<form action="/system/{}" method="get">
<button type="submit"><strong>{} O SISTEMA</strong></button>
</form>
<br>
<form action="/alarm/{}" method="get">
<button type="submit"><strong>{} O ALARME</strong></button>
</form>
</body>
</html>
'''
# Substituir os {} pelos textos adequados (Sistema Ativado/Desativado,
# Alarme Ligado/Desligado, /system/on ou /system/off, ATIVAR/DESATIVAR
# O SISTEMA, /alarm/on ou /alarm/off e LIGAR/DESLIGAR O ALARME)
# Modificar o html dependendo do estado do sistema
if system_status is True:
if alarm_status is True:
return html.format('ATIVADO', 'LIGADO', 'off', 'DESATIVAR', 'off', 'DESLIGAR')
else:
return html.format('ATIVADO', 'DESLIGADO', 'off', 'DESATIVAR', 'on', 'LIGAR')
else:
return html.format('DESATIVADO', 'DESLIGADO', 'on', 'ATIVAR', 'on', 'LIGAR')
# Responde à solicitação do cliente
def handle_request(client_socket):
global system_status, alarm_status
# Receber a escolha do cliente
request = client_socket.recv(1024)
request = str(request)
# Modificar o estado do sistema
if 'GET /system/on' in request:
# Se o cliente apertar "ATIVAR O SISTEMA"
system_status = True
alarm_status = False
elif 'GET /system/off' in request:
# Se o cliente apertar "DESATIVAR O SISTEMA"
system_status = False
alarm_status = False
elif system_status is True:
if alarm_status is False and 'GET /alarm/on' in request:
# Se o alarme estiver desligado e o cliente apertar "LIGAR O ALARME"
alarm_status = True
print('ALARME ACIONADO')
# Criar um thread para a sirene e um para os piscadores
_thread.start_new_thread(buzzer_thread, ()) # ligar a sirene
_thread.start_new_thread(leds_thread, ()) # ligar os piscadores
elif 'GET /alarm/off' in request:
# Se o cliente apertar "DESLIGAR O ALARME"
alarm_status = False
# Atualizar a página
client_socket.send('HTTP/1.1 200 OK\n'.encode())
client_socket.send('Content-Type: text/html\n'.encode())
client_socket.send('Connection: close\n\n'.encode())
client_socket.sendall(create_html().encode()) # Mandar o html atualizado
client_socket.close() # Fechar a conexão
# Função para criar o thread do servidor *
def server_thread():
global system_status, alarm_status
while True: # laço infinito
client_socket, addr = server_socket.accept() # Aceitar a conexão
handle_request(client_socket) # Receber a iteração do cliente a atualizar a página
time.sleep(0.1) # Esperar 0.1s
# Função para criar o thread do monitoramento do sensor de movimento
def monitor_thread():
global system_status, alarm_status
while True: # laço infinito
# Modo automático do sistema de segurança
if system_status is True and alarm_status is False and sensor.value() == 1:
# Se o sistema estiver ativado, se o alarme estiver desligado e se o sensor capturar algum movimento
print('ALARME ACIONADO')
alarm_status = True # Ativar o alarme
# Criar um thread para o sirene e um para os piscadores
_thread.start_new_thread(buzzer_thread, ())
_thread.start_new_thread(leds_thread, ())
time.sleep(0.1)
# Função para criar um thread da sirene
def buzzer_thread():
# Parar o thread se o sistema tornar desativo ou se o alarme for desligado (manualmente)
while system_status is True and alarm_status is True:
buzzer.freq(1000) # frequência
buzzer.duty(512) # intensidade
time.sleep(0.5) # esperar 0.5s
buzzer.freq(500)
buzzer.duty(512)
time.sleep(0.5)
buzzer.duty(0)
# Função para criar um thread dos piscantes
def leds_thread():
led1.value(1)
led2.value(0)
time.sleep(0.5)
# Parar o thread se o sistema tornar desativo ou se o alarme for desligado (manualmente)
while system_status is True and alarm_status is True:
led1.value(not led1.value()) # not 0 = 1, not 1 = 0
led2.value(not led2.value())
time.sleep(0.5)
led1.value(0)
led2.value(0)
# Criar o thread do servidor (paralelo ao main.py)
_thread.start_new_thread(server_thread, ())
# Criar o thread do monitoramento (paralelo ao main.py)
_thread.start_new_thread(monitor_thread, ())
# Laço infinito para manter o main.py rodando
while True:
print(f'Sistema: {system_status}')
print(f'Alarme: {alarm_status}\n')
time.sleep(1)