若该文为原创文章,转载请注明原文出处。

一、引言

(一)研究背景及意义

高速公路收费系统是智能交通系统(ITS)的核心组成部分,其效率、准确性和可靠性直接关系到道路的通行效率、运营收益和交通安全。传统收费系统存在称重不准、缴费效率低、无法有效防作弊、管理成本高等问题。将高精度称重RFID身份识别自动计费控制物联网云平台技术深度融合,构建一个集车辆称重分类、自动计费、安全控制、远程监管于一体的高速收费系统,具有重大的现实意义。本项目基于STM32单片机,旨在实现车辆的快速、准确称重与分类,实现按车型和通行时长精准计费,并通过联动道闸和云平台,杜绝超载车辆上路、防止收费漏洞,极大提升高速公路的运营管理现代化水平。

(二)国内外研究现状

目前,国内外高速收费系统已普遍采用ETC(电子不停车收费)技术,但其核心是DSRC通信,与RFID技术同属射频范畴。本设计提出的“称重+RFID+计时”模式,更侧重于入口预检、计重防超、时长计费的综合管理,常用于停车场、物流园区或特定路段的收费场景,是对传统ETC和人工收费模式的一种有效补充和创新。现有方案多将称重、读卡、控制分立,系统集成度低。本研究旨在提供一个高度集成、智能决策的一体化终端解决方案。

二、系统总体设计

(一)系统架构

本系统采用“前端精准感知与控制 - 云端集中管理”的架构。

  • 感知控制层(收费亭终端):以STM32为核心,负责车辆称重、车型判断、RFID身份识别、计时计费、道闸控制和异常报警,是所有业务的执行终端。

  • 网络传输层:ESP8266 Wi-Fi模块,负责将交易记录、报警信息等数据上传至云平台,并接收云端下发的费率、黑名单等配置信息。

  • 云端应用层:云服务器负责车辆档案管理、费率策略制定、财务对账、数据统计分析,并为运营人员提供集中监控平台。

核心业务流程

  1. 入口流程车辆驶上秤台 -> 称重并判断车型(小车/货车) -> 司机刷卡 -> 系统记录车型、卡号、入口时间 -> 抬杆放行

  2. 计费逻辑(出口) 司机再次刷卡 -> 系统计算通行时长 -> 根据车型单价计算费用 -> (可选:显示费用并确认) -> 抬杆放行

  3. 安全逻辑称重超限 -> 声光报警,道闸绝不抬杆车辆长时间未出 -> 向云端发送报警信息

(二)功能模块划分

  1. 车辆称重与分类模块:称重传感器 + 信号调理电路。

  2. 身份识别与计费模块:RFID读卡器 + STM32(计时器)。

  3. 道闸安全控制模块:舵机/继电器 + 红外对射传感器(防追尾)。

  4. 人机交互模块:OLED显示屏 + 按键 + 声光报警器。

  5. 数据通信模块:ESP8266 Wi-Fi模块。

  6. 主控模块:STM32单片机。

三、硬件设计与实现

(一)系统硬件框架图

  • STM32F103C8T6 (主控核心)

  • HX711称重模块 (24位ADC):DT接 PA4, SCK接 PA5

  • 称重传感器 (如电阻应变式):接HX711模块

  • RFID读卡模块 (RC522, SPI):SDA接 PA15, SCK接 PB3, MOSI接 PB5, MISO接 PB4, RST接 PB6

  • 红外对射传感器 (防追尾):接收端输出接 PA0

  • SG90舵机 (道闸控制):信号线接 PA1 (TIM2_CH2 PWM)

  • OLED (SSD1306) : I2C接口,接 PB7(SCL), PB8(SDA)

  • 按键 x 4:车型选择(小车/货车)、设置、确认、手动抬杆 接至 PC13PC14PC15PA8

  • 有源蜂鸣器:接 PA9

  • RGB LED:R、G、B引脚接 PA10PA11PA12 (PWM调色)

  • ESP-01S (ESP8266) : 接USART2 PA2(TX), PA3(RX)

(二)主控模块选型及介绍

主控芯片选用STM32F103C8T6。其资源丰富:

  • 高速SPI:用于与RFID模块通信。

  • 多路GPIO:用于控制HX711、按键、指示灯等。

  • 定时器:用于产生PWM控制舵机和LED,以及高精度计时。

  • UART:用于与Wi-Fi模块通信。

