import machine
import time
import onewire
import ds18x20
import dht
import random
# 初始化所有硬件模块
def init_hardware():
# 1. LED指示灯 (GPIO2)
led = machine.Pin(2, machine.Pin.OUT)
# 2. 超声波传感器 (Trig=GPIO5, Echo=GPIO18)
trig = machine.Pin(5, machine.Pin.OUT)
echo = machine.Pin(18, machine.Pin.IN)
# 3. 温度传感器 (DS18B20 on GPIO22)
ds_pin = machine.Pin(22)
ds_sensor = ds18x20.DS18X20(onewire.OneWire(ds_pin))
roms = ds_sensor.scan()
# 4. 湿度传感器 (DHT11 on GPIO15)
dht_sensor = dht.DHT11(machine.Pin(15))
# 5. 烟雾传感器 (MQ-2 on GPIO34)
smoke_sensor = machine.ADC(machine.Pin(34))
smoke_sensor.atten(machine.ADC.ATTN_11DB) # 0-3.3V量程
# 6. 蜂鸣器 (GPIO25)
buzzer = machine.PWM(machine.Pin(25), freq=2000, duty=0)
return led, trig, echo, ds_sensor, roms, dht_sensor, smoke_sensor, buzzer
# 读取温度
def read_temperature(ds_sensor, roms):
if roms:
ds_sensor.convert_temp()
time.sleep_ms(750)
return ds_sensor.read_temp(roms[0])
return 0.0
# 读取湿度
def read_humidity(dht_sensor):
try:
dht_sensor.measure()
return dht_sensor.humidity()
except:
return 0.0
# 读取烟雾浓度
def read_smoke(smoke_sensor):
# 读取ADC值并转换为百分比 (0-100%)
raw_value = smoke_sensor.read()
# 模拟烟雾浓度:实际应用中应根据传感器特性调整
smoke_level = min(100, max(0, (raw_value - 500) / 30))
return smoke_level
# 超声波测距
def measure_distance(trig, echo):
# 发送超声波脉冲
trig.off()
time.sleep_us(2)
trig.on()
time.sleep_us(10)
trig.off()
# 等待回波开始
while echo.value() == 0:
pulse_start = time.ticks_us()
# 等待回波结束
while echo.value() == 1:
pulse_end = time.ticks_us()
# 计算距离 (cm)
pulse_duration = time.ticks_diff(pulse_end, pulse_start)
return pulse_duration * 0.0343 / 2
# 触发报警
def trigger_alarm(buzzer, led, alarm_active):
if alarm_active:
# 快速闪烁LED
led.value(not led.value())
# 发出警报声 (500Hz和1000Hz交替)
if time.ticks_ms() % 1000 < 500:
buzzer.freq(500)
buzzer.duty(512) # 50%占空比
else:
buzzer.freq(1000)
buzzer.duty(512)
else:
led.off()
buzzer.duty(0) # 关闭蜂鸣器
# 打印传感器数据
def print_sensor_data(temp, humidity, distance, smoke_level, alarm_active):
print("\n" + "="*40)
print(f"温度: {temp:.1f}°C 湿度: {humidity}%")
print(f"距离: {distance:.1f}cm 烟雾浓度: {smoke_level:.1f}%")
print(f"报警状态: {'激活' if alarm_active else '正常'}")
print("="*40)
# 主程序
def main():
# 硬件初始化
led, trig, echo, ds_sensor, roms, dht_sensor, smoke_sensor, buzzer = init_hardware()
# 报警阈值
SMOKE_THRESHOLD = 60 # 烟雾浓度报警阈值 (%)
# 状态变量
alarm_active = False
alarm_start_time = 0
print("六合一传感器报警系统启动...")
print(f"烟雾报警阈值: {SMOKE_THRESHOLD}%")
try:
while True:
# 1. 读取所有传感器数据
temp = read_temperature(ds_sensor, roms)
humidity = read_humidity(dht_sensor)
smoke_level = read_smoke(smoke_sensor)
# 2. 超声波测距 (模拟随机值,避免Wokwi硬件冲突)
# distance = measure_distance(trig, echo) # 实际硬件使用
distance = random.uniform(10.0, 150.0) # Wokwi模拟
# 3. 检查烟雾浓度是否超标
if smoke_level > SMOKE_THRESHOLD:
if not alarm_active:
alarm_active = True
alarm_start_time = time.ticks_ms()
print("!!! 烟雾浓度超标,触发报警 !!!")
else:
# 烟雾浓度恢复正常后,保持报警状态5秒
if alarm_active and time.ticks_diff(time.ticks_ms(), alarm_start_time) > 5000:
alarm_active = False
print("报警解除")
# 4. 触发/解除报警
trigger_alarm(buzzer, led, alarm_active)
# 5. 打印传感器数据
print_sensor_data(temp, humidity, distance, smoke_level, alarm_active)
time.sleep(1) # 主循环延时
except KeyboardInterrupt:
buzzer.deinit()
led.off()
print("程序结束")
# 启动程序
if __name__ == "__main__":
main()