import time
from machine import Pin, time_pulse_us
# ---------------------- 全局参数配置 ----------------------
MIN_DISTANCE = 10 # 传感器有效最小距离(cm)
MAX_DISTANCE = 50 # 传感器有效最大距离(cm)
ULTRASONIC_TIMEOUT = 15000 # 超声波超时时间(us)
CHECK_INTERVAL = 1 # 检测间隔(s)
# ---------------------- 水位检测系统类 ----------------------
class WaterLevelSystem:
def __init__(self):
# LED配置(红、黄、绿)
self.leds = {
'red': Pin(21, Pin.OUT, value=0), # 红灯→GPIO21
'yellow': Pin(22, Pin.OUT, value=0), # 黄灯→GPIO22
'green': Pin(23, Pin.OUT, value=0) # 绿灯→GPIO23
}
# 超声波传感器配置(Trig=输出,Echo=输入)
self.sensors = [
{'trig': Pin(13, Pin.OUT), 'echo': Pin(12, Pin.IN), 'pos': 1}, # 1号传感器
{'trig': Pin(14, Pin.OUT), 'echo': Pin(27, Pin.IN), 'pos': 2}, # 2号传感器
{'trig': Pin(26, Pin.OUT), 'echo': Pin(25, Pin.IN), 'pos': 3}, # 3号传感器
{'trig': Pin(33, Pin.OUT), 'echo': Pin(32, Pin.IN), 'pos': 4} # 4号传感器
]
# 测量单个传感器距离
def _get_sensor_distance(self, sensor):
trig = sensor['trig']
echo = sensor['echo']
trig.off()
time.sleep_us(2)
trig.on()
time.sleep_us(10)
trig.off()
pulse_duration = time_pulse_us(echo, 1, ULTRASONIC_TIMEOUT)
if pulse_duration <= 0:
print(f"Sensor {sensor['pos']}: Timeout")
return 0
distance = (pulse_duration * 0.0343) / 2 # 计算距离
return round(distance, 1)
# 获取活跃传感器(检测到水位的)
def get_active_sensors(self):
active = []
for sensor in self.sensors:
dist = self._get_sensor_distance(sensor)
print(f"Sensor {sensor['pos']}: {dist}cm")
if MIN_DISTANCE <= dist <= MAX_DISTANCE:
active.append(sensor['pos'])
return active
# 判定水位状态并控制LED
def run_monitor(self):
active_sensors = self.get_active_sensors()
print(f"Active Sensors: {active_sensors}\n")
# 先关闭所有LED
for led in self.leds.values():
led.off()
# 根据状态开对应LED
if not active_sensors:
self.leds['red'].on() # 危险(无水位)
print("Status: Danger (No Water)\n")
elif active_sensors == [1]:
self.leds['yellow'].on() # 警告(低水位)
print("Status: Warning (Low Water)\n")
elif active_sensors == [1, 2]:
self.leds['green'].on() # 安全(正常水位)
print("Status: Safe (Normal Water)\n")
elif active_sensors == [1, 2, 3]:
self.leds['yellow'].on() # 警告(高水位)
print("Status: Warning (High Water)\n")
elif active_sensors == [1, 2, 3, 4]:
self.leds['red'].on() # 危险(满水位)
print("Status: Danger (Full Water)\n")
else:
print("Status: Error (Unknown Sensor State)\n")
# ---------------------- 主程序 ----------------------
if __name__ == "__main__":
water_system = WaterLevelSystem()
print("Start Water Level Monitoring...\n")
try:
while True:
water_system.run_monitor()
time.sleep(CHECK_INTERVAL)
except KeyboardInterrupt:
print("Monitoring Stopped")
# 关闭所有LED
for led in water_system.leds.values():
led.off()