# Professor Cristiano Teixeira.                             #
# Programa para enviar dados de botão e potenciometro com   #
# finalidade de executar instruções em outro ESP32 via MQTT #
#                                                           #
# Mudanças do original Sob Licença Apache 2.0               #
# Baseado no original de Copyright (C) 2022, Uri Shaked.    #
# https://wokwi.com/arduino/projects/315787266233467457     #
"""
Este projeto trabalha em conjunto com outro
MicroPython MQTT (ESP32) V2 Leitor [Prof. Cristiano]
Em:
https://wokwi.com/projects/445556187035203585
Os dois tem que estar executando ao mesmo tempo.
Para testar isolado sem o outro projeto
Para visualizar os dados:
1. Vá para http://www.hivemq.com/demos/websocket-client/
2. Clique em "Connect"
3. Em "Subscriptions", clique em "Add New Topic Subscription"
4. No campo Tópico, digite "SensorV2" e clique em "Subscribe"
Agora clique no botão da simulação,
altere a potenciômetro e você verá
a mensagem aparece no MQTT Broker, no painel "Mensagens".
"""
import network
import time
from machine import Pin, ADC
import ujson
from umqtt.simple import MQTTClient
# Configurações das portas
psensor = ADC(Pin(32))
bt=Pin(21, Pin.IN, Pin.PULL_DOWN)
#As Instruções abaixo são somente para conectar a internet no wokwi. Remova esssas linhas no projeto físico, ou ajuste para sua rede wi-fi.
print("Conectando no 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(" Conectado no Wi-Fi com Sucesso!")
#Fim da conexão Wi-fi do wokwi
# MQTT Server Parameters
MQTT_CLIENT_ID = "micropython-weather-demo"
MQTT_BROKER    = "broker.mqttdashboard.com"
MQTT_USER      = ""
MQTT_PASSWORD  = ""
MQTT_TOPIC     = "SensorV2"
def connect_mqtt():
    client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER, user=MQTT_USER, password=MQTT_PASSWORD)
    client.connect()
    return client
print("Conectando ao MQTT server... ", end="")
client = connect_mqtt()
print("Conectado!")
# Variaveis usadas
sensor_anterior = 0
tensao = 0
botao_anterior = False
botao = False
print("Realizando Medições... ", end="")
while True:    
    # Faz a leitura da tensao no Sensor 0 a 4095
    tensao = int(psensor.read())
    
    #alternância do estado da variável botao
    if bt.value() == 1:
        if botao == False:
            botao = True
        else:
            botao = False
        time.sleep(0.1)
    #acrescentado um try... except pois dava muito erro de conexão com o MQTT na versão física
    try:  
        if (tensao != sensor_anterior or botao != botao_anterior):
            print("Atualizado!")
            message = ujson.dumps({
                "Sensor": tensao,
                "Botao": botao
            })
            print("Publicando no Tópico do MQTT {}: {}".format(MQTT_TOPIC, message))
            client.publish(MQTT_TOPIC, message)
            sensor_anterior = tensao
            botao_anterior = botao
            time.sleep(1)
        #else:
            #print("Sem mudanças")
            #time.sleep(1)
    except OSError as e:
        print("Erro de conexão, tentando reconectar...")
        client = connect_mqtt()