(三)传感器模块选型及电路设计

  1. 称重模块

    • 核心:选用HX711专用24位高精度ADC芯片,专为称重传感器设计,内部集成放大器,可直接连接应变片。

    • 传感器:选用电阻应变式称重传感器,通常为4线制(E+, E-, S+, S-),形成惠斯通电桥。量程需覆盖预期最大车重(如2吨)。

    • 安装:秤台需有足够的机械结构支撑,确保车辆压上时力能准确传递到传感器上。

  2. RFID读卡模块 (RC522):用于识别车辆身份。SPI接口,通信速率快。

  3. 红外对射传感器:安装于道闸栏杆后方,用于检测车辆是否完全通过。必须选用抗强光型,以适应室外环境。

(四)通信模块选型及配置

选用ESP-01S模块。配置其连接收费站的Wi-Fi网络,通过MQTT协议与云平台通信。MQTT的发布/订阅模式非常适合本系统的报警推送和数据上报。

(五)执行模块选型及驱动电路

  1. 道闸控制:选用大力矩舵机(如MG996R) 或通过继电器控制专业的220VAC道闸机。后者更可靠,但需强电隔离设计。

  2. 声光报警器:蜂鸣器用于声音提示,RGB LED用于视觉状态指示(绿灯:正常;红灯:超重/报警;蓝灯:读卡;黄灯:等待)。

四、软件设计与实现

(一)开发环境搭建

  • IDE: Keil uVision5

  • : STM32HAL库 + HX711驱动 + RC522驱动

  • 协议: cJSON库,MQTT协议

(二)系统初始化

// main.c
#include "hx711.h"
#include "rc522.h"
#include "servo.h"
#include "ssd1306.h"
#include "esp8266_mqtt.h"

// 全局变量
VehicleType_TypeDef current_vehicle_type = TYPE_CAR;
float current_weight = 0.0;
uint32_t entry_time = 0;
uint32_t vehicle_presence_timer = 0;

int main(void) {
  // ... HAL初始化与外设初始化
  MX_GPIO_Init();
  MX_SPI1_Init();
  MX_USART2_UART_Init();
  MX_I2C1_Init();
  MX_TIM2_Init(); // For Servo PWM

  HX711_Init();
  RC522_Init();
  SERVO_Init(&htim2);
  SERVO_SetAngle(0); // 初始落杆
  OLED_Init();
  ESP8266_MQTT_Init();

  while (1) {
      Main_Task();
      HAL_Delay(100);
  }
}

(三)核心功能实现

void Main_Task(void) {
    // 1. 称重与车型判断
    if (HX711_IsReady()) {
        current_weight = HX711_GetWeight(); // 获取重量,已去皮
        OLED_ShowWeight(current_weight);

        // 判断是否超重 (货车阈值更高)
        float weight_limit = (current_vehicle_type == TYPE_CAR) ? CAR_WEIGHT_LIMIT : TRUCK_WEIGHT_LIMIT;
        if (current_weight > weight_limit) {
            RGBLED_SetColor(RED);
            Buzzer_Beep(2);
            OLED_ShowMessage("Overweight! Forbidden!");
            return; // 阻塞在此,禁止后续流程
        } else {
            RGBLED_SetColor(BLUE); // 重量正常,蓝灯提示刷卡
            OLED_ShowMessage("Weight OK. Please Scan Card.");
        }
    }

    // 2. RFID刷卡入口
    uint8_t card_id[4];
    if (RC522_FindCard(card_id) == MI_OK) {
        // 转换卡号为字符串
        char card_str[9];
        sprintf(card_str, "%02X%02X%02X%02X", card_id[0], card_id[1], card_id[2], card_id[3]);
        // 记录入口信息
        entry_time = HAL_GetTick();
        // 上传入口记录到云端
        Cloud_UploadEntryRecord(card_str, current_vehicle_type, entry_time);
        // 抬杆
        SERVO_SetAngle(90);
        RGBLED_SetColor(GREEN);
        Buzzer_Beep(1);
        OLED_ShowMessage("Welcome! Gate Open.");
        // 启动车辆在位计时器
        vehicle_presence_timer = HAL_GetTick();
    }

    // 3. 防追尾与落杆逻辑
    static uint8_t last_ir_state = 1;
    uint8_t ir_state = HAL_GPIO_ReadPin(IR_BARRIER_GPIO_Port, IR_BARRIER_Pin);
    if (last_ir_state == 0 && ir_state == 1) { // 检测到上升沿,车辆已完全通过
        HAL_Delay(2000); // 安全延时,确保车辆尾部也通过
        SERVO_SetAngle(0); // 落杆
        vehicle_presence_timer = 0; // 停止计时
    }
    last_ir_state = ir_state;

    // 4. 车辆滞留检测
    if (vehicle_presence_timer != 0) {
        if (HAL_GetTick() - vehicle_presence_timer > MAX_STAY_TIME) {
            Buzzer_Beep(3);
            RGBLED_SetColor(RED);
            Cloud_SendAlarm("Vehicle滞留警报!", card_str);
            vehicle_presence_timer = 0; // 避免重复报警
        }
    }

    // 5. 出口计费逻辑 (在另一个状态中,例如通过按键或再次刷卡触发)
    if (is_exit_mode) {
        uint32_t exit_time = HAL_GetTick();
        uint32_t duration_minutes = (exit_time - entry_time) / 60000; // 计算分钟数
        float unit_price = (current_vehicle_type == TYPE_CAR) ? CAR_PRICE_PER_MIN : TRUCK_PRICE_PER_MIN;
        float fee = duration_minutes * unit_price;

        OLED_ShowFee(fee, duration_minutes);
        // ... 等待确认或直接扣费
        Cloud_UploadExitRecord(card_str, exit_time, fee);
        SERVO_SetAngle(90); // 抬杆放行
    }
}

