# Wokwi - Aplicação com Sensor e Atuadores
import network
import time
from machine import Pin, ADC
import ujson
from umqtt.simple import MQTTClient
# MQTT Server Parameters
MQTT_CLIENT_ID = "wokwi-iot-demo"
MQTT_BROKER = "broker.mqttdashboard.com"
MQTT_USER = ""
MQTT_PASSWORD = ""
# Tópicos MQTT
TOPIC_SENSOR_DATA = "wokwi-sensor-data" # Enviar dados do sensor
TOPIC_LED_CONTROL = "wokwi-led-control" # Receber comandos para LEDs
# Configuração dos componentes
sensor_pin = ADC(Pin(34)) # Potenciômetro Linear
sensor_pin.atten(ADC.ATTN_11DB)
led_send = Pin(2, Pin.OUT) # LED Verde - indica envio de dados
led_receive = Pin(4, Pin.OUT) # LED Azul - indica recebimento de comando
led_status = Pin(5, Pin.OUT) # LED Vermelho - status da conexão
# Callback para mensagens MQTT recebidas
def on_message(topic, msg):
global led_receive, led_status
print(f"Mensagem recebida no tópico {topic}: {msg}")
# Piscar LED de recebimento
led_receive.on()
time.sleep(0.5)
led_receive.off()
try:
command = ujson.loads(msg.decode())
if command.get("action") == "led_on":
led_status.on()
print("LED de status ligado")
elif command.get("action") == "led_off":
led_status.off()
print("LED de status desligado")
elif command.get("action") == "blink":
# Piscar LED de status
for i in range(5):
led_status.on()
time.sleep(0.5)
led_status.off()
time.sleep(0.5)
except Exception as e:
print(f"Erro ao processar comando: {e}")
# Conectar ao WiFi
print("Conectando ao 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!")
# Conectar ao MQTT
print("Conectando ao servidor MQTT... ", end="")
client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER, user=MQTT_USER, password=MQTT_PASSWORD)
client.set_callback(on_message)
client.connect()
client.subscribe(TOPIC_LED_CONTROL)
print("Conectado!")
# Piscar LED de status para indicar conexão estabelecida
for i in range(3):
led_status.on()
time.sleep(0.5)
led_status.off()
time.sleep(0.5)
prev_sensor_value = None
counter = 0
print("Sistema iniciado! Enviando dados do sensor...")
while True:
try:
# Verificar mensagens MQTT
client.check_msg()
# Ler valor do sensor (convertendo para 0-100)
sensor_raw = sensor_pin.read()
sensor_value = round((sensor_raw / 4095) * 100, 1)
# Preparar dados para envio
sensor_data = {
"sensor_id": "lptm_001", # Linear Potentiometer
"value": sensor_value,
"unit": "%",
"timestamp": time.time(),
"counter": counter
}
# Enviar dados apenas se houve mudança significativa ou a cada 10 leituras
if prev_sensor_value is None or abs(sensor_value - prev_sensor_value) > 2 or counter % 10 == 0:
# Piscar LED de envio
led_send.on()
message = ujson.dumps(sensor_data)
client.publish(TOPIC_SENSOR_DATA, message)
print(f"Dados enviados: {sensor_data}")
prev_sensor_value = sensor_value
time.sleep(0.5)
led_send.off()
counter += 1
time.sleep(1)
except OSError as e:
print(f"Erro de conexão: {e}")
print("Tentando reconectar...")
try:
client.disconnect()
time.sleep(2)
client.connect()
client.subscribe(TOPIC_LED_CONTROL)
except:
print("Falha na reconexão")
time.sleep(5)
except Exception as e:
print(f"Erro geral: {e}")
time.sleep(1)