from machine import Pin, ADC, I2C, RTC
import dht
import time
import network
import ntptime
from ssd1306 import SSD1306_I2C
# 用户信息
STUDENT_NAME = "张三"
STUDENT_ID = "20230001"
# 初始化硬件
def init_hardware():
global dht_sensor, mq135, trig, echo, relay, led, oled
# 传感器
dht_sensor = dht.DHT22(Pin(DHT_PIN))
mq135 = ADC(Pin(MQ135_PIN))
mq135.atten(ADC.ATTN_11DB)
# 超声波
trig = Pin(TRIG_PIN, Pin.OUT)
echo = Pin(ECHO_PIN, Pin.IN)
# 执行器
relay = Pin(RELAY_PIN, Pin.OUT)
led = Pin(LED_PIN, Pin.OUT)
relay.value(0)
led.value(0)
# OLED
i2c = I2C(scl=Pin(OLED_SCL), sda=Pin(OLED_SDA))
oled = SSD1306_I2C(128, 64, i2c)
oled.fill(0)
oled.show()
# 同步网络时间
def sync_time():
wifi = network.WLAN(network.STA_IF)
wifi.active(True)
wifi.connect("your_wifi", "your_password")
for _ in range(10):
if wifi.isconnected():
try:
ntptime.settime()
return True
except:
break
time.sleep(1)
# 设置默认时间
rtc = RTC()
rtc.datetime((2023, 12, 1, 5, 12, 0, 0, 0))
return False
# 获取格式化时间
def get_formatted_time():
t = time.localtime()
weekday = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"][t[6]]
return "{:04d}-{:02d}-{:02d} {} {:02d}:{:02d}:{:02d}".format(
t[0], t[1], t[2], weekday, t[3], t[4], t[5])
# 显示第一屏(姓名学号+时间)
def show_screen1():
start_time = time.time()
while time.time() - start_time < 3:
oled.fill(0)
oled.text("Name: " + STUDENT_NAME, 0, 0)
oled.text("ID: " + STUDENT_ID, 0, 12)
oled.text(get_formatted_time(), 0, 24)
oled.show()
time.sleep(0.1)
# 显示第二屏(传感器数据)
def show_screen2():
# 读取传感器数据
try:
dht_sensor.measure()
temp = dht_sensor.temperature()
hum = dht_sensor.humidity()
except:
temp = hum = -1
air_quality = mq135.read()
distance = read_distance()
# 控制逻辑(温度>28度开启继电器)
if temp > 28:
relay.value(1)
else:
relay.value(0)
# 显示数据
oled.fill(0)
oled.text("Temp: {:.1f}C".format(temp), 0, 0)
oled.text("Hum: {:.1f}%".format(hum), 0, 12)
oled.text("Air: {}".format(air_quality), 0, 24)
oled.text("Dist: {}cm".format(distance), 0, 36)
oled.text("Relay: {}".format("ON" if relay.value() else "OFF"), 0, 48)
oled.show()
time.sleep(2)
# 超声波测距
def read_distance():
trig.value(0)
time.sleep_us(2)
trig.value(1)
time.sleep_us(10)
trig.value(0)
duration = time_pulse_us(echo, 1, 30000)
return (duration / 2) / 29.1 if duration > 0 else -1
# 主循环
def main():
init_hardware()
sync_time()
while True:
show_screen1()
show_screen2()
led.value(not led.value()) # 状态LED闪烁
if __name__ == "__main__":
main()