from machine import reset, Pin, ADC
from network import WLAN, STA_IF
from time import time, sleep_ms, ticks_ms
from json import dumps
from umqtt.robust import MQTTClient
import ntptime
def ativaWifi(rede, senha):
# Retorna True se consegue conectar à rede, ou False do contrário
# Faz 20 tentativas, separadas por 1s de tempo
wifi = WLAN(STA_IF)
wifi.active(True)
if not wifi.isconnected():
wifi.connect(rede, senha)
tentativas = 0
while not wifi.isconnected() and tentativas < 20:
sleep_ms(1000)
tentativas += 1
return wifi if wifi.isconnected() else None
def reconecta(wifi, rede, senha):
# Retorna True se consegue conectar à rede, ou False do contrário
# Faz 20 tentativas, separadas por 1s de tempo
if not wifi.isconnected():
wifi.connect(rede, senha)
tentativas = 0
while not wifi.isconnected() and tentativas < 20:
sleep_ms(1000)
tentativas += 1
return wifi if wifi.isconnected() else None
aTensao = ADC(Pin(32))
aCorrente = ADC(Pin(33))
cfg = {"rede" : "Wokwi-GUEST",
"senha" : "",
"intervalo" : 1000,
"clientId" : "jumaifrsrg",
"broker" : "demo.thingsboard.io",
"usuario" : "RhRPPzFs2zaBpGJV8oDD",
"password" : ""
}
topTelemetria = b'v1/devices/me/telemetry'
wifi = ativaWifi(cfg['rede'],
cfg['senha'])
if not wifi:
print ('Sem rede. Reiniciando')
sleep_ms(1500)
reset()
# Ajusta o relógio de tempo real com o serviço NTP
# O fuso horário é o UTC (GMT). 3 horas a mais que Brasil
# É o usual com serviços IoT - Globalizado
ntptime.settime()
# Conecta com o broker - no caso, o do próprio Thingsboard
# Apenas para a publicação
mqtt = MQTTClient(cfg['clientId'], cfg['broker'],
user = cfg['usuario'], password = cfg['password'])
mqtt.connect()
atualizaTelemetria = ticks_ms()
dados = {'ts': 0, 'values': {'tensao': 0.0, 'corrente': 0.0}}
while True:
if not wifi.isconnected():
reconecta(wifi, cfg['rede'], cfg['senha'])
if ticks_ms() >= atualizaTelemetria:
dados['ts'] = (time()+946684800)*1000
dados['values']['tensao'] = aTensao.read_u16()/65536*220.0
dados['values']['corrente'] = aCorrente.read_u16()/65536*100.0
print (dados)
mqtt.publish(topTelemetria, dumps(dados).encode())
atualizaTelemetria = ticks_ms() + cfg['intervalo']
print("Finalizando simulação")