基于STM32L152的智能水表系统设计与实现
一、系统架构设计
-
硬件组成
-
主控芯片: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/h
last_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 ≈ 1Hz
RTC_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(); // 刷新OLED
Check_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)
- 异常水质报警(浊度超标)