from machine import Pin, SoftI2C, PWM
from machine_i2c_lcd import I2cLcd
import network
import time
import dht
import ujson
from umqtt.simple import MQTTClient
# Configurations
SSID = "Wokwi-GUEST"
PASSWORD = ""
MQTT_BROKER = "mqtt.netpie.io"
MQTT_PORT = 1883
MQTT_CLIENT_ID = "203a7c80-9864-4554-a5c6-f6389d799b9c"
MQTT_USER = "x811JmsKNPrxSgE3cZoj2PKDfvyzqNqx"
MQTT_PASSWORD = "2Wz4DZzEUp2nUeuqM3D28Et6c8nYU5fS"
MQTT_TOPIC_SHADOW = "@shadow/data/update"
MQTT_TOPIC_CONTROL = "@msg/operator"
# Pin Definitions
duty_cycle = 512 # ค่า PWM เริ่มต้น (เริ่มต้นท้ายช่วง 0-1023)
LED_PINS = [Pin(2, Pin.OUT), Pin(0, Pin.OUT), Pin(4, Pin.OUT), Pin(16, Pin.OUT)]
LDR_PIN = Pin(15, Pin.OUT)
LEDLDR_PIN = Pin(17, Pin.OUT)
BUZZER_PIN = PWM(Pin(18))
BUTTON_PINS = [Pin(27, Pin.IN), Pin(26, Pin.IN), Pin(25, Pin.IN), Pin(33, Pin.IN)]
DHT_PIN = Pin(14)
dht_sensor = dht.DHT22(DHT_PIN)
# LCD Configurations
I2C_ADDR = 0x27
I2C_NUM_ROWS = 2
I2C_NUM_COLS = 16
i2c = SoftI2C(sda=Pin(23), scl=Pin(22), freq=400000)
lcd = I2cLcd(i2c, I2C_ADDR, I2C_NUM_ROWS, I2C_NUM_COLS)
# Connect to WiFi
def connect_wifi():
lcd.putstr("Connecting WiFi")
wifi = network.WLAN(network.STA_IF)
wifi.active(True)
wifi.connect(SSID, PASSWORD)
while not wifi.isconnected():
lcd.putstr(".")
time.sleep(0.5)
lcd.clear()
lcd.putstr("WiFi Connected")
print("WiFi Connected:", wifi.ifconfig())
# MQTT Callback
def mqtt_callback(topic, msg):
print("Received:", topic.decode(), msg.decode())
if topic.decode() == MQTT_TOPIC_CONTROL:
command = msg.decode().upper()
if command == "ON":
LED_PINS[0].value(1) # เปิด LED 1
#lcd.putstr("LED1 ON")
elif command == "OFF":
LED_PINS[0].value(0) # ปิด LED 1
#lcd.putstr("LED1 OFF")
elif command == "LED2ON":
LED_PINS[1].value(1) # เปิด LED 2
#lcd.putstr("LED2 ON")
elif command == "LED2OFF":
LED_PINS[1].value(0) # ปิด LED 2
#lcd.putstr("LED2 OFF")
elif command == "LED3ON":
LED_PINS[2].value(1) # เปิด LED 3
#lcd.putstr("LED3 ON")
elif command == "LED3OFF":
LED_PINS[2].value(0) # ปิด LED 3
#lcd.putstr("LED3 OFF")
elif command == "LED4ON":
LED_PINS[3].value(1) # เปิด LED 4
#lcd.putstr("LED4 ON")
elif command == "LED4OFF":
LED_PINS[3].value(0) # ปิด LED 4
#lcd.putstr("LED4 OFF")
# Check Buttons การกดปุ่ม manual
def check_buttons():
for i, button in enumerate(BUTTON_PINS):
if button.value() == 0:
LED_PINS[i].value(not LED_PINS[i].value())
time.sleep(0.1)
# Check Flame (LDR)
def check_flame():
ldr_value = LDR_PIN.value()
LEDLDR_PIN.value(ldr_value)
print("LDR Value:", ldr_value)
# Main Program
def main():
connect_wifi()
# Setup MQTT Client
client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER, user=MQTT_USER, password=MQTT_PASSWORD)
client.set_callback(mqtt_callback)
client.connect()
client.subscribe(MQTT_TOPIC_CONTROL)
lcd.clear()
lcd.putstr("MQTT Connected")
print("MQTT Connected")
try:
while True:
# Read MQTT messages
client.check_msg()
# Read DHT sensor
dht_sensor.measure()
temperature = dht_sensor.temperature()
humidity = dht_sensor.humidity()
# Read LDR value เพราะอันแรกอยู่ def อื่นโปรแกรมหาไม่เจอ เอาแค่ให้อ่านค่าพอ
ldr_value = LDR_PIN.value()
Bt1_state = LED_PINS[0].value()
Bt2_state = LED_PINS[1].value()
Bt3_state = LED_PINS[2].value()
Bt4_state = LED_PINS[3].value()
# Display on LCD
lcd.clear()
lcd.putstr(f"T:{temperature:.1f}C H:{humidity:.1f}%")
# Publish sensor data
payload = ujson.dumps({"data": {"temperature": temperature, "humidity": humidity,"Flame Detection":ldr_value,
'BT1 Value':Bt1_state,'BT2 Value':Bt2_state,'BT3 Value':Bt3_state,'BT4 Value':Bt4_state}})
client.publish(MQTT_TOPIC_SHADOW, payload)
print("Published:", payload)
# Check buttons and flame sensor
check_buttons()
check_flame()
time.sleep(1)
except Exception as e:
print("Error:", e)
lcd.clear()
lcd.putstr("Error Occurred")
client.disconnect()
time.sleep(2)
main()
# Run Main Program
if __name__ == "__main__":
main()