from machine import Pin
import network
from umqtt.simple import MQTTClient
import ujson # Digunakan untuk mem-parsing JSON
from time import sleep
# MQTT Server Parameters
MQTT_CLIENT_ID = "esp32-1"
MQTT_BROKER = "broker.emqx.io" # Anda bisa menggunakan IP atau hostname broker MQTT Anda
MQTT_USER = ""
MQTT_PASSWORD = ""
MQTT_CONTROL_TOPIC = "/esp/irpan/control" # Topik untuk subscribe (kontrol LED)
MQTT_STATUS_TOPIC = "/esp/irpan/status" # Topik untuk publish status LED
# Connect to WiFi
def connect_wifi():
print("Connecting to WiFi...", end="")
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
sta_if.connect('Wokwi-GUEST', '') # Ganti dengan kredensial Wi-Fi Anda
while not sta_if.isconnected():
print(".", end="")
sleep(0.1)
print("Connected to WiFi!")
# MQTT connection setup
def connect_mqtt():
client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER, user=MQTT_USER, password=MQTT_PASSWORD)
client.connect()
print("Connected to MQTT Broker!")
return client
# Callback function ketika pesan diterima
def on_message(topic, msg):
print(f"Received message: {msg}")
if msg == b"ON":
led.on()
print("LED turned ON")
# Publish the status of the LED in JSON format
status_message = ujson.dumps({"status": "ON", "device": "LED", "action": "turn_on"})
client.publish(MQTT_STATUS_TOPIC, status_message)
elif msg == b"OFF":
led.off()
print("LED turned OFF")
# Publish the status of the LED in JSON format
status_message = ujson.dumps({"status": "OFF", "device": "LED", "action": "turn_off"})
client.publish(MQTT_STATUS_TOPIC, status_message)
# Setup
connect_wifi()
client = connect_mqtt()
client.set_callback(on_message)
client.subscribe(MQTT_CONTROL_TOPIC)
print(f"Subscribed to {MQTT_CONTROL_TOPIC}")
# Pin assignment
led = Pin(15, Pin.OUT)
# Main loop
while True:
# Poll MQTT untuk pesan baru
client.check_msg()
# Optional: Publish status LED setiap 5 detik
status_message = ujson.dumps({
"status": "ON" if led.value() else "OFF",
"device": "LED",
"action": "status_update"
})
client.publish(MQTT_STATUS_TOPIC, status_message)
print(f"Published message: {status_message}")
sleep(5)