一、实验简介
公交站人流检测是一项重要的城市交通管理任务,它不仅关系到公交服务的效率和质量,还与城市交通规划和公共安全紧密相关。首先,公交站人流检测可以实时反馈乘客流量情况,帮助公交公司了解各线路、各站点的客流需求。其次,公交站人流检测可以为公交公司制定和优化运营策略提供数据支持。再次,公交站人流检测可以及时发现拥挤、拥堵等情况,提醒调度中心及时采取措施,保障乘客安全。基于此背景,我们以CW32单片机为核心,采用公交站人流检测中常见的红外线检测技术,设计了一个公交站人流检测系统,该系统可以连接到网络获取当前时间,并将人流数据实时上传到OneNET云平台进行远程监控。
二、实验器材
本实验使用到了CW32-48F大学计划开发板、ESP8266WIFI模块、E18-D80NK红外光电开关及Keil5开发环境。
开发板上预留了ESP8266WIFI模块接口,通过串口与ESP8266通信。
【两个红外光电开关与单片机接线】:
蓝线 -- GND
棕线 -- 3.3V
黑线 -- PA0、PA4
三、核心代码
main.c: //单片机头文件 #include "main.h" //网络设备 #include "esp8266.h" //网络协议层 #include "onenet.h" //OneNET //硬件驱动 #include "RTC.h" //CW32RTC #include "BTIM.h" #include "usart.h" #include "Buzzer.h" //板载蜂鸣器 #include "Infrared.h" //红外光电开关 #include "Lcd_Driver.h" #include "LCD_calculate.h" uint8_t send_flag=0; //数据上云控制位 uint16_t count=0,accumulation=0; //count--当前站内人数,accumulation--累计人数 enum State{ STATE_A, STATE_B, STATE_C, STATE_D, }; //枚举数据类型,包含四个状态 void System_Init(void) { Lcd_Init(); //LCD屏初始化 BTIM_Init(); //基本定时器初始化,调控数据上云频率 Buzzer_Init(); //蜂鸣器初始化,两个红外光电开关同时被遮挡时发出声响警告 Infrared_Init(); //红外光电开关初始化 Usart1_Init(115200); //串口1,用于串口调试助手打印调试信息 Usart2_Init(115200); //串口2,与ESP8266进行通信 TFT_Welcome(); //开机界面显示 Gui_DrawFont_GBK16(0,128,GRAY1,WHITE," 网络连接中 "); ESP8266_Init();//联网,获取当前时间,接入OneNET云平台 RTC_ITConfig(RTC_IT_INTERVAL,ENABLE); //开启RTC周期中断(RTC中断开启的时机要在esp8266连接到onenet平后之后) Gui_DrawFont_GBK16(0,8,WHITE,BLUE," 公交站人流检测 "); Gui_DrawLine(0,32,128,32,GRAY1); Gui_DrawFont_GBK16(0,64,WHITE,BLUE," 站内人数:"); TFTShowNumber(4,12,count); Gui_DrawFont_GBK16(0,96,WHITE,BLUE," 累计人数:"); TFTShowNumber(6,12,accumulation); NVIC_EnableIRQ(BTIM1_IRQn); //开启定时器中断,中断周期10ms } int main(void) { uint16_t state=0xffff; //红外光电开关当前状态 enum State currentState=STATE_A; //开机为状态A System_Init(); //系统初始化 while(1) { /*模拟乘客进站的过程: 1.装置安装位置:两红外光电传开关一前一后安装在站口 2.假设站口只允许乘客排队依次进出 3.乘客进站先遮挡红外光电开关1 4.乘客继续前进,离开红外光电开关1,遮挡红外光电开关2 5.站内人数+1,累计人数+1 (若过程4中同时遮挡两个红外光电开关则蜂鸣器发出警报,等待工作人员解决故障,不计数) */ /*模拟乘客出站的过程: 1.装置安装位置:两红外光电传开关一前一后安装在站口 2.假设站口只允许乘客排队依次进出 3.乘客出站先遮挡红外光电开关2 4.乘客继续前进,离开红外光电开关2,遮挡红外光电开关1 5.站内人数-1 (若过程4中同时遮挡两个红外光电开关则蜂鸣器发出警报,等待工作人员解决故障,不计数) */ state=CW_GPIOA->IDR & 0x0011; //获取两个红外光电开关数据IO当前状态 if(state==0x0000) Buzzer_RING; //控制蜂鸣器 else Buzzer_OFF; switch(currentState) //初步模仿状态机编程模式 { case STATE_A: if(state==0x0011) currentState=STATE_B; break; case STATE_B: if(state==0x0001) currentState=STATE_C; else if(state==0x0010) currentState=STATE_D; break; case STATE_C: if(state==0x0010) {count++;accumulation++;currentState=STATE_A;TFTShowNumber(4,12,count);TFTShowNumber(6,12,accumulation);} break; case STATE_D: if(state==0x0001) {if(count!=0) count--; currentState=STATE_A;TFTShowNumber(4,12,count);} break; } if(send_flag) { OneNet_SendData(); //数据上传到OneNET ESP8266_Clear(); //清除缓存 send_flag=0; } } }
四、效果演示
连接网络
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !