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)