print("Hello, ESP32!")

# Importar bibliotecas
from machine import Pin, PWM
from utime import sleep
import network  # Biblioteca para conexão em rede
import time     # Biblioteca para utilização da função sleep
import machine  # Biblioteca para geração do ID único do cliente MQTT
import ubinascii # Biblioteca para geração do ID único do cliente MQTT
from umqtt.simple import MQTTClient  # Biblioteca para comunicação MQTT

from machine import Pin, PWM
import time 
servo = PWM (Pin(22))
servo.freq (50)

# Parâmetros para conexão MQTT
MQTT_CLIENT_ID = ubinascii.hexlify(machine.unique_id()).decode()  # Gera ID único
MQTT_BROKER = "broker.mqttdashboard.com"  # Endereço do broker
MQTT_USER = ""  # Usuário (caso possua)
MQTT_PASSWORD = ""  # Senha (caso possua)

# Variável que armazena o nome do tópico que atenderá a requisição
MQTT_TOPIC = "servo"




# Função que será chamada quando o ESP receber uma mensagem
def obter_mensagem(topico, mensagem):
    print("\n")
    print("Tópico recebido: %s" % (topico))
    print("Mensagem recebida: %s" % (mensagem))
    print("\n")

    if mensagem == b'abrir':
        while True:
            servo.duty_ns (500000)
            time.sleep_ms (500)
            servo.duty_ns (1500000)
            time.sleep_ms (500)
            servo.duty_ns (2500000)
            time.sleep_ms (500)
            servo.duty_ns (1500000)
            time.sleep_ms (500)
    elif mensagem == b'fechar':
        print("Fechando Porta")


    else:
        print("Mensagem não reconhecida")

# Conecta ao WiFi
print("Conectando ao WiFi", end="")
estacao = network.WLAN(network.STA_IF)
estacao.active(True)
estacao.connect('Wokwi-GUEST', '')
while not estacao.isconnected():
    print(".", end="")
    time.sleep(0.1)
print(" Conectado!")

# Conecta ao broker MQTT
print("Conectando ao servidor MQTT... ", end="")
cliente = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER, user=MQTT_USER, password=MQTT_PASSWORD)
cliente.set_callback(obter_mensagem)
cliente.connect()
cliente.subscribe(MQTT_TOPIC)
print(" Conectado!")

# Aguarda mensagens enviadas via MQTT
try:
    while True:
        cliente.check_msg()  # Use check_msg() para não bloquear a execução
        time.sleep(1)  # Adicione um pequeno delay para evitar uso excessivo da CPU

# Caso algum erro aconteça, desconecta do broker e do WiFi
finally:
    cliente.disconnect()
    estacao.disconnect()
    estacao.active(False)
    print("Fim.")