# Professor Cristiano Teixeira
# 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  Sensor [Prof Cristiano]
Em:
https://wokwi.com/projects/445552442334022657
Os dois tem que estar executando ao mesmo tempo.
Para testar isolado sem o outro projeto
Abra o site:
1. http://www.hivemq.com/demos/websocket-client/
2. Click em "Connect"
3. No campo Publish, deixe o Topic como "SensorV2"
4. Escreva alguma mensagem, por exemplo: {"Botao" : True} 
5. click em "Publish"
'''
import network
import ujson
import machine
from machine import Pin, PWM, SoftI2C
from time import sleep
from umqtt.simple import MQTTClient
from lcd_api import LcdApi
from i2c_lcd import I2cLcd
'''Declaração dos Pinos'''
led=Pin(23, Pin.OUT)
# Configura os pinos dos LEDs
ledR = PWM(Pin(14))
ledG = PWM(Pin(12))
ledB = PWM(Pin(13))
ledR.freq(5000)
ledG.freq(5000)
ledB.freq(5000)
ledR.duty(0)
ledG.duty(0)
ledB.duty(0)
''' Declaro informações o I2C'''
I2C_ADDR = 0x27
totalRows = 2
totalColumns = 16
i2c = SoftI2C(scl=Pin(22), sda=Pin(21), freq=10000)
lcd = I2cLcd(i2c, I2C_ADDR, totalRows, totalColumns)
lcd.move_to(0,0)
lcd.putstr("Ligando...")
sleep(0.5)
lcd.clear()
''' Informações do Broker '''
# Configurações do MQTT
TOPIC = 'Estufa'
BROKER = 'broker.hivemq.com'
PORT = 1883
def mqtt_message(topic, msg):
    print("Recebendo mensagem:", msg)
    try:
        msg_str = msg.decode('utf-8')
        dados = ujson.loads(msg_str)
        sensor = dados["Sensor"]
        botao = dados["Botao"]
        print(f"Sensor: {sensor}")
        print(f"Botao: {botao} ")
    except:
        print("Erro ao decodificar a mensagem")
    if botao == True:
        led.on()
    else:
        led.off()
    if (sensor >= 0 and sensor < 1365):
        print("vremeio")
        ledR.duty(1023)
        ledG.duty(0)
        ledB.duty(0)
    elif (sensor >= 1365 and sensor < 2730):
        print("marelo")
        ledR.duty(512)
        ledG.duty(512)
        ledB.duty(0)
    elif (sensor >= 2730 and sensor < 4095):
        print("zul")
        ledR.duty(0)
        ledG.duty(0)
        ledB.duty(1023)
        
    lcd.clear()
    lcd.move_to(0,0)
    lcd.putstr(f"Botao: {botao} ")
    lcd.move_to(0,1)
    lcd.putstr(f"Sensor: {sensor}")
    
#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
def conectando_wifi():
    print("Conectando no WiFi...", end="")
    import network
    wifi = network.WLAN(network.STA_IF)
    wifi.active(True)
    wifi.connect("Wokwi-GUEST", "")
    while not wifi.isconnected():
        sleep(0.5)
        print(".", end="")
    print("Concectado no Wi-Fi com Sucesso!")
def conectando_mqtt():
    print("Conectando no MQTT...")
    client = MQTTClient("wokwi1", "broker.hivemq.com")
    
    client.set_callback(mqtt_message)
    
    client.connect()
    client.subscribe("SensorV2")
    print("Conectado no MQTT com Sucesso!")
    return client
conectando_wifi()
client = conectando_mqtt()
while True:
    #acrescentado um try... except pois dava muito erro de conexão com o MQTT na versão física
    try:
        client.wait_msg()
    except OSError as e:
        print("Erro de conexão, tentando reconectar...")
        client = conectando_mqtt()