import _thread # Importa o módulo para threads
from machine import Pin, PWM, ADC
import time
import network
from umqtt.simple import MQTTClient
from _thread import start_new_thread
# DEFINIÇÃO DAS PORTAS DOS SENSORES E ATUADORES
buzzer = PWM(Pin(23), freq=500, duty=0) # buzzer
pir = Pin(22, Pin.IN) # sensor pir de movimento
#=========== keypad ===============
ROW_PINS = [21, 19, 18, 5] # Pinos para as linhas R1, R2, R3, R4
COL_PINS = [17, 16, 4, 0] # Pinos para as colunas C1, C2, C3
KEY_MAP = [
['1', '2', '3'], # R1
['4', '5', '6'], # R2
['7', '8', '9'], # R3
['*', '0', '#'] # R4
]
rows = [Pin(pin, Pin.IN, Pin.PULL_UP) for pin in ROW_PINS] # Configura os pinos das linhas como entradas com pull-up
cols = [Pin(pin, Pin.OUT) for pin in COL_PINS] # Configura os pinos das colunas como saídas
adc = ADC(Pin(32)) # Configura o pino 32 como entrada ADC para o sensor LDR (sensor de luz)
senha_esperada = "1234" # Senha correta
tentativas = 2 # Número de tentativas restantes
alarme_ativo = False # Parâmetro de controle da thread buzzer, determina se a thread deve continuar executando.
senha_digitada = "" # Armazena a senha digitada
alarme_tocando = False # Indica se o alarme está tocando
buzzer_ativo = False # Indica se o buzzer está ativo
#MQTT
MQTT_CLIENT_ID = "micropython-kuguma17"
MQTT_BROKER = "broker.mqttdashboard.com"
MQTT_USER = ""
MQTT_PASSWORD = ""
MQTT_TOPIC_1 = "sensor2"
# FUNÇÕES DO BUZZER
def buzzer_succes(): # Som que indica sucesso.
print("Sucesso!")
buzzer.freq(500)
buzzer.duty(512)
time.sleep(0.3)
buzzer.freq(550)
buzzer.duty(512)
time.sleep(0.25)
buzzer.freq(650)
buzzer.duty(512)
time.sleep(0.2)
buzzer.duty(0)
def buzzer_denied(): # Som que indica senha incorreta ou acesso negado.
print("Negado")
buzzer.freq(400)
buzzer.duty(512)
time.sleep(0.5)
buzzer.freq(300)
buzzer.duty(512)
time.sleep(0.5)
buzzer.duty(0)
def buzzer_alarm(): # Som do alarme
global alarme_tocando, alarme_ativo
alarme_tocando = True
alarme_ativo = True
while alarme_ativo:
buzzer.freq(500)
buzzer.duty(512)
time.sleep(0.5)
buzzer.freq(800)
buzzer.duty(512)
time.sleep(0.5)
buzzer.duty(0)
alarme_tocando = False
# LEITURA DO KEYPAD
def ler_teclado():
for i, col in enumerate(cols): # Percorre cada coluna
col.value(0) # Ativa a coluna
for j, row in enumerate(rows): # Verifica o valor de cada linha
if row.value() == 0: # Se a linha está pressionada
return KEY_MAP[j][i] # Retorna o caractere pressionado
col.value(1) # Desativa a coluna
return None # Retorna None se nenhum caractere for pressionado
# VALIDAÇÃO DA SENHA
def validar_senha():
global tentativas, senha_digitada, alarme_ativo
if senha_digitada == senha_esperada:
buzzer_succes() # Toca o som de sucesso
senha_digitada = "" # Limpa a senha digitada
alarme_ativo = False # Desativa o alarme
return True
else:
tentativas -= 1 # Se errar, tira uma tentativa
if tentativas == 0:
buzzer_denied() # Toca o som de acesso negado
print("Tentativas esgotadas!")
alarme_ativo = True # Ativa o alarme
else:
buzzer_denied()
print(f"Tentativas restantes: {tentativas}")
senha_digitada = "" # Limpa a senha
return False
# ATIVAR E DESATIVAR ALARME
def ativar_alarme():
global buzzer_ativo, tentativas
if validar_senha():
print("Alarme ativado")
tentativas = 2 # Reinicia o contador de tentativas
buzzer_ativo = True # Ativa o buzzer
def desativar_alarme():
global buzzer_ativo, tentativas
if validar_senha():
print("Alarme desativado")
tentativas = 2 # Reinicia o contador de tentativas
buzzer_ativo = False # Desativa o buzzer
#Checar mensagens
def checar_msg():
global client
while True:
client.check_msg()
time.sleep(0.2)
#Função para conectar no wifi
def conectaWifi():
ssid = 'Wokwi-GUEST'
password = ''
staIf = network.WLAN(network.STA_IF)
staIf.active(True)
staIf.connect(ssid, password)
print('Conectando à internet', end='')
while not staIf.isconnected():
print('.', end='')
time.sleep(1)
print('Conectado!!')
def callback(topic, msg):
global buzzer_ativo, alarme_ativo
mensagem = msg.decode()
if mensagem == '1234ativar':
buzzer_ativo = True # Liga o alarme
print('Alarme ligado!')
elif mensagem == '1234desligar':
buzzer_ativo = False # Desliga o alarme
alarme_ativo = False # Desliga o monitoramento
print('Alarme desligado!')
print(msg)
conectaWifi()
#conecta ao MQTT
print("Conectando no servidor MQTT... ", end="")
client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER, user=MQTT_USER, password=MQTT_PASSWORD)
client.set_callback(callback)
client.connect()
client.subscribe(MQTT_TOPIC_1)
print("Conectado!")
start_new_thread(checar_msg, ())
# LOOP PRINCIPAL
print("""
Alarme desativado!
Para interagir:
* - para confirmar a senha
# - para excluir a senha
""")
while True:
try:
tecla = ler_teclado() # Lê a tecla pressionada
if tecla:
if tecla == "*":
if len(senha_digitada) == 4: # Se a senha digitada tiver 4 caracteres
if buzzer_ativo: # Se o alarme estiver ativo
desativar_alarme() # Desativa o alarme
else: # Se o alarme estiver inativo
ativar_alarme() # Ativa o alarme
else:
print("Senha incompleta")
elif tecla == "#":
senha_digitada = "" # Reseta a senha digitada
elif tecla.isdigit(): # Se for um número
senha_digitada += tecla # Adiciona o dígito à senha
if len(senha_digitada) > 4: # Se digitar mais de 4 números
senha_digitada = senha_digitada[:4] # Limita a senha a 4 dígitos
print(f"Senha: {senha_digitada}")
if not alarme_tocando and buzzer_ativo: # Se o alarme não estiver tocando e o buzzer estiver ativo
if pir.value() == 1 or adc.read_u16() > 30000: # Verifica movimento ou luminosidade
alarme_ativo = False # Encerra a thread anterior para evitar que adicionais sejam criadas
print("Alerta! Movimento ou luz detectados!")
_thread.start_new_thread(buzzer_alarm, ())
elif alarme_ativo:
alarme_ativo = False # Evita que threads adicionais sejam criadas
_thread.start_new_thread(buzzer_alarm, ())
except ValueError:
print("Erro: comando não reconhecido")
time.sleep(0.1)