from machine import Pin, I2C, Timer
from hcsr04 import HCSR04
import sh1106
from machine import PWM, ADC
import utime
# กำหนดขาต่อกับ Ultrasonic Sensor
sensor = HCSR04(trigger_pin=5, echo_pin=18, echo_timeout_us=10000)
# กำหนดขา LDR senser
ldr_pin = Pin(34)
ldr = ADC(ldr_pin)
ldr.atten(ADC.ATTN_11DB) # Full range: 3.3v
ldr.width(ADC.WIDTH_12BIT) # Resolutions 12 Bit
# กำหนดขาต่อกับ Servo Motor
servo_pin = Pin(23)
servo = PWM(servo_pin, freq=50)
servo_open = 70
servo_closed = 120
servo_opened = False
# กำหนดขาต่อกับ LED
led1 = Pin(13, Pin.OUT)
# กำหนด I2C
i2c = I2C(scl=Pin(22), sda=Pin(21), freq=400000)
# กำหนดแบบจอ OLED
display = sh1106.SH1106_I2C(128, 64, i2c, Pin(16), 0x3c)
# กำหนด Timer
tim0 = Timer(0)
ultrasonic_timer = Timer(1)
# กำหนดค่า ON และ OFF
ON = 1
OFF = 0
# กำหนดระยะเปิดประตู
open_distance = 20
# ค่าคงที่สำหรับการแปลงค่า LDR เป็น Lux (ต้องปรับค่านี้ตามค่าความไวของ LDR ของคุณ)
ldr_factor = 500 # ตัวอย่างเท่านี้ ค่าที่ถูกต้องต้องถูกปรับให้เหมาะสม
# ฟังก์ชันเปิดหรือปิด Servo Motor
def toggle_servo_state():
global servo_opened
if servo_opened:
servo.duty(servo_closed)
servo_opened = False
else:
servo.duty(servo_open)
servo_opened = True
# ฟังก์ชัน callback สำหรับ Ultrasonic Sensor
def ultrasonic_callback(timer):
distance = sensor.distance_cm()
print("ระยะทาง: {:.2f} เซนติเมตร".format(distance))
if distance < open_distance:
# เปิดประตู
servo.duty(servo_open)
print("เปิดประตู")
else:
# ปิดประตู
servo.duty(servo_closed)
print("ปิดประตู")
utime.sleep(1) # หน่วยเวลา: วินาที
# ฟังก์ชัน callback สำหรับ Timer
def mycallback1(timer):
global led1
global servo_opened
# อ่านค่า LDR
ldr_value = ldr.read()
# แปลงค่า LDR เป็น Lux
illuminance_ldr = ldr_value / ldr_factor
distance = sensor.distance_cm()
led1.value(ON if distance < open_distance else OFF)
display.fill(0)
display.text('hello ', 0, 5, 1)
display.text('light = {:.2f} Lux'.format(illuminance_ldr), 0, 25, 1)#แสดง แสงชึ้นจอ
display.text('Dist = {:.2f} cm'.format(distance), 0, 40, 1)
display.show()
if servo_opened:
display.text('Welcome', 0, 55, 1)
else:
display.text('Welcome', 0, 55, 1)
display.show()
# กำหนดค่าเริ่มต้นให้ servo ปิด
servo_opened = False
# ตั้งค่า Timer สำหรับวัดระยะทางโดยใช้ Ultrasonic Sensor
ultrasonic_timer.init(period=2000, mode=Timer.PERIODIC, callback=ultrasonic_callback)
# ตั้งค่า Timer สำหรับอ่านข้อมูลและควบคุม LED, Servo Motor, และแสดงบนหน้าจอ OLED
tim0.init(period=1000, mode=Timer.PERIODIC, callback=mycallback1)
# ให้โปรแกรมทำงานตลอดเวลา
while True:
pass