编写程序实现智能饮水机水温检测,水温适用饮用时,绿灯常亮,不用试水温。

发布时间:2026/5/22 22:05:32

编写程序实现智能饮水机水温检测,水温适用饮用时,绿灯常亮,不用试水温。 智能饮水机水温检测系统 - 免试温智能提醒方案一、实际应用场景描述某高校智慧校园建设项目中学生宿舍配备了新一代智能饮水机。该饮水机具备精确的水温控制功能可提供常温、45℃冲奶、85℃泡茶、100℃开水等多种温度模式。然而在实际使用中学生经常遇到以下问题接水时不知道水温是否合适特别是需要给宝宝冲奶粉的新生代父母、喜欢喝茶的老教授、以及赶时间的上班族。传统方式是用手背试探水温或等待饮水机显示屏的数字变化既不安全也不便捷。本系统旨在通过智能检测在水温达到适宜饮用温度时自动点亮绿色指示灯实现免试温的安全饮水体验。二、引入痛点1. 安全隐患用手试高温水易造成烫伤特别是儿童和不敏感人群2. 效率低下需要等待观察数字显示或反复试探影响接水效率3. 判断标准不一不同用途对水温要求不同个人感知存在误差4. 特殊人群困扰老人、孕妇、残障人士难以准确判断水温5. 资源浪费因水温不当导致重新加热或倒掉重接浪费水电三、核心逻辑讲解3.1 适宜饮水温度标准饮水用途 适宜温度范围 指示灯状态 提示语直接饮用(常温) 15-35℃ 蓝灯 可直接饮用冲调饮品 40-55℃ 绿灯 温度适宜放心饮用泡茶咖啡 75-90℃ 橙灯 适合冲泡开水消毒 95℃ 红灯 高温消毒请勿直饮3.2 核心算法流程温度传感器采集 → 温度值滤波处理 → 用途匹配判断 → 指示灯控制 → 语音/文字提示3.3 关键技术要点- 滑动平均滤波消除传感器噪声提高温度读取稳定性- 温度区间映射将连续温度值映射到离散的用途类别- GPIO控制通过树莓派/Arduino接口控制LED指示灯- 状态机设计管理饮水机的不同工作状态四、代码模块化实现项目结构smart_water_dispenser/├── main.py # 主程序入口├── temperature_sensor.py # 温度传感器模块├── water_temperature_analyzer.py # 水温分析模块├── led_controller.py # LED指示灯控制模块├── notification_service.py # 通知服务模块├── config.py # 配置文件├── utils.py # 工具函数模块└── README.md # 项目说明文档4.1 配置文件 (config.py)智能饮水机配置文件功能集中管理系统配置参数作者全栈开发工程师版本1.0from dataclasses import dataclass, fieldfrom typing import Dict, Tuple, Listdataclassclass TemperatureConfig:温度配置数据类定义各用途的温度范围和对应属性# 温度区间定义 (min_temp, max_temp)TEMPERATURE_RANGES: Dict[str, Tuple[float, float]] field(default_factorylambda: {cold: (0, 15), # 冷水room_temp: (15, 35), # 常温直饮warm_drink: (40, 55), # 冲奶/蜂蜜水tea_coffee: (75, 90), # 泡茶/咖啡boiling: (95, 100) # 开水})# 温度区间对应的LED颜色LED_COLORS: Dict[str, str] field(default_factorylambda: {cold: blue,room_temp: cyan,warm_drink: green, # 核心适宜饮用绿灯tea_coffee: orange,boiling: red})# 温度区间对应的提示信息MESSAGES: Dict[str, str] field(default_factorylambda: {cold: ❄️ 冷水适合夏季解暑,room_temp: 常温可直接饮用,warm_drink: ✅ 温度适宜放心饮用, # 核心提示tea_coffee: ☕ 适合冲泡茶饮咖啡,boiling: ⚠️ 高温开水请勿直饮})# 适宜饮用温度阈值用于绿灯判断SUITABLE_DRINKING_MIN: float 40SUITABLE_DRINKING_MAX: float 55dataclassclass SensorConfig:传感器配置数据类SENSOR_TYPE: str DS18B20 # 温度传感器型号READ_INTERVAL: float 1.0 # 读取间隔秒FILTER_WINDOW_SIZE: int 5 # 滑动平均窗口大小CALIBRATION_OFFSET: float 0.0 # 校准偏移量dataclassclass HardwareConfig:硬件配置数据类# GPIO引脚定义树莓派BCM编码LED_PINS: Dict[str, int] field(default_factorylambda: {red: 17,green: 27, # 核心绿灯引脚blue: 22,orange: 23})# LED亮度 (0-100)LED_BRIGHTNESS: int 80# 蜂鸣器引脚可选BUZZER_PIN: int 24dataclassclass NotificationConfig:通知配置数据类ENABLE_VOICE: bool True # 启用语音提示ENABLE_DISPLAY: bool True # 启用屏幕显示VOICE_VOLUME: int 70 # 语音音量 (0-100)DISPLAY_DURATION: float 3.0 # 显示持续时间秒# 全局配置实例TEMP_CONFIG TemperatureConfig()SENSOR_CONFIG SensorConfig()HARDWARE_CONFIG HardwareConfig()NOTIFICATION_CONFIG NotificationConfig()# 便利函数获取适宜饮用温度区间def get_suitable_drinking_range() - Tuple[float, float]:返回适宜饮用的温度区间return (TEMP_CONFIG.SUITABLE_DRINKING_MIN, TEMP_CONFIG.SUITABLE_DRINKING_MAX)# 便利函数判断是否为适宜饮用温度def is_suitable_for_drinking(temperature: float) - bool:判断给定温度是否适宜饮用min_temp, max_temp get_suitable_drinking_range()return min_temp temperature max_temp4.2 温度传感器模块 (temperature_sensor.py)温度传感器模块功能模拟/读取水温传感器数据提供稳定的温度读数作者全栈开发工程师版本1.0import timeimport randomfrom typing import Optional, Generatorfrom dataclasses import dataclassfrom config import SensorConfig, TEMP_CONFIGdataclassclass TemperatureReading:温度读数数据类包含原始值和滤波后的值raw_value: float # 原始传感器值filtered_value: float # 滤波后的值timestamp: float # 读取时间戳is_valid: bool # 数据有效性标志class TemperatureSensor:温度传感器类支持模拟模式和真实硬件模式def __init__(self, sensor_config: SensorConfig None, simulation_mode: bool True):初始化温度传感器参数:sensor_config: 传感器配置simulation_mode: 是否使用模拟模式self.config sensor_config or SensorConfig()self.simulation_mode simulation_modeself._filter_buffer: list [] # 滤波缓冲区self._last_valid_reading: Optional[float] Noneif not simulation_mode:self._initialize_hardware()def _initialize_hardware(self):初始化硬件传感器真实模式下try:# 模拟DS18B20传感器的初始化# 实际项目中这里会导入Adafruit_DHT或其他传感器库print([温度传感器] 正在初始化硬件传感器...)time.sleep(0.5)print([温度传感器] 硬件传感器初始化成功)except Exception as e:print(f[温度传感器] 硬件初始化失败切换到模拟模式: {e})self.simulation_mode Truedef read_temperature(self) - TemperatureReading:读取当前水温返回:TemperatureReading: 温度读数对象# 获取原始温度值raw_temp self._get_raw_temperature()# 验证数据有效性is_valid self._validate_reading(raw_temp)if not is_valid:# 使用上次有效值或默认值raw_temp self._last_valid_reading or 25.0# 应用滑动平均滤波filtered_temp self._apply_filter(raw_temp)self._last_valid_reading filtered_tempreturn TemperatureReading(raw_valueround(raw_temp, 1),filtered_valueround(filtered_temp, 1),timestamptime.time(),is_validis_valid)def _get_raw_temperature(self) - float:获取原始温度值私有方法if self.simulation_mode:return self._simulate_temperature()else:return self._read_hardware_sensor()def _simulate_temperature(self) - float:模拟温度变化私有方法模拟真实饮水机的加热过程和温度波动# 模拟场景饮水机从冷水加热到开水的过程current_time time.time()# 基础温度曲线模拟加热过程base_temp 20 80 * (1 - pow(2, -(current_time % 60) / 15)) # 20-100℃循环# 添加自然波动fluctuation random.gauss(0, 1.5) # 高斯分布波动# 添加传感器噪声noise random.uniform(-0.5, 0.5)# 应用校准偏移final_temp base_temp fluctuation noise self.config.CALIBRATION_OFFSET# 确保温度在合理范围内return max(0, min(105, final_temp))def _read_hardware_sensor(self) - float:读取硬件传感器私有方法实际项目中替换为真实的传感器读取代码# 示例读取DS18B20传感器# 实际代码可能如下# import Adafruit_DHT# humidity, temperature Adafruit_DHT.read_retry(Adafruit_DHT.DS18B20, 4)# return temperature# 当前返回模拟值return self._simulate_temperature()def _validate_reading(self, temp: float) - bool:验证温度读数的有效性私有方法# 检查是否在物理可能范围内if temp -10 or temp 110:return False# 检查跳变是否过大防止传感器故障if self._last_valid_reading is not None:if abs(temp - self._last_valid_reading) 10:return Falsereturn Truedef _apply_filter(self, new_value: float) - float:应用滑动平均滤波私有方法平滑温度波动提高读数稳定性self._filter_buffer.append(new_value)# 保持缓冲区大小if len(self._filter_buffer) self.config.FILTER_WINDOW_SIZE:self._filter_buffer.pop(0)# 计算平均值return sum(self._filter_buffer) / len(self._filter_buffer)def continuous_read(self,interval: float None) - Generator[TemperatureReading, None, None]:持续读取温度的生成器参数:interval: 读取间隔秒默认使用配置值生成:TemperatureReading: 温度读数对象if interval is None:interval self.config.READ_INTERVALwhile True:yield self.read_temperature()time.sleep(interval)def calibrate(self, reference_temperature: float):传感器校准参数:reference_temperature: 标准参考温度reading self.read_temperature()self.config.CALIBRATION_OFFSET reference_temperature - reading.filtered_valueprint(f[温度传感器] 校准完成偏移量{self.config.CALIBRATION_OFFSET:.2f}℃)# 测试代码if __name__ __main__:print( * 50)print(温度传感器模块测试)print( * 50)# 创建传感器实例sensor TemperatureSensor(simulation_modeTrue)# 测试单次读取print(\n[测试1] 单次温度读取)for i in range(5):reading sensor.read_temperature()print(f 第{i1}次原始值{reading.raw_value}℃, f滤波值{reading.filtered_value}℃, 有效{reading.is_valid})time.sleep(0.5)# 测试持续读取print(\n[测试2] 持续温度读取3次)count 0for reading in sensor.continuous_read(interval0.5):print(f 温度{reading.filtered_value}℃)count 1if count 3:break4.3 水温分析模块 (water_temperature_analyzer.py)水温分析模块功能根据温度值分析水的用途和适宜程度作者全栈开发工程师版本1.0from dataclasses import dataclass, fieldfrom enum import Enumfrom typing import Optional, Dict, Listfrom config import TEMP_CONFIG, is_suitable_for_drinkingclass WaterUsageType(Enum):用水类型枚举定义不同温度区间对应的用水场景COLD_DRINK (冷水, 适合夏季解暑直接饮用)ROOM_TEMP (常温, 适合日常饮用无需加热)WARM_DRINK (温饮, 适合冲奶、蜂蜜水温度适宜) # 核心适宜饮用TEA_COFFEE (热饮, 适合冲泡茶叶、咖啡)BOILING (开水, 高温消毒需降温后饮用)UNKNOWN (未知, 温度异常请检查设备)def __init__(self, chinese_name, description):self.chinese_name chinese_nameself.description descriptiondataclassclass WaterTemperatureAnalysis:水温分析结果数据类包含完整的分析结果和建议current_temperature: float # 当前水温usage_type: WaterUsageType # 用水类型is_suitable_for_drinking: bool # 是否适宜饮用suitable_drinking_range: tuple # 适宜饮用温度区间temperature_status: str # 温度状态描述recommendations: List[str] # 建议列表safety_warnings: List[str] # 安全警告列表class WaterTemperatureAnalyzer:水温分析器类核心功能将温度值转换为用水建议和安全提示def __init__(self, configNone):初始化分析器参数:config: 温度配置对象self.config config or TEMP_CONFIGdef analyze(self, temperature: float) - WaterTemperatureAnalysis:分析水温返回完整分析结果核心方法参数:temperature: 水温值摄氏度返回:WaterTemperatureAnalysis: 分析结果对象# 确定用水类型usage_type self._determine_usage_type(temperature)# 判断是否适宜饮用suitable is_suitable_for_drinking(temperature)# 获取温度状态描述status self._get_temperature_status(temperature, usage_type)# 生成建议recommendations self._generate_recommendations(temperature, usage_type, suitable)# 生成安全警告warnings self._generate_warnings(temperature, usage_type)return WaterTemperatureAnalysis(current_temperaturetemperature,usage_typeusage_type,is_suitable_for_drinkingsuitable,suitable_drinking_rangeget_suitable_drinking_range(),temperature_statusstatus,recommendationsrecommendations,safety_warningswarnings)def _determine_usage_type(self, temperature: float) - WaterUsageType:根据温度确定用水类型私有方法ranges self.config.TEMPERATURE_RANGESif ranges[cold][0] temperature ranges[cold][1]:return WaterUsageType.COLD_DRINKelif ranges[room_temp][0] temperature ranges[room_temp][1]:return WaterUsageType.ROOM_TEMPelif ranges[warm_drink][0] temperature ranges[warm_drink][1]:return WaterUsageType.WARM_DRINK # 核心适宜饮用区间elif ranges[tea_coffee][0] temperature ranges[tea_coffee][1]:return WaterUsageType.TEA_COFFEEelif ranges[boiling][0] temperature ranges[boiling][1]:return WaterUsageType.BOILINGelse:return WaterUsageType.UNKNOWNdef _get_temperature_status(self, temperature: float, usage_type: WaterUsageType) - str:获取温度状态描述私有方法messages self.config.MESSAGESif usage_type WaterUsageType.WARM_DRINK:# 核心适宜饮用状态的详细描述if temperature 45:return 温度理想非常适合冲调婴幼儿奶粉elif temperature 50:return ✅ 温度适宜完美适合蜂蜜水和温和饮品else:return 温度适中适合大多数温热饮品elif usage_type WaterUsageType.BOILING:return ⚠️ 高温开水请务必晾凉后再饮用elif usage_type WaterUsageType.TEA_COFFEE:return ☕ 茶香咖啡香正是冲泡好时节elif usage_type WaterUsageType.ROOM_TEMP:return 清爽常温随时畅饮无负担elif usage_type WaterUsageType.COLD_DRINK:return ❄️ 清凉解渴夏日首选else:return 温度异常请检查饮水机状态def _generate_recommendations(self,temperature: float,usage_type: WaterUsageType,is_suitable: bool) - List[str]:生成饮用建议私有方法recommendations []# 核心逻辑适宜饮用时的特别提醒if is_suitable:recommendations.append( 当前水温处于最佳饮用区间无需试温可直接饮用)recommendations.append( 特别适合为宝宝冲调奶粉保护娇嫩肠胃)recommendations.append( 冲泡蜂蜜水、花茶的绝佳温度)recommendations.append(⏰ 可放心大口饮用享受舒适饮水体验)else:# 根据温度区间给出建议if temperature 40:recommendations.append( 建议等待加热至40-55℃以获得最佳饮用体验)recommendations.append( 如需冲奶请继续加热至适宜温度)elif temperature 55 and temperature 75:recommendations.append(⏳ 建议稍等片刻让水温降至适宜饮用范围)recommendations.append( 此温度适合温润型茶饮但直饮略热)elif temperature 90:recommendations.append(⏳ 请等待3-5分钟降温或兑入适量凉水)recommendations.append(☕ 适合立即冲泡茶叶但请勿直接饮用)# 通用健康建议recommendations.append( 建议小口慢饮充分滋润身体)return recommendationsdef _generate_warnings(self, temperature: float, usage_type: WaterUsageType) - List[str]:生成安全警告私有方法warnings []if usage_type WaterUsageType.BOILING:warnings.append(⚠️ 高温危险请勿用手或嘴唇直接接触热水)warnings.append( 接水时请握稳水杯避免烫伤)warnings.append( 绝对不可给婴幼儿直接饮用开水)if temperature 60 and usage_type ! WaterUsageType.BOILING:warnings.append( 水温较高建议试温后饮用除温饮模式外)if temperature 10:warnings.append( 水温较低肠胃敏感者请适量饮用)if usage_type WaterUsageType.UNKNOWN:warnings.append( 温度异常请检查饮水机是否正常工作)warnings.append( 如持续异常请联系设备维护人员)return warningsdef get_led_color(self, temperature: float) - str:获取当前温度对应的LED颜色用于硬件控制参数:temperature: 水温值返回:str: LED颜色名称usage_type self._determine_usage_type(temperature)return self.config.LED_COLORS.get(usage_type.name.lower(), off)def is_green_light_condition(self, temperature: float) - bool:判断是否满足绿灯常亮条件核心方法参数:temperature: 水温值返回:bool: 是否应该点亮绿灯return is_suitable_for_drinking(temperature)def get_suitable_range_info(self) - str:获取适宜饮用温度区间的说明信息min_temp, max_temp get_suitable_drinking_range()return f适宜饮用温度区间{min_temp}℃ - {max_temp}℃# 测试代码if __name__ __main__:print( * 60)print(水温分析模块测试)print( * 60)analyzer WaterTemperatureAnalyzer()# 测试不同温度值的分析test_temperatures [15, 25, 45, 50, 55, 75, 90, 100, 5, 110]for temp in test_temperatures:print(f\n【测试温度{temp}℃】)print(- * 40)analysis analyzer.analyze(temp)print(f用水类型{analysis.usage_type.chinese_name})print(f类型描述{analysis.usage_type.description})print(f适宜饮用{✅ 是 if analysis.is_suitable_for_drinking else ❌ 否})print(f温度状态{analysis.temperature_status})print(建议)for rec in analysis.recommendations:print(f • {rec})if analysis.safety_warnings:print(警告)for warn in analysis.safety_warnings:print(f ⚠️ {warn})print(fLED指示{analyzer.get_led_color(temp)})print(f绿灯条件{✅ 满足 if analyzer.is_green_light_condition(temp) else ❌ 不满足})print()4.4 LED指示灯控制模块 (led_controller.py)LED指示灯控制模块功能控制LED灯的开关、颜色和状态实现免试温视觉提示作者全栈开发工程师版本1.0import timeimport threadingfrom typing import Optional, Dict, Callablefrom dataclasses import dataclass, fieldfrom enum import Enum, autofrom config import HardwareConfig, TEMP_CONFIG, is_suitable_for_drinkingclass LEDState(Enum):LED状态枚举OFF auto() # 关闭ON auto() # 常亮BLINK auto() # 闪烁PULSE auto() # 呼吸FADE_IN auto() # 渐入FADE_OUT auto() # 渐出dataclassclass LEDInfo:LED信息数据类name: str # LED名称color: str # 颜色pin: int # GPIO引脚state: LEDState LEDState.OFFbrightness: int 0 # 亮度 0-100last_update: float field(default_factorytime.time)class LEDController:LED控制器类管理多个LED灯的状态实现智能饮水机的视觉反馈# 颜色到RGB值的映射COLOR_RGB_MAP {red: (255, 0, 0),green: (0, 255, 0), # 核心绿灯blue: (0, 0, 255),orange: (255, 165, 0),cyan: (0, 255, 255),white: (255, 255, 255),off: (0, 0, 0)}def __init__(self, hardware_config: HardwareConfig None, simulation_mode: bool True):初始化LED控制器参数:hardware_config: 硬件配置simulation_mode: 是否使用模拟模式self.config hardware_config or HardwareConfig()self.simulation_mode simulation_modeself._leds: Dict[str, LEDInfo] {}self._blink_threads: Dict[str, threading.Thread] {}self._lock threading.Lock()self._callbacks: Dict[str, List[Callable]] {}# 初始化所有LEDself._initialize_leds()def _initialize_leds(self):初始化所有LED灯私有方法for color, pin in self.config.LED_PINS.items():self._leds[color] LEDInfo(namef{color}_led,colorcolor,pinpin,brightness0)if not self.simulation_mode:self._setup_gpio()print(f[LED控制器] 初始化完成管理{len(self._leds)}个LED灯)def _setup_gpio(self):设置GPIO引脚真实硬件模式利用AI解决实际问题如果你觉得这个工具好用欢迎关注长安牧笛

相关新闻