import network
import time
from machine import Pin
import dht
import ujson
from umqtt.simple import MQTTClient
# Konfigurasi MQTT
MQTT_CLIENT_ID = "irpan_sic"
MQTT_BROKER = "broker.emqx.io" # Ganti jika menggunakan broker lain
MQTT_USER = ""
MQTT_PASSWORD = ""
MQTT_TOPIC_PUB = "/UNI381/irpan_haris/data_sensor"
MQTT_TOPIC_SUB = "/UNI381/irpan_haris/aktuasi_led"
# Inisialisasi sensor DHT22 dan LED
sensor = dht.DHT22(Pin(15))
led = Pin(14, Pin.OUT)
# Fungsi koneksi WiFi
def connect_wifi(ssid, password):
print("Connecting to WiFi", end="")
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
sta_if.connect(ssid, password)
while not sta_if.isconnected():
print(".", end="")
time.sleep(0.5)
print(" Connected!")
print("IP Address:", sta_if.ifconfig()[0])
# Callback untuk menerima pesan MQTT
def on_message(topic, msg):
print("Received message from topic {}: {}".format(topic.decode(), msg.decode()))
# Pastikan pesan berupa plain text "ON" atau "OFF"
command = msg.decode()
if command == "ON":
led.value(1) # Menyalakan LED
print("LED turned ON!")
# Publikasi status LED dan suhu terakhir
client.publish(MQTT_TOPIC_PUB, status_message)
print("Published LED status and sensor data: {}".format(status_message))
elif command == "OFF":
led.value(0) # Mematikan LED
print("LED turned OFF!")
# Publikasi status LED dan suhu terakhir
client.publish(MQTT_TOPIC_PUB, status_message)
print("Published LED status and sensor data: {}".format(status_message))
else:
print("Unknown command received: {}".format(command))
# Fungsi utama
def main():
try:
# Koneksi ke WiFi
connect_wifi("Wokwi-GUEST", "")
# Koneksi ke server MQTT
print("Connecting to MQTT server... ", end="")
client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER, user=MQTT_USER, password=MQTT_PASSWORD)
client.set_callback(on_message)
client.connect()
print("Connected!")
# Subscribe ke topic
client.subscribe(MQTT_TOPIC_SUB)
# Loop utama
while True:
try:
print("Measuring temperature and humidity...")
sensor.measure() # Mengukur suhu dan kelembapan
temperature = sensor.temperature()
humidity = sensor.humidity()
led_status = "ON" if led.value() == 1 else "OFF"
# Menampilkan hasil
print("Temperature: {}°C, Humidity: {}%, LED Status: {}".format(temperature, humidity, led_status))
# Mengirim data ke MQTT
message = ujson.dumps({
"temperature": temperature,
"humidity": humidity,
"led_status": led_status
})
client.publish(MQTT_TOPIC_PUB, message)
print("Published to {}: {}".format(MQTT_TOPIC_PUB, message))
# Logika aktuasi LED dengan data tambahan suhu
if temperature >= 40:
print("Temperature exceeds 40°C! Turning LED ON.")
led.value(1)
actuate_message = ujson.dumps({
"status": "ON",
"temperature": temperature
})
client.publish(MQTT_TOPIC_SUB, actuate_message)
else:
print("Temperature below 40°C. Turning LED OFF.")
led.value(0)
actuate_message = ujson.dumps({
"status": "OFF",
"temperature": temperature
})
client.publish(MQTT_TOPIC_SUB, actuate_message)
except OSError as e:
print("Failed to read sensor data:", e)
# Mengecek pesan MQTT
client.check_msg()
# Delay sebelum pengukuran berikutnya
time.sleep(2)
except Exception as e:
print("An error occurred:", e)
finally:
print("Cleaning up...")
led.value(0) # Memastikan LED mati saat program berhenti
# Menjalankan program utama
if __name__ == "__main__":
main()