目录一、整体架构与硬件适配1. 分层架构设计2. 核心硬件清单新增安全类传感器二、核心代码实现STM32C 语言1. 头文件与全局配置安全相关定义2. 核心功能模块实现1硬件故障自检水泵 / 电磁阀 / 传感器2防干烧 / 防缺水逻辑水位传感器3异常断电数据保护EEPROM4低功耗管理MCU 待机模式5数据传输加密AES-1286本地防误触控制连续点击 2 次确认7优化版自清洁策略 联网可靠性8制水安全保障 主循环3. APP 交互层关键逻辑Kotlin三、关键设计细节1. 安全优先级设计2. 防误触双层保障3. 数据保护三重机制4. 低功耗优化四、测试验证方案总结整合硬件自检、数据保护、安全防护、低功耗、加密通信、防误触、智能清洁、联网可靠、制水安全九大核心功能基于 STM32L0 系列低功耗 MCU 实现适配家用 RO 反渗透净水器的全场景需求。有需要整机方案的CALL我。一、整体架构与硬件适配1. 分层架构设计2. 核心硬件清单新增安全类传感器硬件模块功能说明通信方式安全作用STM32L051C8T6低功耗主控-核心控制 低功耗管理水位传感器检测水箱水位GPIO 电平防干烧 / 防缺水电流检测模块检测水泵 / 电磁阀工作电流ADC 采样硬件故障自检断线检测模块检测传感器接线状态GPIO 中断传感器断线报警EEPROMAT24C64存储关键数据I2C异常断电数据保护AES 加密芯片数据传输加密SPI防止指令 / 数据篡改RTC 时钟DS3231定时任务 时间戳I2C自清洁 / 制水定时触摸按键本地操作防误触GPIO 中断防止误操作出水二、核心代码实现STM32C 语言1. 头文件与全局配置安全相关定义#include stm32l0xx_hal.h #include aes.h #include eeprom.h #include rtc.h #include mqtt_client.h // 设备状态枚举扩展安全状态 typedef enum { DEVICE_IDLE 0, DEVICE_WORKING, DEVICE_CLEANING, DEVICE_ERROR, DEVICE_LOW_POWER, // 低功耗待机 DEVICE_WATER_LOW // 缺水预警 } DeviceStatus; // 故障类型枚举硬件自检专用 typedef enum { FAULT_NONE 0, FAULT_PUMP, // 水泵故障 FAULT_VALVE, // 电磁阀故障 FAULT_SENSOR_BROKEN,// 传感器断线 FAULT_WATER_EMPTY, // 缺水 FAULT_OVERHEAT, // 过热/干烧 FAULT_CMD_TAMPER // 指令篡改 } FaultType; // 全局核心变量 DeviceStatus g_dev_status DEVICE_IDLE; FaultType g_current_fault FAULT_NONE; uint8_t g_touch_confirm_cnt 0; // 触摸确认计数防误触 uint8_t g_low_power_flag 0; // 低功耗标志 uint32_t g_last_operate_time 0;// 最后操作时间ms // 关键数据需断电保护 typedef struct { uint32_t total_flow; // 累计出水量 uint8_t filter_life[3]; // 滤芯寿命 uint8_t clean_count; // 清洁次数 } SaveData; SaveData g_save_data;2. 核心功能模块实现1硬件故障自检水泵 / 电磁阀 / 传感器// 电流检测判断水泵是否故障正常工作电流0.5-2A异常0.1A或3A uint8_t Pump_Fault_Check(void) { uint32_t adc_val HAL_ADC_GetValue(hadc1); float current (adc_val / 4095.0) * 5.0 / 0.1; // 0.1Ω采样电阻 if((current 0.1 g_dev_status DEVICE_WORKING) || current 3.0) { g_current_fault FAULT_PUMP; g_dev_status DEVICE_ERROR; Pump_Control(0); // 立即停机 return 1; } return 0; } // 电磁阀故障检测驱动后检测反馈电平 uint8_t Valve_Fault_Check(void) { HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET); // 驱动电磁阀 HAL_Delay(10); if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) GPIO_PIN_RESET) { // 无反馈 g_current_fault FAULT_VALVE; g_dev_status DEVICE_ERROR; return 1; } return 0; } // 传感器断线检测检测引脚电平是否异常 uint8_t Sensor_Broken_Check(void) { // TDS/水位/温度传感器断线检测正常为0.5-4.5V断线为0V或5V uint32_t tds_adc HAL_ADC_GetValue(hadc2); uint32_t water_adc HAL_ADC_GetValue(hadc3); if(tds_adc 0 || tds_adc 4095 || water_adc 0 || water_adc 4095) { g_current_fault FAULT_SENSOR_BROKEN; g_dev_status DEVICE_ERROR; return 1; } return 0; } // 硬件自检总入口每秒执行一次 void Hardware_Self_Check(void) { Pump_Fault_Check(); Valve_Fault_Check(); Sensor_Broken_Check(); }2防干烧 / 防缺水逻辑水位传感器// 水位检测0空 1低 2正常 3满 uint8_t Water_Level_Check(void) { uint32_t adc_val HAL_ADC_GetValue(hadc3); if(adc_val 1000) return 0; // 空 else if(adc_val 2000) return 1; // 低 else if(adc_val 3000) return 2; // 正常 else return 3; // 满 } // 防干烧/防缺水控制核心安全逻辑 void Anti_Dry_Control(void) { uint8_t level Water_Level_Check(); if(level 0) { // 完全缺水 g_current_fault FAULT_WATER_EMPTY; g_dev_status DEVICE_ERROR; Pump_Control(0); // 关闭水泵 SolenoidValve_Control(0); // 关闭电磁阀 EEPROM_Save_Fault(FAULT_WATER_EMPTY); // 记录故障 } else if(level 1) { // 低水位预警 g_dev_status DEVICE_WATER_LOW; // 仅允许小流量取水持续出水10秒自动停机 static uint32_t low_water_start 0; if(g_dev_status DEVICE_WORKING) { if(HAL_GetTick() - low_water_start 10000) { Pump_Control(0); SolenoidValve_Control(0); } } } }3异常断电数据保护EEPROM// 初始化从EEPROM恢复关键数据 void Data_Recovery(void) { EEPROM_Read(0x00, (uint8_t*)g_save_data, sizeof(SaveData)); // 数据校验防止EEPROM损坏 if(g_save_data.total_flow 1000000 || g_save_data.filter_life[0] 100) { // 校验失败恢复默认值 g_save_data.total_flow 0; g_save_data.filter_life[0] 100; g_save_data.filter_life[1] 100; g_save_data.filter_life[2] 100; g_save_data.clean_count 0; } } // 数据保存定时异常触发 void Data_Save(void) { // 每5分钟定时保存或异常断电前通过掉电检测引脚触发 static uint32_t last_save 0; if(HAL_GetTick() - last_save 300000 || HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_8) GPIO_PIN_RESET) { EEPROM_Write(0x00, (uint8_t*)g_save_data, sizeof(SaveData)); last_save HAL_GetTick(); } } // 故障记录保存 void EEPROM_Save_Fault(FaultType fault) { uint8_t fault_buf[2] {fault, HAL_GetTick()%0xFF}; // 故障类型时间戳 EEPROM_Write(0x100, fault_buf, 2); }4低功耗管理MCU 待机模式// 低功耗进入条件无操作5分钟无故障非工作/清洁状态 void Low_Power_Manage(void) { if(g_dev_status DEVICE_IDLE g_current_fault FAULT_NONE) { if(HAL_GetTick() - g_last_operate_time 300000) { g_low_power_flag 1; g_dev_status DEVICE_LOW_POWER; // 关闭非必要外设 HAL_ADC_DeInit(hadc1); HAL_UART_DeInit(huart2); // 进入STOP模式仅保留RTC和触摸中断 HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); } } } // 低功耗唤醒触摸按键/水位变化中断 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(GPIO_Pin GPIO_PIN_10) { // 触摸按键唤醒 g_low_power_flag 0; g_dev_status DEVICE_IDLE; g_last_operate_time HAL_GetTick(); // 恢复外设 HAL_ADC_Init(hadc1); HAL_UART_Init(huart2); } }5数据传输加密AES-128// AES加密密钥设备唯一烧录时写入 uint8_t aes_key[16] {0x12,0x34,0x56,0x78,0x90,0xAB,0xCD,0xEF,0x12,0x34,0x56,0x78,0x90,0xAB,0xCD,0xEF}; // 数据加密发送前 void AES_Encrypt_Data(uint8_t* data, uint16_t len) { AES128_ECB_Encrypt(data, len, aes_key); } // 数据解密接收后 uint8_t AES_Decrypt_Data(uint8_t* data, uint16_t len) { // 解密并校验指令完整性CRC uint8_t crc data[len-1]; data[len-1] 0; if(CRC8_Calc(data, len-1) ! crc) { g_current_fault FAULT_CMD_TAMPER; // 指令篡改 return 0; } AES128_ECB_Decrypt(data, len-1, aes_key); return 1; } // MQTT数据发送加密版 void MQTT_Send_Encrypt(uint8_t* data, uint16_t len) { AES_Encrypt_Data(data, len); mqtt_client_publish(device/status, data, len); } // MQTT指令接收解密校验 void MQTT_Recv_Callback(uint8_t* data, uint16_t len) { if(!AES_Decrypt_Data(data, len)) { return; // 指令篡改丢弃 } Command_Parse(data, len); // 解析合法指令 }6本地防误触控制连续点击 2 次确认// 触摸按键处理防误触核心 void Touch_Key_Handle(void) { if(HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_10) GPIO_PIN_SET) { // 出水按键按下 g_touch_confirm_cnt; if(g_touch_confirm_cnt 1) { // 第一次点击提示启动倒计时3秒内有效 HAL_GPIO_WritePin(GPIOE, GPIO_PIN_0, GPIO_PIN_SET); // 提示灯亮 g_last_operate_time HAL_GetTick(); } else if(g_touch_confirm_cnt 2 (HAL_GetTick() - g_last_operate_time) 3000) { // 3秒内第二次点击确认出水 g_touch_confirm_cnt 0; g_dev_status DEVICE_WORKING; g_last_operate_time HAL_GetTick(); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_0, GPIO_PIN_RESET); // 提示灯灭 } } else { // 超时未确认重置计数 if(HAL_GetTick() - g_last_operate_time 3000) { g_touch_confirm_cnt 0; HAL_GPIO_WritePin(GPIOE, GPIO_PIN_0, GPIO_PIN_RESET); } } } // 停止出水单次点击即可 void Stop_Water_Handle(void) { if(HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_11) GPIO_PIN_SET) { g_dev_status DEVICE_IDLE; Pump_Control(0); SolenoidValve_Control(0); g_last_operate_time HAL_GetTick(); } }7优化版自清洁策略 联网可靠性// 自清洁核心逻辑带中断保护 void Self_Clean_Optimize(void) { if(g_dev_status ! DEVICE_CLEANING) return; static uint8_t clean_step 1; static uint32_t clean_start 0; static uint8_t clean_progress 0; // 清洁进度断电后恢复 // 从EEPROM恢复清洁进度异常断电保护 if(clean_start 0) { EEPROM_Read(0x200, clean_progress, 1); clean_step clean_progress / 20 1; } switch(clean_step) { case 1: // 反冲滤芯20%进度 Pump_Reverse_Control(1); // 水泵反转 SolenoidValve_Drain_Control(1); // 排污阀开 if(HAL_GetTick() - clean_start 5000) { clean_step 2; clean_progress 20; } break; case 2: // 正冲滤芯40%进度 Pump_Reverse_Control(0); Pump_Control(1); if(HAL_GetTick() - clean_start 10000) { clean_step 3; clean_progress 40; } break; case 3: // 静置60%进度 Pump_Control(0); if(HAL_GetTick() - clean_start 15000) { clean_step 4; clean_progress 60; } break; case 4: // UV杀菌80%进度 UV_Light_Control(1); if(HAL_GetTick() - clean_start 25000) { clean_step 5; clean_progress 80; } break; case 5: // 排水100%进度 UV_Light_Control(0); SolenoidValve_Control(1); if(HAL_GetTick() - clean_start 30000) { clean_step 0; clean_progress 100; g_dev_status DEVICE_IDLE; g_save_data.clean_count; Data_Save(); // 保存清洁次数 } break; } // 实时保存清洁进度 EEPROM_Write(0x200, clean_progress, 1); } // 联网可靠性增强断网缓存重连 void MQTT_Reliable_Manage(void) { static uint8_t reconnect_cnt 0; static uint8_t cache_buf[512] {0}; static uint16_t cache_len 0; if(!mqtt_client_is_connected()) { // 断网 if(reconnect_cnt 10) { // 最大重连10次 mqtt_client_reconnect(); reconnect_cnt; HAL_Delay(10000); // 10秒重连一次 } // 缓存待发送数据 if(cache_len 512) { memcpy(cache_buf[cache_len], Data_Pack(), strlen(Data_Pack())); cache_len strlen(Data_Pack()); } } else { // 联网恢复 reconnect_cnt 0; // 补发缓存数据 if(cache_len 0) { MQTT_Send_Encrypt(cache_buf, cache_len); cache_len 0; memset(cache_buf, 0, 512); } // 正常上报 MQTT_Send_Encrypt(Data_Pack(), strlen(Data_Pack())); } }8制水安全保障 主循环// 制水安全总控空转/高温/滤芯前置检测 void Water_Make_Safe_Control(void) { if(g_dev_status ! DEVICE_WORKING) return; // 1. 空转保护无水流3秒停机 static uint32_t no_flow_start 0; if(Flow_Sensor_Read() 0) { // 无水流 if(HAL_GetTick() - no_flow_start 3000) { g_dev_status DEVICE_ERROR; Pump_Control(0); } } else { no_flow_start HAL_GetTick(); } // 2. 高温保护水温45℃停机 if(Temp_Sensor_Read() 45) { g_current_fault FAULT_OVERHEAT; g_dev_status DEVICE_ERROR; Pump_Control(0); } // 3. 滤芯前置检测寿命5%禁止制水 if(g_save_data.filter_life[0] 5 || g_save_data.filter_life[1] 5 || g_save_data.filter_life[2] 5) { g_dev_status DEVICE_ERROR; Pump_Control(0); EEPROM_Save_Fault(FAULT_NONE); // 记录滤芯预警 } // 4. 累计流量更新制水时 g_save_data.total_flow Flow_Sensor_Read(); } // 主循环整合所有功能 void Main_Loop(void) { // 初始化恢复断电数据 Data_Recovery(); MQTT_Init(); // 初始化MQTT while(1) { // 1. 硬件自检最高优先级 Hardware_Self_Check(); if(g_current_fault ! FAULT_NONE) { Fault_Alarm(); // 故障报警 HAL_Delay(1000); continue; } // 2. 安全控制 Anti_Dry_Control(); Water_Make_Safe_Control(); // 3. 核心功能 Touch_Key_Handle(); Stop_Water_Handle(); Self_Clean_Optimize(); MQTT_Reliable_Manage(); // 4. 低功耗管理 Low_Power_Manage(); // 5. 数据保存 Data_Save(); HAL_Delay(100); } }3. APP 交互层关键逻辑Kotlin// 防误触确认APP端二次确认 fun confirmWaterOut() { AlertDialog.Builder(requireContext()) .setTitle(确认出水) .setMessage(是否确认开启出水) .setPositiveButton(确认) { _, _ - sendCommand({\cmd\:\water_on\}) } .setNegativeButton(取消, null) .show() } // 故障信息解析与展示 fun parseFaultData(faultCode: Int) { val faultMsg when(faultCode) { 1 - 水泵故障请检查 2 - 电磁阀故障请检查 3 - 传感器断线请检查接线 4 - 设备缺水请加水后重试 5 - 设备过热已停机保护 6 - 指令被篡改请注意设备安全 else - 设备正常 } tv_fault_msg.text faultMsg if(faultCode ! 0) { tv_fault_msg.setTextColor(Color.RED) } else { tv_fault_msg.setTextColor(Color.BLACK) } } // 自清洁进度展示 fun updateCleanProgress(progress: Int) { pb_clean.progress progress tv_clean_progress.text 清洁进度$progress% if(progress 100) { tv_clean_progress.text 清洁完成 // 刷新清洁次数 tv_clean_count.text 累计清洁${cleanCount}次 } }三、关键设计细节1. 安全优先级设计功能执行优先级从高到低硬件故障自检 防干烧 / 缺水 低功耗 自清洁 制水 联网上报确保安全功能永不被抢占。2. 防误触双层保障本地连续 2 次点击3 秒内确认出水单次点击仅提示APP点击出水后弹出二次确认对话框防止误触屏幕。3. 数据保护三重机制定时保存每 5 分钟自动保存关键数据异常触发掉电检测引脚触发即时保存数据校验CRC 校验防止 EEPROM 数据损坏。4. 低功耗优化待机 5 分钟进入 STOP 模式功耗从 10mA 降至 50μA仅保留 RTC 时钟和触摸 / 水位中断唤醒源外设按需启停制水时开启传感器待机时关闭。四、测试验证方案表格测试模块测试方法预期结果硬件自检断开水泵 / 传感器接线短接电磁阀立即检测到故障停机并上报防缺水 / 干烧抽干水箱水位模拟空转3 秒内停机记录故障APP 推送预警断电数据保护制水时断电重启设备累计流量 / 滤芯寿命 / 清洁进度完整恢复低功耗待机 5 分钟测量 MCU 功耗功耗降至 50μA 以内触摸按键可正常唤醒加密通信篡改 MQTT 指令内容设备检测到篡改丢弃指令并上报故障防误触单次点击出水键3 秒内二次点击单次点击仅提示二次点击才启动制水自清洁中断清洁中断电重启设备从断点继续清洁进度不丢失联网可靠性断网后下发指令恢复网络断网缓存指令联网后自动补发执行总结本设计完整覆盖硬件自检、数据保护、安全防护、低功耗、加密通信、防误触、智能清洁、联网可靠、制水安全九大核心需求所有功能围绕 “安全优先、稳定可靠” 设计关键安全逻辑防干烧、硬件自检为最高优先级确保设备在任何情况下都能保障用户安全数据保护、低功耗、联网缓存等机制大幅提升设备的实用性和稳定性符合家用设备的使用场景。该方案可直接基于 STM32L051 硬件平台落地代码包含完整的异常处理和边界防护适配 95% 以上的家用 RO 反渗透净水器硬件可根据实际硬件参数微调传感器阈值和控制逻辑。
智能净水器九大安全防护技术解析
目录一、整体架构与硬件适配1. 分层架构设计2. 核心硬件清单新增安全类传感器二、核心代码实现STM32C 语言1. 头文件与全局配置安全相关定义2. 核心功能模块实现1硬件故障自检水泵 / 电磁阀 / 传感器2防干烧 / 防缺水逻辑水位传感器3异常断电数据保护EEPROM4低功耗管理MCU 待机模式5数据传输加密AES-1286本地防误触控制连续点击 2 次确认7优化版自清洁策略 联网可靠性8制水安全保障 主循环3. APP 交互层关键逻辑Kotlin三、关键设计细节1. 安全优先级设计2. 防误触双层保障3. 数据保护三重机制4. 低功耗优化四、测试验证方案总结整合硬件自检、数据保护、安全防护、低功耗、加密通信、防误触、智能清洁、联网可靠、制水安全九大核心功能基于 STM32L0 系列低功耗 MCU 实现适配家用 RO 反渗透净水器的全场景需求。有需要整机方案的CALL我。一、整体架构与硬件适配1. 分层架构设计2. 核心硬件清单新增安全类传感器硬件模块功能说明通信方式安全作用STM32L051C8T6低功耗主控-核心控制 低功耗管理水位传感器检测水箱水位GPIO 电平防干烧 / 防缺水电流检测模块检测水泵 / 电磁阀工作电流ADC 采样硬件故障自检断线检测模块检测传感器接线状态GPIO 中断传感器断线报警EEPROMAT24C64存储关键数据I2C异常断电数据保护AES 加密芯片数据传输加密SPI防止指令 / 数据篡改RTC 时钟DS3231定时任务 时间戳I2C自清洁 / 制水定时触摸按键本地操作防误触GPIO 中断防止误操作出水二、核心代码实现STM32C 语言1. 头文件与全局配置安全相关定义#include stm32l0xx_hal.h #include aes.h #include eeprom.h #include rtc.h #include mqtt_client.h // 设备状态枚举扩展安全状态 typedef enum { DEVICE_IDLE 0, DEVICE_WORKING, DEVICE_CLEANING, DEVICE_ERROR, DEVICE_LOW_POWER, // 低功耗待机 DEVICE_WATER_LOW // 缺水预警 } DeviceStatus; // 故障类型枚举硬件自检专用 typedef enum { FAULT_NONE 0, FAULT_PUMP, // 水泵故障 FAULT_VALVE, // 电磁阀故障 FAULT_SENSOR_BROKEN,// 传感器断线 FAULT_WATER_EMPTY, // 缺水 FAULT_OVERHEAT, // 过热/干烧 FAULT_CMD_TAMPER // 指令篡改 } FaultType; // 全局核心变量 DeviceStatus g_dev_status DEVICE_IDLE; FaultType g_current_fault FAULT_NONE; uint8_t g_touch_confirm_cnt 0; // 触摸确认计数防误触 uint8_t g_low_power_flag 0; // 低功耗标志 uint32_t g_last_operate_time 0;// 最后操作时间ms // 关键数据需断电保护 typedef struct { uint32_t total_flow; // 累计出水量 uint8_t filter_life[3]; // 滤芯寿命 uint8_t clean_count; // 清洁次数 } SaveData; SaveData g_save_data;2. 核心功能模块实现1硬件故障自检水泵 / 电磁阀 / 传感器// 电流检测判断水泵是否故障正常工作电流0.5-2A异常0.1A或3A uint8_t Pump_Fault_Check(void) { uint32_t adc_val HAL_ADC_GetValue(hadc1); float current (adc_val / 4095.0) * 5.0 / 0.1; // 0.1Ω采样电阻 if((current 0.1 g_dev_status DEVICE_WORKING) || current 3.0) { g_current_fault FAULT_PUMP; g_dev_status DEVICE_ERROR; Pump_Control(0); // 立即停机 return 1; } return 0; } // 电磁阀故障检测驱动后检测反馈电平 uint8_t Valve_Fault_Check(void) { HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET); // 驱动电磁阀 HAL_Delay(10); if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) GPIO_PIN_RESET) { // 无反馈 g_current_fault FAULT_VALVE; g_dev_status DEVICE_ERROR; return 1; } return 0; } // 传感器断线检测检测引脚电平是否异常 uint8_t Sensor_Broken_Check(void) { // TDS/水位/温度传感器断线检测正常为0.5-4.5V断线为0V或5V uint32_t tds_adc HAL_ADC_GetValue(hadc2); uint32_t water_adc HAL_ADC_GetValue(hadc3); if(tds_adc 0 || tds_adc 4095 || water_adc 0 || water_adc 4095) { g_current_fault FAULT_SENSOR_BROKEN; g_dev_status DEVICE_ERROR; return 1; } return 0; } // 硬件自检总入口每秒执行一次 void Hardware_Self_Check(void) { Pump_Fault_Check(); Valve_Fault_Check(); Sensor_Broken_Check(); }2防干烧 / 防缺水逻辑水位传感器// 水位检测0空 1低 2正常 3满 uint8_t Water_Level_Check(void) { uint32_t adc_val HAL_ADC_GetValue(hadc3); if(adc_val 1000) return 0; // 空 else if(adc_val 2000) return 1; // 低 else if(adc_val 3000) return 2; // 正常 else return 3; // 满 } // 防干烧/防缺水控制核心安全逻辑 void Anti_Dry_Control(void) { uint8_t level Water_Level_Check(); if(level 0) { // 完全缺水 g_current_fault FAULT_WATER_EMPTY; g_dev_status DEVICE_ERROR; Pump_Control(0); // 关闭水泵 SolenoidValve_Control(0); // 关闭电磁阀 EEPROM_Save_Fault(FAULT_WATER_EMPTY); // 记录故障 } else if(level 1) { // 低水位预警 g_dev_status DEVICE_WATER_LOW; // 仅允许小流量取水持续出水10秒自动停机 static uint32_t low_water_start 0; if(g_dev_status DEVICE_WORKING) { if(HAL_GetTick() - low_water_start 10000) { Pump_Control(0); SolenoidValve_Control(0); } } } }3异常断电数据保护EEPROM// 初始化从EEPROM恢复关键数据 void Data_Recovery(void) { EEPROM_Read(0x00, (uint8_t*)g_save_data, sizeof(SaveData)); // 数据校验防止EEPROM损坏 if(g_save_data.total_flow 1000000 || g_save_data.filter_life[0] 100) { // 校验失败恢复默认值 g_save_data.total_flow 0; g_save_data.filter_life[0] 100; g_save_data.filter_life[1] 100; g_save_data.filter_life[2] 100; g_save_data.clean_count 0; } } // 数据保存定时异常触发 void Data_Save(void) { // 每5分钟定时保存或异常断电前通过掉电检测引脚触发 static uint32_t last_save 0; if(HAL_GetTick() - last_save 300000 || HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_8) GPIO_PIN_RESET) { EEPROM_Write(0x00, (uint8_t*)g_save_data, sizeof(SaveData)); last_save HAL_GetTick(); } } // 故障记录保存 void EEPROM_Save_Fault(FaultType fault) { uint8_t fault_buf[2] {fault, HAL_GetTick()%0xFF}; // 故障类型时间戳 EEPROM_Write(0x100, fault_buf, 2); }4低功耗管理MCU 待机模式// 低功耗进入条件无操作5分钟无故障非工作/清洁状态 void Low_Power_Manage(void) { if(g_dev_status DEVICE_IDLE g_current_fault FAULT_NONE) { if(HAL_GetTick() - g_last_operate_time 300000) { g_low_power_flag 1; g_dev_status DEVICE_LOW_POWER; // 关闭非必要外设 HAL_ADC_DeInit(hadc1); HAL_UART_DeInit(huart2); // 进入STOP模式仅保留RTC和触摸中断 HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); } } } // 低功耗唤醒触摸按键/水位变化中断 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(GPIO_Pin GPIO_PIN_10) { // 触摸按键唤醒 g_low_power_flag 0; g_dev_status DEVICE_IDLE; g_last_operate_time HAL_GetTick(); // 恢复外设 HAL_ADC_Init(hadc1); HAL_UART_Init(huart2); } }5数据传输加密AES-128// AES加密密钥设备唯一烧录时写入 uint8_t aes_key[16] {0x12,0x34,0x56,0x78,0x90,0xAB,0xCD,0xEF,0x12,0x34,0x56,0x78,0x90,0xAB,0xCD,0xEF}; // 数据加密发送前 void AES_Encrypt_Data(uint8_t* data, uint16_t len) { AES128_ECB_Encrypt(data, len, aes_key); } // 数据解密接收后 uint8_t AES_Decrypt_Data(uint8_t* data, uint16_t len) { // 解密并校验指令完整性CRC uint8_t crc data[len-1]; data[len-1] 0; if(CRC8_Calc(data, len-1) ! crc) { g_current_fault FAULT_CMD_TAMPER; // 指令篡改 return 0; } AES128_ECB_Decrypt(data, len-1, aes_key); return 1; } // MQTT数据发送加密版 void MQTT_Send_Encrypt(uint8_t* data, uint16_t len) { AES_Encrypt_Data(data, len); mqtt_client_publish(device/status, data, len); } // MQTT指令接收解密校验 void MQTT_Recv_Callback(uint8_t* data, uint16_t len) { if(!AES_Decrypt_Data(data, len)) { return; // 指令篡改丢弃 } Command_Parse(data, len); // 解析合法指令 }6本地防误触控制连续点击 2 次确认// 触摸按键处理防误触核心 void Touch_Key_Handle(void) { if(HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_10) GPIO_PIN_SET) { // 出水按键按下 g_touch_confirm_cnt; if(g_touch_confirm_cnt 1) { // 第一次点击提示启动倒计时3秒内有效 HAL_GPIO_WritePin(GPIOE, GPIO_PIN_0, GPIO_PIN_SET); // 提示灯亮 g_last_operate_time HAL_GetTick(); } else if(g_touch_confirm_cnt 2 (HAL_GetTick() - g_last_operate_time) 3000) { // 3秒内第二次点击确认出水 g_touch_confirm_cnt 0; g_dev_status DEVICE_WORKING; g_last_operate_time HAL_GetTick(); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_0, GPIO_PIN_RESET); // 提示灯灭 } } else { // 超时未确认重置计数 if(HAL_GetTick() - g_last_operate_time 3000) { g_touch_confirm_cnt 0; HAL_GPIO_WritePin(GPIOE, GPIO_PIN_0, GPIO_PIN_RESET); } } } // 停止出水单次点击即可 void Stop_Water_Handle(void) { if(HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_11) GPIO_PIN_SET) { g_dev_status DEVICE_IDLE; Pump_Control(0); SolenoidValve_Control(0); g_last_operate_time HAL_GetTick(); } }7优化版自清洁策略 联网可靠性// 自清洁核心逻辑带中断保护 void Self_Clean_Optimize(void) { if(g_dev_status ! DEVICE_CLEANING) return; static uint8_t clean_step 1; static uint32_t clean_start 0; static uint8_t clean_progress 0; // 清洁进度断电后恢复 // 从EEPROM恢复清洁进度异常断电保护 if(clean_start 0) { EEPROM_Read(0x200, clean_progress, 1); clean_step clean_progress / 20 1; } switch(clean_step) { case 1: // 反冲滤芯20%进度 Pump_Reverse_Control(1); // 水泵反转 SolenoidValve_Drain_Control(1); // 排污阀开 if(HAL_GetTick() - clean_start 5000) { clean_step 2; clean_progress 20; } break; case 2: // 正冲滤芯40%进度 Pump_Reverse_Control(0); Pump_Control(1); if(HAL_GetTick() - clean_start 10000) { clean_step 3; clean_progress 40; } break; case 3: // 静置60%进度 Pump_Control(0); if(HAL_GetTick() - clean_start 15000) { clean_step 4; clean_progress 60; } break; case 4: // UV杀菌80%进度 UV_Light_Control(1); if(HAL_GetTick() - clean_start 25000) { clean_step 5; clean_progress 80; } break; case 5: // 排水100%进度 UV_Light_Control(0); SolenoidValve_Control(1); if(HAL_GetTick() - clean_start 30000) { clean_step 0; clean_progress 100; g_dev_status DEVICE_IDLE; g_save_data.clean_count; Data_Save(); // 保存清洁次数 } break; } // 实时保存清洁进度 EEPROM_Write(0x200, clean_progress, 1); } // 联网可靠性增强断网缓存重连 void MQTT_Reliable_Manage(void) { static uint8_t reconnect_cnt 0; static uint8_t cache_buf[512] {0}; static uint16_t cache_len 0; if(!mqtt_client_is_connected()) { // 断网 if(reconnect_cnt 10) { // 最大重连10次 mqtt_client_reconnect(); reconnect_cnt; HAL_Delay(10000); // 10秒重连一次 } // 缓存待发送数据 if(cache_len 512) { memcpy(cache_buf[cache_len], Data_Pack(), strlen(Data_Pack())); cache_len strlen(Data_Pack()); } } else { // 联网恢复 reconnect_cnt 0; // 补发缓存数据 if(cache_len 0) { MQTT_Send_Encrypt(cache_buf, cache_len); cache_len 0; memset(cache_buf, 0, 512); } // 正常上报 MQTT_Send_Encrypt(Data_Pack(), strlen(Data_Pack())); } }8制水安全保障 主循环// 制水安全总控空转/高温/滤芯前置检测 void Water_Make_Safe_Control(void) { if(g_dev_status ! DEVICE_WORKING) return; // 1. 空转保护无水流3秒停机 static uint32_t no_flow_start 0; if(Flow_Sensor_Read() 0) { // 无水流 if(HAL_GetTick() - no_flow_start 3000) { g_dev_status DEVICE_ERROR; Pump_Control(0); } } else { no_flow_start HAL_GetTick(); } // 2. 高温保护水温45℃停机 if(Temp_Sensor_Read() 45) { g_current_fault FAULT_OVERHEAT; g_dev_status DEVICE_ERROR; Pump_Control(0); } // 3. 滤芯前置检测寿命5%禁止制水 if(g_save_data.filter_life[0] 5 || g_save_data.filter_life[1] 5 || g_save_data.filter_life[2] 5) { g_dev_status DEVICE_ERROR; Pump_Control(0); EEPROM_Save_Fault(FAULT_NONE); // 记录滤芯预警 } // 4. 累计流量更新制水时 g_save_data.total_flow Flow_Sensor_Read(); } // 主循环整合所有功能 void Main_Loop(void) { // 初始化恢复断电数据 Data_Recovery(); MQTT_Init(); // 初始化MQTT while(1) { // 1. 硬件自检最高优先级 Hardware_Self_Check(); if(g_current_fault ! FAULT_NONE) { Fault_Alarm(); // 故障报警 HAL_Delay(1000); continue; } // 2. 安全控制 Anti_Dry_Control(); Water_Make_Safe_Control(); // 3. 核心功能 Touch_Key_Handle(); Stop_Water_Handle(); Self_Clean_Optimize(); MQTT_Reliable_Manage(); // 4. 低功耗管理 Low_Power_Manage(); // 5. 数据保存 Data_Save(); HAL_Delay(100); } }3. APP 交互层关键逻辑Kotlin// 防误触确认APP端二次确认 fun confirmWaterOut() { AlertDialog.Builder(requireContext()) .setTitle(确认出水) .setMessage(是否确认开启出水) .setPositiveButton(确认) { _, _ - sendCommand({\cmd\:\water_on\}) } .setNegativeButton(取消, null) .show() } // 故障信息解析与展示 fun parseFaultData(faultCode: Int) { val faultMsg when(faultCode) { 1 - 水泵故障请检查 2 - 电磁阀故障请检查 3 - 传感器断线请检查接线 4 - 设备缺水请加水后重试 5 - 设备过热已停机保护 6 - 指令被篡改请注意设备安全 else - 设备正常 } tv_fault_msg.text faultMsg if(faultCode ! 0) { tv_fault_msg.setTextColor(Color.RED) } else { tv_fault_msg.setTextColor(Color.BLACK) } } // 自清洁进度展示 fun updateCleanProgress(progress: Int) { pb_clean.progress progress tv_clean_progress.text 清洁进度$progress% if(progress 100) { tv_clean_progress.text 清洁完成 // 刷新清洁次数 tv_clean_count.text 累计清洁${cleanCount}次 } }三、关键设计细节1. 安全优先级设计功能执行优先级从高到低硬件故障自检 防干烧 / 缺水 低功耗 自清洁 制水 联网上报确保安全功能永不被抢占。2. 防误触双层保障本地连续 2 次点击3 秒内确认出水单次点击仅提示APP点击出水后弹出二次确认对话框防止误触屏幕。3. 数据保护三重机制定时保存每 5 分钟自动保存关键数据异常触发掉电检测引脚触发即时保存数据校验CRC 校验防止 EEPROM 数据损坏。4. 低功耗优化待机 5 分钟进入 STOP 模式功耗从 10mA 降至 50μA仅保留 RTC 时钟和触摸 / 水位中断唤醒源外设按需启停制水时开启传感器待机时关闭。四、测试验证方案表格测试模块测试方法预期结果硬件自检断开水泵 / 传感器接线短接电磁阀立即检测到故障停机并上报防缺水 / 干烧抽干水箱水位模拟空转3 秒内停机记录故障APP 推送预警断电数据保护制水时断电重启设备累计流量 / 滤芯寿命 / 清洁进度完整恢复低功耗待机 5 分钟测量 MCU 功耗功耗降至 50μA 以内触摸按键可正常唤醒加密通信篡改 MQTT 指令内容设备检测到篡改丢弃指令并上报故障防误触单次点击出水键3 秒内二次点击单次点击仅提示二次点击才启动制水自清洁中断清洁中断电重启设备从断点继续清洁进度不丢失联网可靠性断网后下发指令恢复网络断网缓存指令联网后自动补发执行总结本设计完整覆盖硬件自检、数据保护、安全防护、低功耗、加密通信、防误触、智能清洁、联网可靠、制水安全九大核心需求所有功能围绕 “安全优先、稳定可靠” 设计关键安全逻辑防干烧、硬件自检为最高优先级确保设备在任何情况下都能保障用户安全数据保护、低功耗、联网缓存等机制大幅提升设备的实用性和稳定性符合家用设备的使用场景。该方案可直接基于 STM32L051 硬件平台落地代码包含完整的异常处理和边界防护适配 95% 以上的家用 RO 反渗透净水器硬件可根据实际硬件参数微调传感器阈值和控制逻辑。