|
随着国家房地长建设的大力发展,建筑工程的增多,由建筑施工造成的扬尘污染问题日趋严重,为了有力快捷的对施工现场的扬尘状况进行监控,我们利用硬件平台采集施工现场扬尘pm2.5/pm10含量信息,点阵屏在现场显示含量信息,并通过GPRS网络将pm颗粒物(PM10/PM2.5)含量信息传输给中国移动OneNet平台,扬尘监管部门就可以通过平台查看扬尘含量信息,并可以通过手机端查看,极大方便了对于扬尘污染情况的监控与控制.
2.功能介绍硬件整体实物图:
OneNet平台创建设备(通信协议采用MQTT格式):
通过平台查看PM10和PM2.5含量数据:
手机端数据查看(中移OnetNet平台提供手机APP安装包,利用PC端注册账号登录APP即可):
组成一:GD32F350小红板(板载CMSIS-DAP下载调试接口,USB虚拟串口,所有IO引出,用户按键,指示灯)
组成二:PMS3003颗粒物传感器
(攀藤出品,可以检测输出PM1.0/PM2.5/PM10颗粒物含量,接口方式为TTL串口,主动输出(1S))
连接核心板PA10(串口0 RXd)
串口接收传感器数据处理:
- void USART0_IRQHandler(void)
- {
- if(RESET != usart_interrupt_flag_get(EVAL_COM1, USART_INT_FLAG_RBNE))
- {
- /* receive data */
- receiver_buffer[rxcount] = (usart_data_receive(EVAL_COM1) & 0x7F);
- if(receiver_buffer[0]==0x42)//传感器数据的首字节
- {
- rxcount++;
- if(rxcount==2)
- {
- if(receiver_buffer[1]!=0x4d)//传感器数据的第二个字节
- rxcount=0;
- }
- if(rxcount==24)//一帧数据接收完成
- {
- rxcount=0;
- Rec_Uart0_Flag=1;
- }
- }
- }
- }
复制代码
接收解析获取数据:
- if(Rec_Uart0_Flag==1) //接收到一帧传感器数据
- {
- Rec_Uart0_Flag=0;
- Pm1_0=receiver_buffer[10]<<8|receiver_buffer[11];
- Pm2_5=receiver_buffer[12]<<8|receiver_buffer[13];
- Pm10=receiver_buffer[14]<<8|receiver_buffer[15];
-
- }
复制代码
组成三:AIR202GPRS模块
(来自合宙,十几块钱的高性价比模块,串口波特率自适应,支持移动联通卡,在本系统中起联网交互作用)
与核心板PA15/PA3连接(串口1的 Rxd/Txd)
在调试串口1时,遇到问题:核心板硬件将PA2/PA3通过CH340转换输出的,开始我将GPRS模块的串口和PA2/PA3连接使用,发现串口1的接收端数据传输时,低电平时不能将电平拉低到0V,后来怀疑是作为虚拟串口使用的问题,所以将接收口IO与CH340中间连接的电阻R31去掉,避免其受到CH340的影响,去掉后果然解决了问题,但其中的原因还没有清楚!
单片机与AIR202通信,要对串口接收到的数据进行处理,采用空闲中断处理更为合理,即当串口接收完一帧数据后置位一个标志,根据这个标志来判断接收数据完成,从而开始解析数据处理判断.
串口中断处理代码如下:
- void USART1_IRQHandler(void)
- {
- if(RESET != usart_interrupt_flag_get(EVAL_COM2, USART_INT_FLAG_RBNE))//接收一字节完成中断
- {
- if(m6312_cnt>=128)
- m6312_cnt=0;
- /* receive data */
- m6312_buf[m6312_cnt] = (usart_data_receive(EVAL_COM2) & 0x7F);
- m6312_cnt++;
-
- }
- if(RESET != usart_interrupt_flag_get(EVAL_COM2, USART_INT_FLAG_IDLE)) //串口空闲中断
- {
- usart_interrupt_flag_clear(EVAL_COM2,USART_INT_FLAG_IDLE); //清除标志
- /* receive data */
- RecUart1Finish=1; //置位标志供判断
-
- }
- }
复制代码
组成四:点阵屏
两块HUB-08接口的16*64点阵屏(单色红)
驱动单屏原理:四组IO控制使能十六行点阵,一组IO向每行传输数据,CLK IO一个,锁存IO一个,数据使能IO一个.
驱动两个单屏,除了数据IO不同外,其他控制IO均可共用.
点阵屏驱动核心是需要不停的向两个屏幕送数据,所以要开启一个定时器,利用定时器中断服务来执行送数据函数,本系统利用timer1定时器,
定时时间为4ms.定时器配置代码如下:
- /*
- 计一个数的时间=(sys/prescaler)/TIMER_CKDIV_DIV1
- 定时时间=计一个数的时间*自动重载值=100us*500=50ms;
- */
- void timer1_init()
- {
- timer_parameter_struct timer_initpara;
-
- rcu_periph_clock_enable(RCU_TIMER1);
- timer_deinit(TIMER1);
-
- timer_initpara.prescaler = 10800- 1; //预分频器
- timer_initpara.alignedmode = TIMER_COUNTER_EDGE; //边沿对齐模式
- timer_initpara.counterdirection = TIMER_COUNTER_UP;//向上计数
- timer_initpara.period = 10; //自动重载值
- timer_initpara.clockdivision = TIMER_CKDIV_DIV1; //分频
- timer_initpara.repetitioncounter =0; //计数器重复值 0-255
-
- timer_init(TIMER1, &timer_initpara);
- timer_interrupt_enable(TIMER1, TIMER_INT_UP);
- nvic_irq_enable(TIMER1_IRQn, 1, 1);
-
- timer_enable(TIMER1);
- }
复制代码
在定时器中断执行点阵驱动代码如下:(注意:在中断执行的函数一定要保证在中断时间内执行完成,否则会影响主程序的代码执行,所以本例采用的是每进中断一次只送一行点阵数据,下一次就发送下一行数据,目的就是可以在中断时间内代码足以执行完毕)
- //4ms进中断一次
- void TIMER1_IRQHandler()
- {
- timer_interrupt_flag_clear(TIMER1, TIMER_INT_FLAG_UP);
- gd_eval_led_toggle(LED1);
-
- test_led(); //使能某一行点阵,并发送该行数据
- create_show(0);//产生该屏数据
- }
复制代码
接下来要写一下关于上传OneNet平台使用MQTT协议的内容........未完待续
作品演示视频链接:
https://training.eeworld.com.cn/video/15939
|
|