编写程序让智能保温杯水温实时显示,低于40度提示“水温过低”
智能保温杯水温实时监测与低温提醒系统一、实际应用场景描述现代都市人群生活节奏快工作压力大一杯温热的水往往成为维持身体机能的重要支撑。无论是办公室白领在空调房里长时间工作还是学生在图书馆专注学习亦或是户外工作者在寒冷环境中作业保温杯都是不可或缺的随身伴侣。典型场景- 程序员小李在深夜加班时保温杯里的咖啡从90°C逐渐降至30°C他浑然不觉地喝下冰凉液体导致胃部不适- 考研学生小王在图书馆复习保温杯里泡的绿茶慢慢变凉他因为专注学习忘记喝水等到想起来时已经没有温水的慰藉- 外卖骑手老张在寒风中送餐保温杯里的热水变成冷水他没注意到温度下降喝了冰水引起咳嗽- 护士小陈在医院值班保温杯里的花茶从热饮变成冷饮她忙得顾不上看温度影响了休息质量- 退休教师老李在公园晨练保温杯里的枸杞茶温度下降他喝下凉茶后感到肠胃不适传统保温杯的局限- 用户无法准确知道当前水温只能靠触摸杯壁或试探性饮用- 没有实时温度监测无法及时提醒补水或换水- 缺乏温度历史记录无法了解保温效果和饮水习惯- 没有个性化温度提醒不同饮品需要不同的最佳饮用温度- 无法与智能设备联动错失智能化生活的便利- 老人和儿童使用时无法直观判断温度是否适宜本系统功能- 实时监测保温杯内水温精度±0.5°C- 0.1°C精度显示当前温度- 温度低于40°C时语音提示水温过低- 可视化显示温度曲线和保温状态- 记录饮水温度和频次- 个性化温度阈值设置- 保温效果分析和建议二、引入痛点1. 健康隐患严重过冷或过热饮水都会对身体造成伤害尤其是胃病患者和老年人2. 主观判断不准用手触摸杯壁或嘴唇试探无法获得准确温度信息3. 错过最佳饮用时机热饮在40-60°C口感最佳过冷后营养价值和舒适感都下降4. 无法及时提醒用户专注工作时容易忽略饮水导致脱水或饮用不适宜温度的液体5. 保温效果不明不知道保温杯的实际保温时长无法评估产品性能6. 个性化缺失不同饮品茶、咖啡、牛奶有不同的最佳饮用温度区间7. 数据记录空白缺乏饮水温度历史无法分析个人饮水习惯8. 安全隐患高温烫伤风险特别是儿童和老人使用时9. 智能化程度低传统保温杯无法与现代智能设备生态联动三、核心逻辑讲解温度传感器DS18B20特性DS18B20是一款数字温度传感器专为嵌入式系统设计- 测温范围-55°C ~ 125°C- 精度±0.5°C-10°C ~ 85°C范围内- 分辨率可编程9-12位0.5°C ~ 0.0625°C- 供电方式寄生电源或外部供电- 通信方式单总线1-Wire协议- 独特优势每个器件有唯一64位ROM编码支持多点组网温度阈值与健康关系温度范围(°C) 饮品状态 健康影响 建议操作65 过热 可能烫伤口腔食道 等待降温55-65 适宜热饮 最佳饮用温度 可以饮用40-55 温热 口感良好营养保留 推荐饮用30-40 偏凉 仍可接受 尽快饮用30 过冷 刺激肠胃影响消化 加热或更换核心算法流程1. 温度采集- DS18B20单总线通信协议- 12位分辨率采样- 多点温度补偿和滤波2. 用户配置- 输入个性化温度阈值- 设置饮品类型偏好- 配置提醒灵敏度3. 实时分析- 温度与阈值比较- 温度变化趋势分析- 保温效果评估4. 多级提醒- 绿色适宜温度40-65°C- 黄色偏凉提醒30-40°C- 红色过冷报警30°C- 语音提示水温过低5. 数据记录- 时间戳温度记录- 保温曲线绘制- 饮水习惯分析关键技术难点及解决方案难点 解决方案单总线时序要求严格 精确延时函数硬件定时器温度读数不稳定 滑动平均滤波中值滤波多点组网冲突 唯一ID寻址严格时序控制寄生电源供电不稳 外部电源供电电源管理误报问题 连续3次低温确认机制功耗优化 深度睡眠事件驱动唤醒防水防潮 密封设计IP67防护等级四、代码模块化含安全设计项目结构smart_thermos/├── main.py # 主程序入口├── sensors/ # 传感器模块│ ├── __init__.py│ ├── ds18b20_temp.py # DS18B20温度传感器驱动│ └── temperature_filter.py # 温度滤波模块├── core/ # 核心逻辑模块│ ├── __init__.py│ ├── temp_analyzer.py # 温度分析引擎│ ├── health_assessor.py # 健康评估模块│ └── alert_manager.py # 提醒管理器├── actuators/ # 执行器模块│ ├── __init__.py│ ├── oled_display.py # OLED显示屏控制│ ├── voice_prompt.py # 语音提示模块│ ├── rgb_led.py # RGB LED控制│ └── haptic_feedback.py # 振动反馈模块├── storage/ # 数据存储模块│ ├── __init__.py│ ├── temp_logger.py # 温度记录器│ └── report_generator.py # 报告生成器├── config.py # 系统配置├── requirements.txt # 依赖清单├── README.md # 项目文档└── utils/├── __init__.py├── logger.py # 日志工具└── decorators.py # 装饰器工具核心代码实现1. config.py系统配置智能保温杯水温实时监测与低温提醒系统配置文件包含传感器、执行器、健康标准等所有配置参数from dataclasses import dataclass, fieldfrom typing import List, Optional, Dict, Any, Tuplefrom enum import Enum, autofrom pathlib import Pathimport os# 确保配置目录存在Path(config).mkdir(parentsTrue, exist_okTrue)class TempStatus(Enum):温度状态枚举OPTIMAL auto() # 最佳温度40-65°CWARM auto() # 温热30-40°CCOOL auto() # 偏凉20-30°CCOLD auto() # 过冷20°CHOT auto() # 过热65°Cclass AlertLevel(Enum):提醒级别枚举NONE auto() # 无提醒MILD auto() # 轻度提醒MODERATE auto() # 中度提醒URGENT auto() # 紧急提醒class DrinkType(Enum):饮品类型枚举WATER auto() # 白开水TEA auto() # 茶水COFFEE auto() # 咖啡MILK auto() # 牛奶HERBAL auto() # 花草茶dataclassclass SensorConfig:传感器配置# DS18B20配置ds18b20_gpio_pin: int 4 # 单总线数据引脚ds18b20_resolution: int 12 # 分辨率9-12位ds18b20_parasite_power: bool False # 寄生电源模式ds18b20_devices: List[str] field(default_factorylambda: []) # 设备ID列表# 采样配置sample_interval: float 2.0 # 采样间隔秒sample_count: int 5 # 采样次数filter_window: int 10 # 滤波窗口大小temp_change_threshold: float 0.5 # 温度变化阈值°C# 校准配置calibration_offset: float 0.0 # 校准偏移量ambient_temp_compensation: bool True # 环境温度补偿# 模拟模式开发测试用simulation_mode: bool Truesimulation_base_temp: float 55.0 # 模拟基础温度simulation_drift_rate: float -0.3 # 模拟降温速率°C/分钟dataclassclass UserConfig:用户配置# 用户信息user_name: str 用户preferred_drink: DrinkType DrinkType.WATERoptimal_temp_min: float 40.0 # 最佳温度下限optimal_temp_max: float 65.0 # 最佳温度上限cold_alert_threshold: float 40.0 # 低温提醒阈值hot_alert_threshold: float 70.0 # 高温提醒阈值# 个性化设置sensitivity: float 1.0 # 敏感度0.5-2.0reminder_interval: float 60.0 # 提醒间隔秒enable_voice: bool True # 启用语音提醒enable_display: bool True # 启用显示enable_led: bool True # 启用LED指示enable_vibration: bool False # 启用振动提醒dataclassclass HealthThresholds:健康阈值配置# 按饮品类型的温度建议drink_type_thresholds: Dict[DrinkType, Dict[str, float]] field(default_factorylambda: {DrinkType.WATER: {optimal_min: 35.0, optimal_max: 55.0,acceptable_min: 25.0, acceptable_max: 65.0},DrinkType.TEA: {optimal_min: 50.0, optimal_max: 65.0,acceptable_min: 40.0, acceptable_max: 75.0},DrinkType.COFFEE: {optimal_min: 55.0, optimal_max: 70.0,acceptable_min: 45.0, acceptable_max: 80.0},DrinkType.MILK: {optimal_min: 40.0, optimal_max: 60.0,acceptable_min: 30.0, acceptable_max: 70.0},DrinkType.HERBAL: {optimal_min: 45.0, optimal_max: 65.0,acceptable_min: 35.0, acceptable_max: 75.0}})# 健康风险评估health_risk_levels: Dict[str, Tuple[float, float]] field(default_factorylambda: {最佳: (40.0, 65.0),可接受: (30.0, 40.0),偏凉: (20.0, 30.0),过冷: (0.0, 20.0),过热: (65.0, 100.0)})dataclassclass AlertConfig:提醒配置# OLED配置oled_enabled: bool Trueoled_i2c_address: int 0x3Coled_width: int 128oled_height: int 64# RGB LED配置led_enabled: bool Trueled_red_pin: int 17led_green_pin: int 27led_blue_pin: int 22# 振动马达配置vibration_enabled: bool Falsevibration_pin: int 23vibration_duration: float 0.5# 语音配置voice_enabled: bool Truevoice_volume: int 80voice_language: str zh-CN# 提醒模式visual_alerts: bool Trueaudio_alerts: bool Truetactile_alerts: bool Falsedataclassclass StorageConfig:存储配置# 数据记录log_enabled: bool Truelog_directory: str data/temperature_logslog_filename: str temp_history.csvlog_interval: float 60.0 # 记录间隔秒# 历史数据max_history_days: int 30export_enabled: bool Trueexport_format: str csv# 报告配置daily_report: bool Trueweekly_report: bool Truemonthly_report: bool Falsedataclassclass SystemConfig:系统总配置sensor: SensorConfig field(default_factorySensorConfig)user: UserConfig field(default_factoryUserConfig)health: HealthThresholds field(default_factoryHealthThresholds)alert: AlertConfig field(default_factoryAlertConfig)storage: StorageConfig field(default_factoryStorageConfig)# 系统设置debug_mode: bool Falselog_level: str INFOlog_file: str smart_thermos.log# 安全限制min_temp: float -10.0max_temp: float 100.0min_user_temp: float 0.0max_user_temp: float 90.0def __post_init__(self):# 确保目录存在for directory in [self.storage.log_directory, data, reports]:Path(directory).mkdir(parentsTrue, exist_okTrue)# 计算实际阈值self._calculate_thresholds()def _calculate_thresholds(self):根据用户配置计算实际温度阈值drink self.user.preferred_drinkthresholds self.health.drink_type_thresholds.get(drink, {})if thresholds:self.optimal_min thresholds.get(optimal_min, 40.0)self.optimal_max thresholds.get(optimal_max, 65.0)self.acceptable_min thresholds.get(acceptable_min, 30.0)self.acceptable_max thresholds.get(acceptable_max, 70.0)else:self.optimal_min self.user.optimal_temp_minself.optimal_max self.user.optimal_temp_maxself.acceptable_min self.cold_alert_thresholdself.acceptable_max self.hot_alert_thresholdlogger.info(f阈值计算完成: 最佳范围{self.optimal_min}-{self.optimal_max}°C, f可接受范围{self.acceptable_min}-{self.acceptable_max}°C)# 全局配置实例config SystemConfig()# 温度状态颜色映射STATUS_COLORS {TempStatus.OPTIMAL: (0, 255, 0), # 绿色TempStatus.WARM: (255, 255, 0), # 黄色TempStatus.COOL: (255, 165, 0), # 橙色TempStatus.COLD: (0, 0, 255), # 蓝色TempStatus.HOT: (255, 0, 0) # 红色}# 提醒级别消息ALERT_MESSAGES {AlertLevel.NONE: ,AlertLevel.MILD: 水温略低可以饮用了,AlertLevel.MODERATE: 水温偏低建议加热,AlertLevel.URGENT: 水温过低请更换热水}# 健康建议HEALTH_ADVICE {最佳: 水温适宜请慢慢享用有助于身体吸收,可接受: 水温尚可可以饮用但建议尽快喝完,偏凉: 水温偏凉肠胃敏感者请谨慎饮用,过冷: 水温过冷可能刺激肠胃建议加热后饮用,过热: 水温过高可能烫伤口腔请稍等降温}# 饮品建议DRINK_ADVICE {DrinkType.WATER: 白开水最健康的选择建议保持在35-55°C,DrinkType.TEA: 茶水茶叶中的有益成分在50-65°C时最佳溶出,DrinkType.COFFEE: 咖啡55-70°C时香气和口感达到平衡,DrinkType.MILK: 牛奶40-60°C时营养最易吸收避免过热破坏蛋白,DrinkType.HERBAL: 花草茶45-65°C时有效成分释放充分}# 工厂函数def create_config() - SystemConfig:创建配置实例return configdef update_user_config(name: str None, drink: DrinkType None,optimal_min: float None, optimal_max: float None):更新用户配置global configif name:config.user.user_name nameif drink:config.user.preferred_drink drinkconfig._calculate_thresholds()if optimal_min is not None:config.user.optimal_temp_min optimal_minconfig._calculate_thresholds()if optimal_max is not None:config.user.optimal_temp_max optimal_maxconfig._calculate_thresholds()logger None # 将在main中初始化2. sensors/ds18b20_temp.pyDS18B20温度传感器模块DS18B20数字温度传感器模块单总线通信协议支持多点组网高精度温度测量import timeimport loggingimport randomfrom typing import Optional, List, Dict, Tuplefrom dataclasses import dataclass, fieldfrom enum import Enum, autofrom contextlib import contextmanagerfrom config import config, SensorConfig, TempStatuslogger logging.getLogger(__name__)class DS18B20Error(Exception):DS18B20传感器异常类passclass OneWireError(DS18B20Error):单总线通信异常类passclass CalibrationError(DS18B20Error):校准异常类passclass Resolution(Enum):温度分辨率BITS_9 9 # 0.5°CBITS_10 10 # 0.25°CBITS_11 11 # 0.125°CBITS_12 12 # 0.0625°Cdataclassclass TemperatureReading:温度读数数据类timestamp: floatraw_value: inttemperature: floatdevice_id: strresolution: intis_valid: bool Truequality: float 1.0status: TempStatus TempStatus.OPTIMALclass DS18B20Sensor:DS18B20 1-Wire数字温度传感器驱动特性- 单总线数字接口简化布线- 每个器件有唯一64位ROM编码- 支持多点组网最多可挂接数百个传感器- 宽温度范围-55°C至125°C- 高精度±0.5°C-10°C至85°C- 可编程分辨率9-12位- 寄生电源或外部电源模式- 温度报警功能1-Wire协议要点1. 复位脉冲主机拉低480-960μs2. 存在脉冲从机拉低60-240μs响应3. ROM操作读ROM、匹配ROM、搜索ROM、跳过ROM4. 功能命令温度转换、读暂存器、写暂存器等5. 严格时序所有操作都有精确的时隙要求接线方式DS18B20 → Raspberry PiVDD(红) → 3.3V/5VGND(黑) → GNDDQ(黄/绿) → GPIO4 (数据线需4.7K上拉电阻)或寄生电源模式VDD(红) → GNDGND(黑) → GNDDQ(黄/绿) → GPIO4 (需4.7K上拉电阻)# 1-Wire命令CMD_SEARCH_ROM 0xF0CMD_READ_ROM 0x33CMD_MATCH_ROM 0x55CMD_SKIP_ROM 0xCCCMD_ALARM_SEARCH 0xEC# 功能命令CMD_CONVERT_T 0x44CMD_WRITE_SCRATCHPAD 0x4ECMD_READ_SCRATCHPAD 0xBECMD_COPY_SCRATCHPAD 0x48CMD_RECALL_E2 0xB8CMD_READ_POWER_SUPPLY 0xB4# 时序参数微秒TIMING_RESET_LOW 480TIMING_RESET_HIGH 480TIMING_PRESENCE_WAIT 70TIMING_PRESENCE_TIMEOUT 240TIMING_BIT_WRITE_0 60TIMING_BIT_WRITE_1 1TIMING_BIT_READ_SLOT 1TIMING_BIT_READ_SAMPLE 15TIMING_BIT_READ_RELEASE 45TIMING_CONVERSION_12BIT 750 # 750ms 12-bitTIMING_CONVERSION_9BIT 94 # 94ms 9-bit# 寄存器地址REG_TEMP_LSB 0REG_TEMP_MSB 1REG_TH 2REG_TL 3REG_CONFIG 4REG_CRC 8# 分辨率对应的转换时间毫秒CONVERSION_TIMES {9: 94,10: 188,11: 375,12: 750}def __init__(self, gpio_pin: int 4, parasite_power: bool False):初始化DS18B20传感器Args:gpio_pin: 单总线数据引脚GPIO编号parasite_power: 是否使用寄生电源模式self.gpio_pin gpio_pinself.parasite_power parasite_powerself.resolution config.sensor.ds18b20_resolutionself.devices: Dict[str, Dict] {} # 发现的设备字典self.selected_device: Optional[str] None# 校准参数self.calibration_offset config.sensor.calibration_offset# 滤波缓冲区self._filter_buffer: Dict[str, List[float]] {}# 状态管理self._is_initialized Falseself._conversion_in_progress Falseself._last_temperature: Dict[str, float] {}# 模拟模式self._simulation_mode config.sensor.simulation_modeself._simulation_base_temp config.sensor.simulation_base_tempself._simulation_drift_rate config.sensor.simulation_drift_rate# 统计信息self._readings_count 0self._error_count 0self._max_errors 10logger.info(fDS18B20温度传感器初始化: GPIO引脚{gpio_pin}, f分辨率{self.resolution}位, 寄生电源{parasite_power})def initialize(self) - bool:初始化传感器和网络发现Returns:bool: 初始化是否成功try:if self._simulation_mode:logger.info(DS18B20传感器运行在模拟模式)self._initialize_simulation()self._is_initialized Truereturn True# 实际硬件初始化# import RPi.GPIO as GPIO# self.GPIO GPIO# self.GPIO.setmode(GPIO.BCM)# self.GPIO.setup(self.gpio_pin, GPIO.OUT)# self.GPIO.output(self.gpio_pin, GPIO.HIGH)# 等待总线稳定time.sleep(0.1)# 搜索总线上的设备devices self._search_devices()if not devices:logger.warning(未发现DS18B20设备请检查接线)return False# 保存发现的设备for device_id in devices:self.devices[device_id] {resolution: self.resolution,last_temp: None,filter_buffer: [],status: TempStatus.OPTIMAL}self._filter_buffer[device_id] []self._last_temperature[device_id] 25.0# 设置第一个设备为默认选择self.selected_device devices[0]logger.info(f发现 {len(devices)} 个DS18B20设备:)for device_id in devices:logger.info(f - {device_id})self._is_initialized Truelogger.info(DS18B20温度传感器初始化成功)return Trueexcept Exception as e:logger.error(fDS18B20传感器初始化失败: {e})return Falsedef _initialize_simulation(self):初始化模拟模式# 创建一个模拟设备IDself.sim_device_id 28-000005e2fdc3self.devices[self.sim_device_id] {resolution: self.resolution,last_temp: self._simulation_base_temp,filter_buffer: [],status: TempStatus.OPTIMAL}self._filter_buffer[self.sim_device_id] []self._last_temperature[self.sim_device_id] self._simulation_base_tempself.selected_device self.sim_device_iddef _search_devices(self) - List[str]:搜索1-Wire总线上的所有DS18B20设备使用1-Wire搜索ROM算法通过CRC校验确保数据完整性Returns:List[str]: 设备ID列表if self._simulation_mode:return [self.sim_device_id]# 实际硬件搜索# devices []## # 发送搜索ROM命令# self._reset_bus()# self._write_byte(self.CMD_SEARCH_ROM)## # 使用二叉树搜索算法# # 这里简化处理实际应用中需要实现完整的搜索算法# # 或者使用简化的方式假设只有一个设备直接读取ROM# try:# self._reset_bus()# self._write_byte(self.CMD_READ_ROM)# rom_code self._read_bytes(8)## # 验证CRC# if self._crc8_check(rom_code):# device_id self._format_device_id(rom_code)# devices.append(device_id)# else:# logger.warning(设备ROM CRC校验失败)# except Exception as e:# logger.error(f搜索设备失败: {e})# 模拟发现一个设备return [self.sim_device_id] if self._simulation_mode else []def _reset_bus(self) - bool:复位1-Wire总线发送复位脉冲并检测从机存在脉冲Returns:bool: 是否有设备响应if self._simulation_mode:time.sleep(0.005)return True# 实际硬件复位# self.GPIO.output(self.gpio_pin, GPIO.LOW)# time.sleep(self.TIMING_RESET_LOW / 1000000)# self.GPIO.output(self.gpio_pin, GPIO.HIGH)# time.sleep(self.TIMING_RESET_HIGH / 1000000)## # 检测存在脉冲# start_time time.time()# while self.GPIO.input(self.gpio_pin):# if (time.time() - start_time) * 1000000 self.TIMING_PRESENCE_TIMEOUT:# return False# time.sleep(0.000001)## presence_start time.time()# while not self.GPIO.input(self.gpio_pin):# if (time.time() - presence_start) * 1000000 self.TIMING_PRESENCE_WAIT:# return False# time.sleep(0.000001)return Truedef _write_bit(self, bit: int):向总线写入单个位Args:bit: 要写入的位0或1if self._simulation_mode:time.sleep(0.000001)return# 实际硬件写位# if bit:# self.GPIO.output(self.gpio_pin, GPIO.LOW)# time.sleep(self.TIMING_BIT_WRITE_1 / 1000000)# self.GPIO.output(self.gpio_pin, GPIO.HIGH)# time.sleep(self.TIMING_BIT_READ_RELEASE / 1000000)# else:# self.GPIO.output(self.gpio_pin, GPIO.LOW)# time.sleep(self.TIMING_BIT_WRITE_0 / 1000000)# self.GPIO.output(self.gpio_pin, GPIO.HIGH)def _read_bit(self) - int:从总线读取单个位Returns:int: 读取的位0或1if self._simulation_mode:time.sleep(0.利用AI解决实际问题如果你觉得这个工具好用欢迎关注长安牧笛