基于CW32的公交站人流检测系统

例程资料链接如下(群文件也可下载):
BD网盘链接:
https://pan.baidu.com/s/1YZJtAhO3Wsjy5aBuTJ-c_Q?pwd=rm7q
提取码:rm7q
相关视频:基于CW32的公交站人流检测系统

一、实验简介

人流检测是一项重要的城市交通管理任务,它不仅关系到公交服务的效率和质量,还与城市交通规划和公共安全紧密相关。首先,公交站人流检测可以实时反馈乘客流量情况,帮助公交公司了解各线路、各站点的客流需求。其次,公交站人流检测可以为公交公司制定和优化运营策略提供数据支持。再次,公交站人流检测可以及时发现拥挤、拥堵等情况,提醒调度中心及时采取措施,保障乘客安全。基于此背景,我们以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;  
		}
	}
}

四、效果演示
在这里插入图片描述

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值