(四)云端通信实现

// 上传入口记录
void Cloud_UploadEntryRecord(char* card_id, VehicleType_TypeDef type, uint32_t entry_ticks) {
    cJSON *root = cJSON_CreateObject();
    cJSON_AddStringToObject(root, "event", "entry");
    cJSON_AddStringToObject(root, "card_id", card_id);
    cJSON_AddStringToObject(root, "type", (type == TYPE_CAR) ? "car" : "truck");
    cJSON_AddNumberToObject(root, "weight", current_weight);
    cJSON_AddNumberToObject(root, "entry_time", entry_ticks);

    char *json_str = cJSON_Print(root);
    ESP8266_MQTT_Publish("highway/entry", json_str);
    cJSON_Delete(root);
    free(json_str);
}

// 接收云端配置(MQTT订阅回调)
void MQTT_Callback(char* topic, char* payload) {
    cJSON *root = cJSON_Parse(payload);
    if (root) {
        cJSON *cmd = cJSON_GetObjectItem(root, "command");
        if (cmd && strcmp(cmd->valuestring, "update_config") == 0) {
            cJSON *car_weight = cJSON_GetObjectItem(root, "car_weight_limit");
            cJSON *truck_weight = cJSON_GetObjectItem(root, "truck_weight_limit");
            cJSON *car_price = cJSON_GetObjectItem(root, "car_price");
            cJSON *truck_price = cJSON_GetObjectItem(root, "truck_price");
            // ... 更新STM内存中的阈值
        }
    }
}

五、系统测试与优化

(一)测试方案

  1. 精度测试:使用标准砝码对称重系统进行校准和精度测试,确保小车和货车的分类准确。

  2. 场景测试

    • 正常流程:模拟小车/货车正常称重、刷卡、通行、计费。

    • 异常流程:测试超重车辆的处理、车辆滞留报警、网络中断时的数据缓存与重传。

    • 压力测试:模拟连续车辆通行,测试系统响应速度和稳定性。

  3. 环境测试:在室外环境下测试称重传感器的温漂、红外传感器的抗干扰能力。

(二)测试结果与分析

预计测试中,称重系统的长期稳定性与抗干扰能力(如风、震动)是最大挑战。防追尾逻辑的可靠性也需大量测试,确保绝不砸车。不同车型的轴重分布可能影响称重准确性,需要在算法或机械结构上加以考虑。

(三)系统优化

  1. 算法优化

    • 称重滤波:采用滑动平均滤波卡尔曼滤波,有效抑制称重数据的抖动。

    • 动态去皮:在无车时自动监测重量零点,消除温度等环境因素引起的漂移。

  2. 可靠性优化

    • 看门狗:启用STM32的独立看门狗(IWDG),防止程序死机。

    • 本地存储:使用EEPROM存储关键阈值和交易记录,网络中断时不丢失数据。

  3. 功能增强

    • 车牌识别辅助:增加摄像头,在出口处通过车牌号与RFID信息进行复核,防止“换卡”作弊。

    • 语音播报:增加语音模块,播报重量、车型、费用等信息,提升用户体验。

六、结论与展望

(一)未来展望

  1. AI车型识别:融合摄像头和AI图像识别技术,自动识别车辆类型(小客车、货车、拖挂车),与称重结果交叉验证,杜绝人工选择车型可能带来的作弊行为。

  2. 信用支付与无感支付:与信用系统或银行账户绑定,实现先通行后扣费,甚至全程无感支付,进一步提升通行效率。

  3. 大数据分析:云平台对海量通行数据(车流量、车型分布、重量、通行时间)进行分析,为道路规划、养护、运营策略提供数据支撑。

  4. L4级自动驾驶集成:为未来的智能网联汽车提供标准化的车路通信接口,车辆可自动完成缴费流程。

如有侵权,或需要完整代码,请及时联系博主。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