基于 STM32 的公交车定位与报站系统设计
公共交通服务的智能化要求车辆具备精准的定位与语音报站能力。本文设计一种基于 STM32F103C8T6 单片机的公交车定位与报站系统,整合 ATGM336H GPS 模块、OLED12864 显示、JR6001 语音播报、按键阵列与 ESP8266 远程通信模块,实现到站触发语音播报、动态显示站点名称与距离并把车辆位置上传至 APP。
一、系统功能总览
| 功能编号 | 功能名称 | 说明 |
|---|---|---|
| F1 | GPS 定位 | ATGM336H 接收 GPS / 北斗 |
| F2 | 站点触发 | 按键切换站点 |
| F3 | 距离计算 | 与下一站点经纬度比较 |
| F4 | 语音播报 | JR6001 播报到站信息 |
| F5 | 显示输出 | OLED 显示距离与站名 |
| F6 | 远程监控 | ESP8266 + APP |
| F7 | 报警功能 | 按键报警并上传 |
| F8 | 站点编辑 | 通过 APP 配置线路站点 |
二、核心模块选型对比
2.1 主控模块选型
| 方案 | 型号 | 备注 |
|---|---|---|
| 方案 1 | STM32F103C8T6 | 多 USART + I2C 满足多模块 |
| 方案 2 | 51 单片机 | 资源紧张 |
选择方案 1:GPS 模块与语音模块都需要 UART。
2.2 GPS 模块选型
| 方案 | 型号 | 卫星系统 |
|---|---|---|
| 方案 1 | ATGM336H | GPS + 北斗 |
| 方案 2 | NEO-6M | GPS |
选择方案 1:国内北斗支持更佳。
2.3 语音播报模块选型
| 方案 | 型号 | 升级方式 |
|---|---|---|
| 方案 1 | JR6001 | USB 直接拷贝语音 |
| 方案 2 | AB1000 | 蓝牙升级 |
选择方案 1:USB 升级方案便于运维。
2.4 显示模块选型
| 方案 | 模块 | 备注 |
|---|---|---|
| 方案 1 | OLED12864 | 显示站点与距离 |
| 方案 2 | LCD12864 | 字符显示 |
选择方案 1:响应快,对比度高。
2.5 无线模块选型
| 方案 | 模块 | 优势 |
|---|---|---|
| 方案 1 | ESP8266 | 直连 Wi-Fi / 4G 路由 |
| 方案 2 | SIM800 | 4G 蜂窝 |
选择方案 1:便于室内测试。
三、系统接线总表
| 模块 | 引脚 | 单片机端 | 备注 |
|---|---|---|---|
| ATGM336H | VCC/GND/TX/RX | 3.3 V / GND / PA10 / PA9 | UART 9600 |
| OLED12864 | VCC/GND/SCL/SDA | 3.3 V / GND / PB6 / PB7 | I2C |
| JR6001 | VCC/GND/TX/RX/BUSY | 5 V / GND / PA3 / PA2 / PA4 | UART |
| 按键 ×4 | 一端/另一端 | PB0/PB1/PB2/PB3 / GND | 站点切换 / 报警 |
| ESP8266 | VCC/GND/TX/RX/CH_PD | 3.3 V / GND / PA5 / PA6 / 3.3 V | UART |
四、系统软件设计
4.1 主程序流程
int main(void)
{
SystemInit();
GPS_Init();
OLED_Init();
JR6001_Init();
ESP8266_Init();
ESP8266_JoinAP("bus","pwd");
while (1)
{
NMEA_Data gps = GPS_Parse();
float dist = Haversine(gps, NextStop_LatLon());
OLED_Show(gps, dist, NextStop_Name());
if (Key_SitePressed() || dist < 30)
{
JR6001_PlayIndex(cur_site_id);
cur_site_id++;
}
if (Key_AlarmPressed()) JR6001_PlayAlarm();
ESP8266_Publish(gps, dist, cur_site_id);
delay_ms(500);
}
}
4.2 GPS 解析
UART 接收 $GPGGA 语句后提取经纬度,并将字符串转换为浮点数。
4.3 距离计算(Haversine)
double Haversine(double lat1, double lon1, double lat2, double lon2)
{
double R = 6371000.0;
double dLat = (lat2 - lat1) * M_PI / 180;
double dLon = (lon2 - lon1) * M_PI / 180;
double a = sin(dLat/2) * sin(dLat/2)
+ cos(lat1 * M_PI/180) * cos(lat2 * M_PI/180)
* sin(dLon/2) * sin(dLon/2);
return 2 * R * asin(sqrt(a));
}
4.4 JR6001 语音播放
通过 UART 发送 0xAA 0x07 0x02 0x00 0xxx 0xBB 协议,其中 0xxx 为语音编号。
4.5 远程上报
ESP8266 通过 MQTT 把 gps_lat、gps_lng、distance_to_next、cur_site_id 推送给云端,APP 拉取渲染。
五、系统实现与测试
5.1 硬件焊接与测试
GPS 天线朝上固定于车顶,避免金属屏蔽;JR6001 音频输出接车载喇叭。
5.2 软件调试
Keil 5 + ST-Link,结合串口助手观察 GPS 报文与 JR6001 返回的 ACK。
5.3 功能测试结果
| 测试项目 | 操作 | 结果 |
|---|---|---|
| GPS 室外定位 | 开阔街道 | 误差 ≤ 5 m |
| 距离计算 | 实地模拟两个站点 | 偏差 ≤ 10 m |
| 语音播报 | 触发到站按键 | 1 s 内播放 |
| APP 同步 | 网页端查看 | 实时刷新 |
六、总结
本文围绕 STM32F103C8T6 设计的公交车定位与报站系统整合了 GPS 定位、OLED 显示、JR6001 语音播报与 ESP8266 远程通信,实现了实时站点信息显示、自动语音播报以及云端车辆位置同步。整套方案结构清晰、易于扩展,可为城市公交、长途客运与校园通勤线路提供一套可量产的智能化原型设计。
七、资料内容完整工程资料(原理图、PCB、代码、元件清单)

八、资料获取方式
