from machine import Pin, ADC
from machine import Pin, I2C
from hcsr04 import HCSR04
from machine import Timer
from time import sleep
import sh1106
import dht
# สร้างอ็อบเจ็กต์สำหรับ HCSR04
distance_sensor = HCSR04(trigger_pin=5, echo_pin=18, echo_timeout_us=10000)
# สร้างอ็อบเจ็กต์สำหรับ DHT22
dht_sensor = dht.DHT22(Pin(15))
i2c = I2C(scl=Pin(22), sda=Pin(21), freq=400000)
display = sh1106.SH1106_I2C(128, 64, i2c, Pin(16), 0x3c) # 0x3c is the I2C address of the display
tim0 = Timer(0)
ON = 1
OFF = 0
led1 = Pin(13, Pin.OUT)
led2 = Pin(12, Pin.OUT)
led3 = Pin(14, Pin.OUT)
ldr = ADC(Pin(34))
ldr.atten(ADC.ATTN_11DB) # Full range: 3.3v
ldr.width(ADC.WIDTH_12BIT) # Resolutions 12 Bit
def mycallback1(timer):
global data_ldr, volt_ldr, illumi_ldr, distance, illumi, dis, temp, humidity
# อ่านค่าระยะทางจาก HCSR04
distance = distance_sensor.distance_cm()
data_ldr = ldr.read()
volt_ldr = (3.3 / 4095) * data_ldr
illumi_ldr = 42.175 * pow(volt_ldr, -3.145)
# อ่านค่าอุณหภูมิและความชื้นจาก DHT22
dht_sensor.measure()
temp = dht_sensor.temperature()
humidity = dht_sensor.humidity()
temp_f = temp * (9/5) + 32.0
illumi_ldr = round(illumi_ldr, 2) # 2 decimal places
distance = round(distance, 2)
temp = round(temp, 2)
humidity = round(humidity, 2) # 2 decimal places
illumi = str(illumi_ldr)
dis = str(distance)
temp = str(temp)
humidity = str(humidity)
display.fill(0)
display.text('Illu =', 0, 10, 1)
display.text(illumi + 'Lux', 50, 25, 1)
display.text('Dist =', 0, 20, 1)
display.text(dis + 'cm', 50, 40, 1)
display.text('Temp =', 0, 30, 1)
display.text(temp + 'C', 50, 55, 1)
display.text('Humidity =', 0, 40, 1)
display.text(humidity + '%', 90, 70, 1)
display.show()
if distance <= 10 and illumi_ldr <= 10:
led1.value(OFF)
led2.value(OFF)
led3.value(ON)
sleep(1)
elif 10 < distance <= 20 and illumi_ldr > 10:
led1.value(OFF)
led2.value(ON)
led3.value(OFF)
sleep(1)
elif 20 < distance <= 50:
led1.value(ON)
led2.value(ON)
led3.value(OFF)
sleep(1)
elif distance > 50:
while True:
led1.value(ON)
led2.value(ON)
led3.value(OFF)
sleep(0.5)
led1.value(OFF)
led2.value(ON)
led3.value(OFF)
sleep(0.5)
return
sleep(1)
else:
led1.value(OFF)
led2.value(OFF)
led3.value(OFF)
sleep(1)
tim0.init(period=1000, mode=Timer.PERIODIC, callback=mycallback1)