from machine import Pin, I2C, ADC, Timer
import onewire
import ds18x20
from ssd1306 import SSD1306_I2C
import time
# 硬件引脚定义(对应你的接线)
# OLED屏幕(I2C)
i2c = I2C(0, scl=Pin(22), sda=Pin(21)) # SCL接22,SDA接21
oled = SSD1306_I2C(128, 64, i2c)
# DS18B20温度传感器(单总线)
ds_pin = Pin(4) # DATA接4
ds_sensor = ds18x20.DS18X20(onewire.OneWire(ds_pin))
# PIR人体传感器
pir = Pin(14, Pin.IN) # OUT接14
# LDR光照传感器(AO接34)
ldr = ADC(Pin(34))
ldr.atten(ADC.ATTN_11DB) # 量程0-3.3V
# 继电器(控制设备)
relay = Pin(25, Pin.OUT)
relay.value(0) # 初始关闭
# 全局变量
temperature = 0.0
is_people_near = False
light_level = 0
device_state = False
# 读取传感器数据
def read_sensors(timer):
global temperature, is_people_near, light_level
# 读取DS18B20温度
roms = ds_sensor.scan()
if roms:
ds_sensor.convert_temp()
time.sleep_ms(750)
temperature = ds_sensor.read_temp(roms[0])
# 读取PIR
is_people_near = pir.value() == 1
# 读取LDR
light_level = ldr.read()
# 智能控制逻辑
def smart_control(timer):
global device_state
# 光照弱(<500)且无人时开设备
if light_level < 500 and not is_people_near:
device_state = True
relay.value(1)
else:
device_state = False
relay.value(0)
# 显示数据到OLED
def show_data(timer):
oled.fill(0) # 清屏
# 显示温度
oled.text(f"Temp: {temperature:.1f}C", 0, 0)
# 显示人体检测
oled.text(f"People: {'Yes' if is_people_near else 'No'}", 0, 16)
# 显示光照
oled.text(f"Light: {light_level}", 0, 32)
oled.text(f"({ 'Low' if light_level < 500 else 'High' })", 0, 42)
# 显示设备状态
oled.text(f"Device: {'ON' if device_state else 'OFF'}", 0, 56)
oled.show() # 刷新显示
# 定时任务(每1秒执行一次)
timer1 = Timer(0)
timer1.init(period=1000, mode=Timer.PERIODIC, callback=read_sensors)
timer2 = Timer(1)
timer2.init(period=1000, mode=Timer.PERIODIC, callback=smart_control)
timer3 = Timer(2)
timer3.init(period=1000, mode=Timer.PERIODIC, callback=show_data)
# 主循环(保持运行)
while True:
time.sleep(1)