import machine
import ujson
import time
from machine import Pin, Timer, ADC
import network
import urequests
# 初始化DHT11传感器(假设连接到GPIO2
from lcd_api import LcdApi
from i2c_lcd import I2cLcd
class MyLcdApi(LcdApi):
def hal_write_command(self, command):
# 在这里编写将命令发送给LCD屏幕的代码
# 例如,通过GPIO通信发送命令给LCD
raise NotImplementedError("hal_write_command method not implemented in MyLcdApi")
# 初始化引脚
motion_pin = Pin(35, Pin.IN)
led_pin = Pin(2, Pin.OUT)
# 初始化I2C总线
i2c = machine.SoftI2C(scl=machine.Pin(5), sda=machine.Pin(4), freq=400000)
# 初始化LCD(假设使用I2C接口)
# 实例化I2cLcd类,这里假设LCD有4行20列
i2c = I2cLcd(i2c, 0x27, 4, 20) # 0x3F是常见的LCD I2C地址,但请根据你的实际硬件修改
lcd = MyLcdApi(4,20)
# 实例化LcdApi类,将I2cLcd实例作为参数传入
lcd.clear() # 清除LCD显示
# 设置LED初始状态为关闭
led_pin.off()
# 设置运动传感器为输入
motionsensor = machine.Pin(motion_pin, machine.Pin.IN)
# 设置读取温度数据的间隔
read_interval = 0.5
last_motion_time = time.time()
readings = []
adc = ADC(0)
def read_temperature():
global last_motion_time, readings
if time.time() - last_motion_time > 9:
# 如果超过9秒没有检测到运动,关闭LED并清除LCD
led_pin.off()
lcd.clear()
readings = []
else:
# 否则,读取温度并添加到列表中
temperature = adc.read()
if temperature is not None:
readings.append(temperature)
# 计算平均值并打印到LCD和串口
if len(readings) > 0:
avg_temp = sum(readings)/len(readings)
lcd.hal_write_data("Avg Temp: {avg_temp:.2f} C")
print(f"Avg Temp: {avg_temp:.2f} C")
# 设置定时器以定期读取温度
timer = Timer(1)
timer.init(freq=1/read_interval, mode=Timer.PERIODIC, callback=read_temperature)
try:
while True:
# 检查运动传感器状态
if motion_pin.value() == 1:
# 如果检测到运动,重置定时器(0.5秒间隔)
last_motion_time = time.time()
read_temperature()
timer.deinit()
timer.init(freq=1/(0.5), mode=Timer.PERIODIC, callback=read_temperature)
else:
# 如果没有检测到运动,设置3秒间隔
timer.deinit()
timer.init(freq=1/(3), mode=Timer.PERIODIC, callback=read_temperature)
# 等待一段时间,避免忙等
time.sleep(0.01)
except KeyboardInterrupt:
# 清理资源
timer.deinit()
lcd.clear()
led_pin.off()