from machine import Pin, ADC
from umqtt.simple import MQTTClient
import ujson
import network
import time
import dht
# Device Setup
DEVICE_ID = "labs_001"
# WiFi Setup
WIFI_SSID = "Wokwi-GUEST"
WIFI_PASSWORD = ""
# MQTT Setup
MQTT_BROKER = "broker.emqx.io"
MQTT_CLIENT = DEVICE_ID
MQTT_DHT_TOPIC = "iot/dht"
MQTT_LED_TOPIC = "iot/led"
MQTT_LED_STATUS_TOPIC = "iot/led/status"
MQTT_LED_STATUS_TOPIC2 = "iot/led/status2"
# DHT Sensor Setup
DHT_PIN = Pin(15)
# Led
ledRed = Pin(12, Pin.OUT)
ledBlue = Pin(14, Pin.OUT)
# Fungsi untuk menghubungkan ke WiFi
def connect_wifi():
wifi_client = network.WLAN(network.STA_IF)
wifi_client.active(True)
print("Connecting device to WiFi")
wifi_client.connect(WIFI_SSID, WIFI_PASSWORD)
# Tunggu hingga terhubung
while not wifi_client.isconnected():
print("Connecting to WiFi...")
time.sleep(0.1)
print("WiFi Connected!")
print(wifi_client.ifconfig())
# Fungsi untuk menghubungkan ke MQTT broker
def mqtt_connect():
print("Connecting to MQTT broker ...", end="")
mqtt_client = MQTTClient(MQTT_CLIENT, MQTT_BROKER, user="", password="")
mqtt_client.set_callback(on_message)
mqtt_client.connect()
print("Connected.")
return mqtt_client
# Fungsi callback untuk menangani pesan yang diterima
def on_message(topic, msg):
print(f"Received message: {msg} on topic: {topic}")
if topic == MQTT_LED_TOPIC.encode(): # pastikan topik cocok
if msg == b'1': # nyalakan LED
ledRed.value(1)
print("LED ON")
mqtt_client_publish(mqtt_client, MQTT_LED_STATUS_TOPIC, "ON")
elif msg == b'2': # matikan LED
ledRed.value(0)
print("LED OFF")
mqtt_client_publish(mqtt_client, MQTT_LED_STATUS_TOPIC, "OFF")
elif msg == b'3': # nyalakan LED Blue
ledBlue.value(1)
print("LED Blue ON")
mqtt_client_publish(mqtt_client, MQTT_LED_STATUS_TOPIC2, "ON")
elif msg == b'4': # matikan LED Blue
ledBlue.value(0)
print("LED Blue OFF")
mqtt_client_publish(mqtt_client, MQTT_LED_STATUS_TOPIC2, "OFF")
# Fungsi untuk publish data ke MQTT broker
def mqtt_client_publish(client, topic, data):
print(f"\nUpdating MQTT Broker on topic {topic}...")
client.publish(topic, data)
print(data)
# create json data to mqtt
def create_json_data(temperature, humidity):
data = ujson.dumps({
"device_id": DEVICE_ID,
"temp": temperature,
"humidity": humidity,
"type": "sensor"
})
return data
# Connect to WiFi
connect_wifi()
# Connect to MQTT
mqtt_client = mqtt_connect()
# Subscribe ke topik untuk LED
mqtt_client.subscribe(MQTT_LED_TOPIC)
dht_sensor = dht.DHT22(DHT_PIN)
dht_value_old = ""
while True:
try:
# Cek pesan MQTT (dan panggil callback jika ada pesan)
mqtt_client.check_msg()
try:
dht_sensor.measure()
except:
pass
dht_data_new = create_json_data(dht_sensor.temperature(), dht_sensor.humidity())
# Publish nilai trimpot jika ada perubahan
if dht_data_new != dht_value_old:
mqtt_client_publish(mqtt_client, MQTT_DHT_TOPIC, str(dht_data_new))
dht_value_old = dht_data_new
except OSError as e:
print("Error: ", e)
# Jika koneksi terputus, coba reconnect
time.sleep(5)
connect_wifi()
mqtt_client = mqtt_connect()
mqtt_client.subscribe(MQTT_LED_TOPIC) # subscribe lagi setelah reconnect
time.sleep(0.1)