一、系统架构设计
-
硬件组成
-
主控芯片:STM32L152C8T6(低功耗Cortex-M3内核)
-
传感器模块:
-
霍尔水流传感器(如A1302)或涡轮流量传感器
-
霍尔水位传感器(用于水箱监测)
-
-
通信模块:
-
NB-IoT模块(如BC28)用于远程数据传输
-
蓝牙模块(HC-05)用于本地配置
-
-
外围电路:
-
OLED显示屏(0.96英寸)
-
蜂鸣器报警电路
-
继电器控制电磁阀
-
EEPROM(AT24C256)存储用水数据
-
-
-
功能模块
-
流量计量:脉冲捕获→流量计算→累计用水量
-
低功耗管理:RTC定时唤醒+睡眠模式
-
远程通信:NB-IoT上传数据至阿里云
-
本地交互:OLED显示+蓝牙配置
-
安全控制:IC卡充值+余额扣费
-
二、核心代码实现
1. 流量计量模块
// 定时器配置(TIM2捕获传感器脉冲)
void TIM2_Init(void) {TIM_ICInitTypeDef TIM_ICInitStruct;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);TIM_ICInitStruct.TIM_Channel = TIM_Channel_1;TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;TIM_ICInitStruct.TIM_ICFilter = 0x06;TIM_ICInit(TIM2, &TIM_ICInitStruct);TIM_Cmd(TIM2, ENABLE);
}// 中断服务函数(每转脉冲计数)
void TIM2_IRQHandler(void) {if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET) {water_pulse_count++; // 累计脉冲数TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);}
}// 流量计算(每秒更新)
float Get_FlowRate(void) {static uint32_t last_count = 0;static float flow_rate = 0.0;uint32_t current_count = water_pulse_count;flow_rate = (current_count - last_count) * 0.01f; // 假设1脉冲=10L/hlast_count = current_count;return flow_rate;
}
2. 低功耗管理
// 进入低功耗模式(RTC唤醒)
void Enter_Stop_Mode(void) {PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);// RTC配置(10秒唤醒)RTC_SetPrescaler(32767); // 32.768kHz / 32767 ≈ 1HzRTC_SetCounter(0);RTC_WaitForSynchro();RTC_ITConfig(RTC_IT_SEC, ENABLE);
}// RTC中断唤醒
void RTC_IRQHandler(void) {if (RTC_GetITStatus(RTC_IT_SEC) != RESET) {RTC_ClearITPendingBit(RTC_IT_SEC);// 唤醒后执行数据采集Read_Sensor_Data();}
}
3. NB-IoT通信模块
// 发送数据至阿里云
void Send_Data_To_Cloud(float water_usage) {char cmd[128];sprintf(cmd, "AT+CGATT=1\r\n");HAL_UART_Transmit(&huart2, (uint8_t*)cmd, strlen(cmd), 1000);sprintf(cmd, "AT+QICSGP=1,1\r\n"); // 附着网络HAL_UART_Transmit(&huart2, (uint8_t*)cmd, strlen(cmd), 1000);// 构建MQTT消息sprintf(cmd, "{\"water\":%.2f}", water_usage);HAL_UART_Transmit(&huart2, (uint8_t*)cmd, strlen(cmd), 1000);
}
4. 本地交互模块
// OLED显示
void Display_Water_Data(float usage, float balance) {OLED_Clear();OLED_ShowString(0, 0, "Water Usage:");OLED_ShowNum(0, 12, usage, 5, 16);OLED_ShowString(0, 32, "Balance:");OLED_ShowNum(0, 44, balance, 5, 16);
}// 蓝牙配置
void Bluetooth_Config(void) {HAL_UART_Receive_IT(&huart1, (uint8_t*)rx_buffer, 1);if (rx_buffer[0] == 'S') {HAL_UART_Transmit(&huart1, (uint8_t*)"START\r\n", 6, 1000);}
}
三、系统工作流程
int main(void) {// 硬件初始化SystemInit();TIM2_Init();OLED_Init();Bluetooth_Init();NB_IoT_Init();while(1) {// 正常模式:每10秒唤醒一次Read_Sensor_Data(); // 读取流量/水位Update_Display(); // 刷新OLEDCheck_Alarm(); // 检测报警条件// 低功耗模式Enter_Stop_Mode();}
}// 水量计算中断(TIM3每秒触发)
void TIM3_IRQHandler(void) {if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) {static float total_usage = 0.0;total_usage += Get_FlowRate();EEPROM_Write(ADDR_USAGE, total_usage); // 存储总用水量}
}
参考代码 stm32l152实现智能水表程序 www.youwenfan.com/contentcnr/56357.html
四、关键算法与优化
-
流量校准算法
// 零点校准(静止时消除传感器漂移) void Calibrate_Zero(void) {float baseline = 0.0;for(int i=0; i<1000; i++) {baseline += Get_FlowRate();HAL_Delay(1);}flow_offset = baseline / 1000.0f; } -
阶梯计费算法
float Calculate_Fee(float usage) {float fee = 0.0;if(usage <= 10.0) fee = 20.0; // 第一阶梯else if(usage <= 30.0) fee = 20 + (usage-10)*1.5; // 第二阶梯else fee = 20 + 20 * 1.5 + (usage-30)*2.5; // 第三阶梯return fee; } -
低功耗优化
-
电源管理:关闭未用外设(如ADC、DAC)
-
时钟优化:主频降至8MHz(从16MHz)
-
睡眠策略:无操作时进入Stop模式(功耗<1mA)
-
五、硬件设计要点
-
传感器接口电路
霍尔传感器连接: VCC → 3.3V GND → GND OUT → TIM2_CH1 (PA0) 滤波电路:0.1μF电容 + 10kΩ电阻 -
电源设计
-
锂电池供电:3.7V → 降压至3.3V(TPS63060芯片)
-
低功耗监测:检测VBAT电压(ADC通道)
-
-
抗干扰措施
-
传感器信号线加磁珠
-
电源电路加TVS管
-
PCB四层板设计(GND平面隔离)
-
六、测试与验证
| 测试项目 | 方法 | 预期结果 |
|---|---|---|
| 流量精度 | 标准量杯注水(10L) | 误差≤±1% |
| 通信稳定性 | 连续发送1000条数据 | 丢包率<0.1% |
| 待机时间 | 无操作状态 | ≥90天(2250mAh电池) |
| 报警响应 | 模拟低余额 | 蜂鸣器响+LED闪烁 |
参考代码
七、扩展功能建议
-
安全增强
-
AES加密通信数据
-
物联网卡SIM锁(防止盗用)
-
-
智能控制
-
手机APP远程控制阀门(通过蓝牙)
-
用水习惯分析(生成周/月报告)
-
-
环境监测
-
集成温度/水质传感器(如DS18B20)
-
异常水质报警(浊度超标)
-
