import network
import time
from machine import Pin, I2C, PWM
import ssd1306
import dht
# ตัวแปรสำหรับเก็บสถานะระบบ
wifi_connected = False
current_angle = 0 # เก็บค่ามุมปัจจุบันของมอเตอร์
# 1. ตั้งค่า Pin สำหรับหลอด LED (GP18)
led = Pin(18, Pin.OUT)
led.value(0)
# 2. ตั้งค่า I2C สำหรับจอ OLED (SDA=GP16, SCL=GP17)
i2c = I2C(0, sda=Pin(16), scl=Pin(17))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
# 3. ตั้งค่าเซ็นเซอร์ DHT22 (GP20)
sensor = dht.DHT22(Pin(20))
# 4. ตั้งค่า Servo Motor (GP14)
servo = PWM(Pin(14))
servo.freq(50)
def set_servo_angle(angle):
global current_angle
current_angle = angle # อัปเดตค่ามุมปัจจุบันเพื่อนำไปแสดงผลบนจอ
# คำนวณค่า Duty Cycle สำหรับองศา 0-180
min_duty = 1638
max_duty = 8192
duty = int(min_duty + (max_duty - min_duty) * (angle / 180))
servo.duty_u16(duty)
print(">> สั่ง Servo หมุนไปที่: {} องศา".format(angle))
# 5. ตั้งค่าปุ่มกดทั้ง 3 ตัว (GP27, GP22, GP28)
sw_yellow = Pin(27, Pin.IN)
sw_red = Pin(22, Pin.IN)
sw_green = Pin(28, Pin.IN)
# --- ฟังก์ชันการทำงานเมื่อกดปุ่ม (ทำงานเมื่อ Wi-Fi เชื่อมต่อแล้วเท่านั้น) ---
def yellow_pressed(pin):
if wifi_connected:
set_servo_angle(0)
def red_pressed(pin):
if wifi_connected:
set_servo_angle(45)
def green_pressed(pin):
if wifi_connected:
set_servo_angle(90)
# ตั้งค่า Interrupt ให้ทำงานเมื่อมีการกดปุ่ม
sw_yellow.irq(trigger=Pin.IRQ_RISING, handler=yellow_pressed)
sw_red.irq(trigger=Pin.IRQ_RISING, handler=red_pressed)
sw_green.irq(trigger=Pin.IRQ_RISING, handler=green_pressed)
# ---------------------------------------------------
# ข้อมูล Wi-Fi ของระบบจำลอง Wokwi
ssid = "Wokwi-GUEST"
password = ""
def connect_wifi():
global wifi_connected
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid, password)
oled.fill(0)
oled.text("Connecting to", 0, 0)
oled.text("WiFi...", 0, 15)
oled.show()
print("กำลังเชื่อมต่อ Wi-Fi...")
while not wlan.isconnected():
led.value(0)
time.sleep(0.5)
ip_address = wlan.ifconfig()[0]
print("เชื่อมต่อสำเร็จ! IP:", ip_address)
led.value(1) # LED ติดค้าง
wifi_connected = True # อนุญาตให้ปุ่มกดทำงานได้
return ip_address
# เริ่มทำงานเชื่อมต่อ Wi-Fi
ip = connect_wifi()
# เมื่อต่อ Wi-Fi สำเร็จ ให้มอเตอร์ไปที่ตำแหน่งเริ่มต้น (0 องศา)
set_servo_angle(0)
# --- ส่วนของการจัดการเวลาสำหรับ DHT22 ---
# สร้างตัวแปรสำหรับเก็บเวลาครั้งล่าสุดที่อ่านค่าเซ็นเซอร์
# เราลบเวลาไป 300,000 เพื่อให้โปรแกรมอ่านค่าทันทีในรอบแรกสุด
dht_interval = 5 * 60 * 1000 # 5 นาที (แปลงเป็นมิลลิวินาที)
last_dht_read = time.ticks_ms() - dht_interval
temp = 0.0
hum = 0.0
# ลูปการทำงานหลัก
while True:
current_time = time.ticks_ms()
# ตรวจสอบว่าเวลาผ่านไปครบ 5 นาที (300,000 มิลลิวินาที) หรือยัง
if time.ticks_diff(current_time, last_dht_read) >= dht_interval:
try:
sensor.measure()
temp = sensor.temperature()
hum = sensor.humidity()
print("อัปเดตค่า DHT22 -> Temp: {:.1f} C, Hum: {:.1f} %".format(temp, hum))
except OSError as e:
print("ไม่สามารถอ่านค่าจากเซ็นเซอร์ได้")
# อัปเดตเวลาล่าสุดที่อ่านค่าเสร็จ
last_dht_read = current_time
# วาดข้อมูลลงบนจอ OLED ตลอดเวลา
# (ทำให้เวลาเรากดปุ่มแล้วองศา Servo เปลี่ยน ตัวเลขบนจอจะเปลี่ยนตามทันที ไม่ต้องรอ 5 นาที)
oled.fill(0)
oled.text("IP: {}".format(ip), 0, 0)
oled.text("Temp: {:.1f} C".format(temp), 0, 15)
oled.text("Hum: {:.1f} %".format(hum), 0, 30)
oled.text("Servo: {} deg".format(current_angle), 0, 45)
oled.show()
# หน่วงเวลาลูปสั้นๆ เพียง 0.1 วินาที เพื่อไม่ให้บอร์ดประมวลผลหนักเกินไป
time.sleep(0.1)