import machine
# importar as bibliotecas necessárias
from machine import I2C, Pin
from ds1307 import DS1307
import utime
import time
import network
import ujson
from umqtt.simple import MQTTClient
import json
# MQTT Server Parameters
MQTT_CLIENT_ID = "micropython-weather-demo2000"
MQTT_BROKER = "mqtt-dashboard.com"
MQTT_USER = ""
MQTT_PASSWORD = ""
MQTT_SEND_TOPIC = "botao_enviar"
MQTT_RECEIVE_TOPIC = "botao_receber"
print("Connecting to WiFi", end="")
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
sta_if.connect('Wokwi-GUEST', '')
while not sta_if.isconnected():
print(".", end="")
time.sleep(0.1)
print(" Connected!")
print("Connecting to MQTT server... ", end="")
client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER, user=MQTT_USER, password=MQTT_PASSWORD)
client.connect()
print("Connected!")
movimento = False
def handle_interrupt(pin):
global movimento
movimento=True
global interrupt_pin
interrupt_pin=pin
led =Pin(12,Pin.OUT)
pir=Pin(14,Pin.IN)
pir.irq(trigger=Pin.IRQ_RISING,handler=handle_interrupt)
pin_buzzer = Pin(13, Pin.OUT)
i2c = machine.I2C(0, scl=machine.Pin(22), sda=machine.Pin(21))
print('Escaneando o barramento I2C...')
dispositivos = i2c.scan()
if len(dispositivos) == 0:
print("Nenhum dispositivo I2C encontrado!")
else:
print('Dispositivos I2C encontrados:', len(dispositivos))
for dispositivo in dispositivos:
print(" Endereço Decimal: ", dispositivo, " | Endereço Hexadecimal: ", hex(dispositivo))
print()
# declarar pinos para comunicação I2C
sclPin = Pin(22) # pino do clock serial
sdaPin = Pin(21) # pino de dados serial
# Iniciar I2C
objeto_i2c = I2C(0, # argumento posicional - id do I2C
scl = sclPin, # argumento com nome - pino do clock serial
sda = sdaPin, # argumento com nome - pino de dados serial
freq = 400000 )# argumento com nome - frequência do I2C
resultado = I2C.scan(objeto_i2c) # escanear o barramento I2C para dispositivos disponíveis
print("Escaneando o barramento I2C: ", resultado)
if resultado != []:
print("Conexão I2C bem-sucedida")
else:
print("Tentar novamente")
# objeto de relógio na porta I2C dedicada
objeto_relogio = DS1307(objeto_i2c)
# habilitar o módulo RTC
objeto_relogio.halt(False) # habilitar cristal 32 kHz
escolha = input("Deseja alterar os dados de data e hora padrão (s / n): ")
def handle_message(topic, msg):
mensagem_str = msg.decode()
valor_message = mensagem_str.split('"message": "')[1][0]
if valor_message == "1":
led.value(1)
pin_buzzer.value(1)
print(valor_message)
else:
led.value(0)
pin_buzzer.value(0)
print(valor_message)
# Inscrever-se no tópico de recebimento
client.set_callback(handle_message)
client.subscribe(MQTT_RECEIVE_TOPIC)
if escolha == "s":
print("Definindo os dados de data e hora padrão")
ano = int(input("Ano: "))
mes = int(input("Mês (Jan --> 1 , Dez --> 12): "))
dia = int(input("Dia: "))
semana = int(input("Dia da semana(Domingo --> 0, Segunda --> 1):"))
hora = int(input("Hora (formato de 24 horas): "))
minuto = int(input("Minuto: "))
segundo = int(input("Segundo: "))
agora = (ano, mes, dia, hora, minuto, segundo, 0)
objeto_relogio.datetime(agora)
else:
print("Os dados padrão não foram alterados")
print("Configurações de data e hora padrão: ")
padrao = objeto_relogio.datetime()
print("Ano: ", padrao[0])
print("Mês: ", padrao[1])
print("Dia: ", padrao[2])
print("Dia da semana:", padrao[3])
print("Hora: ", padrao[4])
print("Minuto: ", padrao[5])
print("Segundo: ", padrao[6], "\n")
utime.sleep(5) # tempo para o usuário ler os dados serial corretamente
while True:
client.check_msg()
if movimento:
print("Movimento detectado!")
(ano, mes, dia, semana, hora, minuto, segundo, p1) = objeto_relogio.datetime()
message = ujson.dumps({
"ano": ano,
"mes": mes,
"dia": dia,
"semana": semana,
"hora": hora,
"minuto": minuto,
"segundo": segundo,
"movimento": 1
})
client.publish(MQTT_SEND_TOPIC, message)
movimento = False
else:
print("Sem movimentos")
(ano, mes, dia, semana, hora, minuto, segundo, p1) = objeto_relogio.datetime()
message = ujson.dumps({
"ano": ano,
"mes": mes,
"dia": dia,
"semana": semana,
"hora": hora,
"minuto": minuto,
"segundo": segundo,
"movimento": 0
})
client.publish(MQTT_SEND_TOPIC, message)
time.sleep(1)