Untitled

 avatar
unknown
plain_text
16 days ago
4.2 kB
1
Indexable
# Quadran1
# Universitas Diponegoro
# UNI037

from umqtt.simple import MQTTClient
import network
import time
import ujson
from machine import Pin, Timer, ADC
import dht

# Config Pin
led1 = Pin(2, Pin.OUT)      
dht22 = dht.DHT22(Pin(15))  

# Config Wifi
WIFI_SSID = "Wokwi-GUEST"
WIFI_PASSWORD = ""

# Config MQTT
MQTT_BROKER = "broker.emqx.io"
MQTT_PORT = 1883
MQTT_CLIENT_ID = "quadran1_mqttx_UNI037"

# Topic Configuration
MQTT_TOPIC_SENSOR = "/UNI037/Quadran1/Sensor"
MQTT_TOPIC_LED = "/UNI037/Quadran1/LedKontrol"

# Function untuk koneksi ke Wifi nya
def connect_wifi():
    print("Koneksiin WiFi...", end="")
    sta_if = network.WLAN(network.STA_IF)
    sta_if.active(True)
    sta_if.connect(WIFI_SSID, WIFI_PASSWORD)
    retry = 0
    while not sta_if.isconnected() and retry < 10:
        print(".", end="")
        time.sleep(1)
        retry += 1
    if sta_if.isconnected():
        print("\nWiFi Terkoneksi!")
        print("IP:", sta_if.ifconfig()[0])
        return True
    else:
        print("\nWiFi Gagal Terkoneksi!")
        return False

# Function untuk koneksi ke MQTT
def connect_mqtt():
    try:
        print("Koneksiin MQTT...", end="")
        client = MQTTClient(
            client_id=MQTT_CLIENT_ID,
            server=MQTT_BROKER,
            port=MQTT_PORT,
            keepalive=60
        )
        client.connect()
        print(" Terkoneksi!")
        return client
    except Exception as e:
        print(" GAGAL!")
        print("Error:", str(e))
        return None

# Function untuk callback MQTT
def mqtt_callback(topic, msg):
    try:
        print("Pesan Diterima:")
        print("Topic:", topic.decode())
        print("Pesan:", msg.decode())
        
        if topic.decode() == MQTT_TOPIC_LED:
            command = msg.decode().upper()
            # If-else perintah penghidupan LED
            if command == "ON LED 1":
                led1.on()
                print("LED 1 HIDUP")
            elif command == "OFF LED 1":
                led1.off()
                print("LED 1 MATI")
    except Exception as e:
        print("Callback error:", str(e))

# Function untuk mengambil data dari sensor
def get_sensor_data():
    try:
        dht22.measure()  # Mengambil pengukuran dari dht22
        temperature = dht22.temperature()  # Read suhu
        humidity = dht22.humidity()  # Read kelembaban
        return {
            "temperature": round(temperature, 2),
            "humidity": round(humidity, 2),
        }
    except Exception as e:
        print("Error reading sensor:", str(e))
        return {
            "temperature": 0,
            "humidity": 0,
        }

# Function utama
def main():
    # Connect ke Wifi
    if not connect_wifi():
        return
    
    # Connect ke MQTT
    client = connect_mqtt()
    if client is None:
        return
    
    # Setup callback dan subscribe
    try:
        client.set_callback(mqtt_callback)
        client.subscribe(MQTT_TOPIC_LED)
        print(f"Subscribe ke {MQTT_TOPIC_LED}")
        
        # Main loop
        print("Memulai...")
        while True:
            try:
                # Check incoming messages
                client.check_msg()
                
                # Get and publish sensor data
                sensor_data = get_sensor_data()
                message = ujson.dumps(sensor_data)
                client.publish(MQTT_TOPIC_SENSOR, message)
                print(f"Publish: {message}")
                
                time.sleep(5)
                
            except Exception as e:
                print("Loop error:", str(e))
                time.sleep(5)
                try:
                    client.connect()
                except:
                    print("GAGAL")
                    
    except Exception as e:
        print("Setup error:", str(e))

# Running programnya
if __name__ == "__main__":
    while True:
        try:
            main()
        except Exception as e:
            print("Main error:", str(e))
            print("Restarting dalam 10 detik...")
            time.sleep(10)
Leave a Comment