import paho.mqtt.client as mqtt
import Adafruit_DHT
import time
# Konstanta untuk DHT22
DHT_SENSOR = Adafruit_DHT.DHT22
DHT_PIN = 12
LED_PIN = 15
# Inisialisasi GPIO
try:
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(LED_PIN, GPIO.OUT)
GPIO.output(LED_PIN, GPIO.LOW) # Pastikan LED mati saat mulai
except ImportError:
print("Raspberry Pi GPIO library not found. Running in simulation mode.")
GPIO = None
# Variabel untuk menyimpan nilai terakhir
last_suhu = None
last_kelembaban = None
# Callback untuk koneksi berhasil
def on_connect(client, userdata, flags, rc):
print("Terhubung ke broker MQTT dengan kode status: ", rc)
client.subscribe("tes/led")
# Callback untuk pesan diterima
def on_message(client, userdata, msg):
global GPIO
print(f"Pesan diterima di topik: {msg.topic}, payload: {msg.payload.decode()}")
if msg.topic == "tes/led":
if msg.payload.decode().upper() == "ON":
if GPIO:
GPIO.output(LED_PIN, GPIO.HIGH) # Nyalakan LED
print("LED dinyalakan")
elif msg.payload.decode().upper() == "OFF":
if GPIO:
GPIO.output(LED_PIN, GPIO.LOW) # Matikan LED
print("LED dimatikan")
else:
print("Payload tidak dikenali untuk kontrol LED")
# Fungsi untuk menerbitkan data sensor
def publish_data(client):
global last_suhu, last_kelembaban
kelembaban, suhu = Adafruit_DHT.read_retry(DHT_SENSOR, DHT_PIN)
if kelembaban is None or suhu is None:
print("Gagal membaca dari sensor DHT22!")
return
if suhu != last_suhu or kelembaban != last_kelembaban:
last_suhu = suhu
last_kelembaban = kelembaban
pesan = f"Suhu: {suhu:.2f} C, Kelembaban: {kelembaban:.2f} %"
client.publish("tes/1", pesan, qos=1, retain=True)
print("Pesan diterbitkan: ", pesan)
else:
print("Tidak ada perubahan, tidak menerbitkan pesan.")
# Setup MQTT client
client = mqtt.Client("uniqueClientID")
client.on_connect = on_connect
client.on_message = on_message
# Koneksi ke broker
BROKER = "broker.emqx.io"
client.will_set("tes/status", "disconnected", qos=1, retain=True)
client.connect(BROKER, 1883, 60)
# Loop utama
try:
client.loop_start()
while True:
publish_data(client)
time.sleep(15)
except KeyboardInterrupt:
print("Program dihentikan.")
finally:
if GPIO:
GPIO.cleanup()
client.loop_stop()
client.disconnect()