# Dokumentasi Program: Pengendalian LED dan Pengiriman Data Sensor dengan MQTT
# Import library yang diperlukan
import network # Untuk koneksi WiFi
import time # Untuk fungsi delay
from machine import Pin # Untuk kontrol pin pada board
import dht # Untuk sensor DHT22
import ujson # Untuk mengolah data JSON
from umqtt.simple import MQTTClient # Untuk komunikasi MQTT
# Parameter server MQTT
MQTT_CLIENT_ID = "assignmentSIC6_Haikal_UNI238" # ID klien MQTT
MQTT_BROKER = "broker.emqx.io" # Alamat broker MQTT
MQTT_USER = "" # Nama pengguna MQTT (kosong/menyesuaikan)
MQTT_PASSWORD = "" # Kata sandi MQTT (kosong/menyesuaikan)
MQTT_TOPIC_SENSOR_DHT22 = "/UNI238/MuhammadHaikalPL/data_sensor" # Topik untuk data sensor
MQTT_TOPIC_LED_CONTROL = "/UNI238/MuhammadHaikalPL/aktuasi_led" # Topik untuk kontrol LED
# Inisialisasi pin untuk sensor dan LED
sensorSuhu = dht.DHT22(Pin(15)) # Sensor DHT22 pada pin 15
led_red = Pin(13, Pin.OUT) # LED merah pada pin 13
led_yellow = Pin(12, Pin.OUT) # LED kuning pada pin 12
led_green = Pin(14, Pin.OUT) # LED hijau pada pin 14
# Fungsi callback untuk menangani pesan MQTT yang masuk
def on_message(topic, msg):
try:
topic = topic.decode('utf-8') # Dekode topik dari byte ke string
msg = msg.decode('utf-8') # Dekode pesan dari byte ke string
print(f"Received message on topic {topic}: {msg}") # Cetak pesan yang diterima
if topic == MQTT_TOPIC_LED_CONTROL:
control_leds(msg) # Panggil fungsi kontrol LED jika topik sesuai
except Exception as e:
print(f"Error processing message: {e}") # Cetak pesan kesalahan
# Fungsi untuk mengontrol LED berdasarkan pesan yang diterima
def control_leds(message):
try:
command = ujson.loads(message) # Uraikan pesan JSON
if "msg" in command:
msg = command["msg"].lower() # Ambil perintah dan ubah ke huruf kecil
if msg == "red on":
led_red.value(1) # Nyalakan LED merah
print("Red LED turned ON")
elif msg == "red off":
led_red.value(0) # Matikan LED merah
print("Red LED turned OFF")
elif msg == "yellow on":
led_yellow.value(1) # Nyalakan LED kuning
print("Yellow LED turned ON")
elif msg == "yellow off":
led_yellow.value(0) # Matikan LED kuning
print("Yellow LED turned OFF")
elif msg == "green on":
led_green.value(1) # Nyalakan LED hijau
print("Green LED turned ON")
elif msg == "green off":
led_green.value(0) # Matikan LED hijau
print("Green LED turned OFF")
elif msg == "all on":
led_red.value(1)
led_yellow.value(1)
led_green.value(1) # Nyalakan semua LED
print("All LEDs turned ON")
elif msg == "all off":
led_red.value(0)
led_yellow.value(0)
led_green.value(0) # Matikan semua LED
print("All LEDs turned OFF")
except Exception as e:
print(f"Error controlling LEDs: {e}") # Cetak pesan kesalahan
# Koneksi ke jaringan WiFi
print("Connecting to WiFi", end="")
sta_if = network.WLAN(network.STA_IF) # Inisialisasi antarmuka WiFi
sta_if.active(True) # Aktifkan antarmuka WiFi
sta_if.connect('Wokwi-GUEST', '') # Sambungkan ke jaringan WiFi
while not sta_if.isconnected():
print(".", end="")
time.sleep(0.1) # Tunggu hingga terhubung
print(" Connected!")
# Koneksi ke server MQTT
print("Connecting to MQTT server... ", end="")
client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER, user=MQTT_USER, password=MQTT_PASSWORD) # Buat klien MQTT
client.set_callback(on_message) # Tetapkan fungsi callback untuk pesan masuk
client.connect() # Hubungkan ke broker MQTT
# Berlangganan ke topik kontrol LED
client.subscribe(MQTT_TOPIC_LED_CONTROL)
print("Connected!")
# Loop utama untuk membaca data sensor dan menangani pesan MQTT
dht22_run = "" # Variabel untuk menyimpan data sensor sebelumnya
while True:
try:
client.check_msg() # Periksa apakah ada pesan MQTT masuk
print("Running DHT22... ", end="")
sensorSuhu.measure() # Baca data suhu dan kelembaban dari sensor DHT22
message = ujson.dumps({
"temp_dht22": sensorSuhu.temperature(), # Suhu dari sensor
"humidity_dht22": sensorSuhu.humidity() # Kelembaban dari sensor
})
if message != dht22_run: # Kirim data hanya jika ada perubahan
print("Updated!")
print(f"Reporting to MQTT topic {MQTT_TOPIC_SENSOR_DHT22}: {message}")
client.publish(MQTT_TOPIC_SENSOR_DHT22, message) # Publikasikan data sensor
dht22_run = message # Perbarui data sensor sebelumnya
else:
print("No change") # Tidak ada perubahan pada data sensor
except Exception as e:
print(f"Error in main loop: {e}") # Cetak pesan kesalahan
time.sleep(1) # Tunggu 1 detik sebelum iterasi berikutnya
Muhammad Haikal. PL - Navakara - UNI238 - SIC 6 Stage 1