from machine import Pin
from ntptime import settime
from rede import Rede
from umqtt.robust import MQTTClient
from time import ticks_ms, ticks_diff, localtime
carga = Pin(3, Pin.OUT, value=0)
'''
Cria um objeto que gerencia a conexão de rede WiFi
'''
r = Rede("Wokwi-GUEST", "", conecta=False)
'''
Tenta até 40 vezes realizar a conexão, com intervalo de 500ms entre tentativa
É importante verificar, depois, se a conexão de fato se estabeleceu
Está em um bloco try...except, pois podem ocorrer diversos erros de sistema
'''
try:
r.conectar(tentativas=40, intervalo=500)
if r.conectado:
settime() # Função que busca data/hora atualizado usando o protocolo NTP (de ntptime)
except OSError as e:
print ("Deu ruim")
print (e)
topComando = 'ifrs/auto/ca/cmd'
topEstado = b'ifrs/auto/ca/lampada'
topMsg = b'ifrs/auto/ca/msg'
'''
Processa tudo o que chegar de conteúdo via MQTT
É chamada automaticamente por check_msg() cada vez que um conteúdo está disponível
Parâmetros obrigatórios a se ter:
---------------------------------
t - nome do tópico do conteúdo (objeto do tipo bytes)
p - conteúdo em si (objeto do tipo bytes)
'''
def fofoqueira(t, p):
topico = t.decode()
if topComando in topico: # o tópico começa com o texto de topComando
quem = topico.replace(topComando+'/','') # Pega só o nome
print (f'Quem enviou foi {quem}.')
conteudo = p.decode().lower() # Analisa o conteúdo e dá a resposta adequada
if conteudo == 'liga':
carga.on()
elif conteudo == 'desliga':
carga.off()
elif conteudo == 'estado':
cliente.publish(topEstado, b'ligado' if carga.value() else b'desligado')
else:
print ('conteúdo desconhecido')
'''
Cria um objeto que representa a conexão MQTT (cliente)
Depois, define qual função será chamada sempre que um conteúdo chegar, para processá-lo
Após, tenta estabelecer uma conexão e assina o(s) tópico(s)
'''
try:
if r.conectado:
cliente = MQTTClient('tardis12321', 'broker.hivemq.com')
cliente.set_callback(fofoqueira)
cliente.connect()
assinatura = (topComando+'/#').encode()
cliente.subscribe(assinatura)
except:
print('deu ruim 2')
ultTicks = ticks_ms()
while True:
try:
if r.conectado:
cliente.check_msg() # Necessário para verificar se chegou conteúdo mqtt
except:
print('deu ruim 3')
if ticks_diff(ticks_ms(), ultTicks) > 10000: # A cada 10s, publica o instante no formato ISO8601
try:
if r.conectado:
'''
Obtém o instante atual e armazena em t
Depois, cria uma string com o instante no formato ISO8601
Por fim, usa encode() para obter apenas os bytes do texto (objeto do tipo bytes)
publish() apenas lida com objetos do tipo bytes
'''
t = localtime()
instante = f'{t[0]}-{t[1]:02d}-{t[2]:02d}T{t[3]:02d}:{t[4]:02d}:{t[5]:02d}'
cliente.publish(topMsg, instante.encode())
except:
print ('deu ruim 4')
ultTicks = ticks_ms()
Loading
aitewinrobot-esp32c3-supermini
aitewinrobot-esp32c3-supermini