from machine import Pin, I2C
import time
from WIFI import ativaWifi
from time import sleep_ms, localtime, time
from ntptime import settime
from json import dumps
from umqtt.robust import MQTTClient
import ssd1306
import mpu6050
# Definições de WiFi e MQTT
net = 'Wokwi-GUEST'
pas = ''
clientId = 'IDana_Jones'
broker = 'demo.thingsboard.io'
usuario = 'dMuFgUET7IZjYuEmL7zX'
topico = b'v1/devices/me/telemetry'
topRPCReq = 'v1/devices/me/rpc/request/'
topRPCResp = 'v1/devices/me/rpc/response/'
# Configuração do botão
chave = Pin(23, Pin.IN, Pin.PULL_DOWN)
# Função de callback para mensagens MQTT
def procMsg(t, p):
print(f'Tópico: {t}')
print(f'Mensagem: {p}')
# Conexão com WiFi
conexao, conectado = ativaWifi(net, pas)
print(conectado)
# Configuração do I2C para o OLED e MPU6050
i2c = I2C(0, scl=Pin(22), sda=Pin(21))
oled_width = 128
oled_height = 64
oled = ssd1306.SSD1306_I2C(oled_width, oled_height, i2c)
mpu = mpu6050.MPU6050(i2c)
mpu.wake()
# Variáveis para armazenar valores dos sensores
gyro = ""
accel = ""
temp = ""
# Conexão com MQTT
if conectado:
settime()
mqtt = MQTTClient(clientId, broker, user=usuario, password='')
mqtt.set_callback(procMsg)
mqtt.connect()
mqtt.subscribe((topRPCReq + '+').encode())
# Dados a serem enviados ao Thingsboard
dados = {'ts': time() * 1000, 'values': {'conta': 0, 'key': False, 'gyro': {}, 'accel': {}, 'temp': 0}}
while True:
# Verifica e processa mensagens MQTT
mqtt.check_msg()
# Leitura dos dados do MPU6050
new_gyro = mpu.read_gyro_data()
new_accel = mpu.read_accel_data()
temperature = mpu.read_temperature()
if new_gyro != gyro or new_accel != accel or temperature != temp:
gyro = new_gyro
accel = new_accel
temp = temperature
print("Gyro: " + str(gyro) + ", Accel: " + str(accel))
# Atualiza a tela OLED
oled.fill(0)
oled.text("Gyro", 0, 2)
oled.text("-----------------", 0, 10)
oled.text("x:" + str(round(gyro[0], 2)), 0, 15)
oled.text("y:" + str(round(gyro[1], 2)), 0, 25)
oled.text("z:" + str(round(gyro[2], 2)), 0, 35)
oled.text("Accel", 70, 2)
oled.text("x:" + str(round(accel[0], 2)), 70, 15)
oled.text("y:" + str(round(accel[1], 2)), 70, 25)
oled.text("z:" + str(round(accel[2], 2)), 70, 35)
oled.text("Temp", 0, 45)
oled.text("------------" + str(temperature), 0, 48)
oled.show()
# Preparando os dados para envio ao Thingsboard
dados['ts'] = (time() + 946684800) * 1000
dados['values']['conta'] += 1
dados['values']['key'] = bool(chave.value())
dados['values']['gyro'] = {'x': gyro[0], 'y': gyro[1], 'z': gyro[2]}
dados['values']['accel'] = {'x': accel[0], 'y': accel[1], 'z': accel[2]}
dados['values']['temp'] = temperature
print(dados)
# Publicando os dados no Thingsboard
payload = dumps(dados).encode()
mqtt.publish(topico, payload)
# Espera antes de ler novamente
sleep_ms(1000)