基于STM32L152的智能水表系统设计与实现

基于STM32L152的智能水表系统设计与实现


一、系统架构设计

  1. 硬件组成

    • 主控芯片:STM32L152C8T6(低功耗Cortex-M3内核)

    • 传感器模块

      • 霍尔水流传感器(如A1302)或涡轮流量传感器
      • 霍尔水位传感器(用于水箱监测)
    • 通信模块

      • NB-IoT模块(如BC28)用于远程数据传输
      • 蓝牙模块(HC-05)用于本地配置
    • 外围电路

      • OLED显示屏(0.96英寸)
      • 蜂鸣器报警电路
      • 继电器控制电磁阀
      • EEPROM(AT24C256)存储用水数据
  2. 功能模块

    • 流量计量:脉冲捕获→流量计算→累计用水量
    • 低功耗管理: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

四、关键算法与优化

  1. 流量校准算法

    // 零点校准(静止时消除传感器漂移)
    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;
    }
    
  2. 阶梯计费算法

    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;
    }
    
  3. 低功耗优化

    • 电源管理:关闭未用外设(如ADC、DAC)
    • 时钟优化:主频降至8MHz(从16MHz)
    • 睡眠策略:无操作时进入Stop模式(功耗<1mA)

五、硬件设计要点

  1. 传感器接口电路

    霍尔传感器连接:
    VCC → 3.3V
    GND → GND
    OUT → TIM2_CH1 (PA0)
    滤波电路:0.1μF电容 + 10kΩ电阻
    
  2. 电源设计

    • 锂电池供电:3.7V → 降压至3.3V(TPS63060芯片)
    • 低功耗监测:检测VBAT电压(ADC通道)
  3. 抗干扰措施

    • 传感器信号线加磁珠
    • 电源电路加TVS管
    • PCB四层板设计(GND平面隔离)

六、测试与验证

测试项目 方法 预期结果
流量精度 标准量杯注水(10L) 误差≤±1%
通信稳定性 连续发送1000条数据 丢包率<0.1%
待机时间 无操作状态 ≥90天(2250mAh电池)
报警响应 模拟低余额 蜂鸣器响+LED闪烁

参考代码

七、扩展功能建议

  1. 安全增强

    • AES加密通信数据
    • 物联网卡SIM锁(防止盗用)
  2. 智能控制

    • 手机APP远程控制阀门(通过蓝牙)
    • 用水习惯分析(生成周/月报告)
  3. 环境监测

    • 集成温度/水质传感器(如DS18B20)
    • 异常水质报警(浊度超标)

 

专注于matlab/simulink,电子电路,编程