0x00 前言
自从去年六月二十一日离校,想来毕业已八月有余,工作也渐入正轨,很久很久没写博客了,就今天开始更吧,哈哈,本文主要讨论一些功能的代码实现。
毕业设计题目“智能公交系统电子站牌设计”,大概是模拟一个公交车信息实时发布系统,采集公交车信息,再发布在站台和移动客户端,系统结构如下图。
0x01 站牌思路
站牌主要功能是接收显示公交信息,但考虑也可以上传些数据,索性增加几个传感器,采集些数据,大概长下面这个样子。模块和单片机通讯除了LCD用的FSMC其他都是串口UART。整个站牌部分主要麻烦在LCD屏的驱动和无线通信部分的代码。
0x02 ILI9320
ILI9320是液晶屏的驱动芯片,屏幕分辨率320 × 240像素,单片机通过FSMC总线控制器操作屏幕,需要16根数据线和6根控制线,外加电源接地等共24根线才能驱动。FSMC(Flexible Static Memory Controller)是STM32的一个并行接口,通过此接口,单片机可以控制NOR Flash、NAND Flash、SRAM 和 PSRAM。除了控制储存器,FSMC还可以控制支持Intel8080 和Motorola 6800时序的LCD屏幕。这个文档详细介绍了相关技术:Using the high-density STM32F10xxx FSMC peripheral to drive external memories。核心初始化代码如下,
1 |
|
以上代码大部分是LCD商家提供的驱动,主要更改了管脚配置和初始化时增加对RESET管脚和背光管脚的配置,必须配置背光和RESET才能点亮液晶。完整代码见文末Github仓库地址。
0x03 串口GPRS模块
选择通信模块时考虑到时间有限,选择开发难度相对较低(不需要开发驱动)的串口GPRS模块,模块型号:USR-GSM232-7S3,主要特性是支持GPRS网络通信,支持数据请求地址自定义或请求至官方后台,官方后台提高访问数据的API。在上位机软件配置好请求地址后,向串口发送数据,模块会自动打包数据并向配置的服务器地址发起请求,整个模块类似一个HTTP客户端。当然,这个模块的缺点也很明显,2G网络速度太慢,请求一帧数据到收到服务器回复平均需要十几秒。上位机示意图如下图。
图中省略号的内容由如下代码实现,后台部分的实现将在另一篇博文里介绍。模块实际请求的地址为: http://xkmg9m2k.qcloud.la/weapp/usrcloud?a=255&b=1&c=18&d=15&e=1&f=12&g=50&h=3&i=0
- 其中a参数指示站牌初始化状态,类似于帧头,0xff:初始化成功;0xfe:初始化失败;
- b参数指示站牌工作状态,1:工作正常;0:工作异常;
- c参数指示温度数据,单位:℃;
- d参数指示湿度数据,单位:%rh;
- e参数指示pm2.5浓度的整数部分(抠脚的变量命名方式2333);
- f参数指示pm2.5浓度的小数部分,单位:ug/m3;
- g参数指示噪音传数据的整数部分;
- h参数指示噪音数据的小叔部分,单位:dB;
- i参数无实际意义,作用类似于帧尾或者保留参数。
1 | if(dht11_flag==1) //get请求参数:a=255&b=1&c=18&d=15&e=1&f=12&g=50&h=3&i=0 |
0x04 传感器简介
噪音传感器和pm2.5传感器都是通过串口读取数据,只需按要求初始化串口配置并解析收到的数据即可。DHT11温湿度传感器数据读取需按特定的时序,模块和单片机间使用单总线传输数据。在购买模块时商家已提供驱动代码,相关代码见Github仓库,驱动时序如下图所示。
0x05 最终成品
站牌制作过程并不复杂,只需把买来的模块焊接在面包板上即可,各模块的供电统一由一个12V输出的适配器提供,5V电源由一个直流降压模块提供,模块间的连线使用杜邦线,比较混乱。整个毕业设计的代码仓库地址:https://github.com/abillie/Graduation-Project
注:代码有bug未解决,不过就保留原样吧233。