FreeRTOS小项目实战------基于FreeRTOS和stm32的门禁系统

这篇具有很好参考价值的文章主要介绍了FreeRTOS小项目实战------基于FreeRTOS和stm32的门禁系统。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

收获

系统总体框架

程序框架

具体程序实现

工程文件网盘链接

收获

学习freertos的移植与裁剪,对任务间通信的认识更加深刻,加深了实时操作系统的理解,学习了as608指纹模块,rc522刷卡模块等模块的简单使用。

系统总体框架

该系统采用STM32F407ZGT6为主控芯片,在FreeRTOS下与分别通过as608指纹模块,RFID射频识别卡模块,LCD触屏模块以及esp8266WIFI模块完成解锁,配合显示模块,舵机,用蜂鸣器进行提示共同组成整个门禁系统,系统的整体框架图如下所示

freertos项目,FreeRTOS,单片机,stm32,嵌入式硬件

首先指纹模块提前采取好需要识别的指纹到模块内置的芯片里面,将手指放到指纹识别模块上,系统会检测到指纹按下并且会采取当前的指纹图像与芯片内部的指纹图像进行识别,若识别成功,蜂鸣器响两下,并且LCD屏幕会显示指纹识别成功,舵机会转动180°模拟解锁成功,当指纹识别到的图像与模块存储的指纹识别不一致,则蜂鸣器会响3下,LCD屏幕会显示指纹识别失败,舵机不会转动。RFID射频识别功能是当使用者使用识别卡靠近RC522 RFID射频模块,此模块会识别到当前卡的卡号,若卡号与我写入的卡号一致则解锁成功,并且LCD屏幕会显示识别卡成功,舵机会转动180°模拟解锁成功;LCD触屏密码锁的功能是当使用者在屏幕输入密码,密码正确则解锁成功,并且LCD屏幕会显示指纹识别成功,舵机会转动180°模拟解锁成功。WIFI远程解锁则是ESP8266模块设置成AP+TCP服务器端,手机连接其热点并且在TCP客户端输入正确ip地址和端口号,输入正确的命令后解锁成功。当每一次解锁失败则会记录下这一次解锁失败,当累计3次后则舵机锁死。

由基于FreeRTOS操作系统下创建了一个开始任务和四个控制任务。任务与任务之间使用事件标志组进行通信,当TFTLCD屏幕触屏输入密码的时,当密码输入正确,则向舵机任务发送一个事件标志位;当指纹识别成功时,则向舵机任务发送一个事件标志位;当射频识别卡识别成功卡号时候;则向舵机任务发送一个事件标志位;当蓝牙从手机串口发生密码时,当密码识别成功,则向舵机任务发送一个事件标志位。舵机任务只要接收到其中一个事件标志位时候,舵机就会转动180°来模拟解锁成功。当如果每解锁失败一次之后,err全局变量加一,当err等于3的时候,则舵机任务被挂起。

具体程序实现

创建事件组

EventGroupHandle_t EventGroupHandler;	//事件标志组句柄
#define EVENTBIT_0	(1<<0)				//事件位
#define EVENTBIT_1	(1<<1)
#define EVENTBIT_2	(1<<2)
#define EVENTBIT_ALL	(EVENTBIT_0|EVENTBIT_1|EVENTBIT_2)

开始任务函数

//开始任务任务函数
void start_task(void *pvParameters)
{
	BaseType_t xReturn;
    taskENTER_CRITICAL();           //进入临界区
	
	
	EventGroupHandler=xEventGroupCreate();
	if(NULL!=EventGroupHandler)
		printf("EventGroupHandler事件创建成功\r\n");
		
	xReturn=xTaskCreate((TaskFunction_t )SG90_task,             
                (const char*    )"SG90_task",           
                (uint16_t       )SG90_STK_SIZE,        
                (void*          )NULL,                  
                (UBaseType_t    )SG90_TASK_PRIO,        
                (TaskHandle_t*  )&SG90Task_Handler);  
	if(xReturn==pdPASS)
		printf("SG90_TASK_PRIO任务创建成功\r\n");
	
	
    
    xReturn=xTaskCreate((TaskFunction_t )LCD_task,             
                (const char*    )"LCD_task",           
                (uint16_t       )LCD_STK_SIZE,        
                (void*          )NULL,                  
                (UBaseType_t    )LCD_TASK_PRIO,        
                (TaskHandle_t*  )&LCDTask_Handler); 
   if(xReturn==pdPASS)
		 printf("LCD_TASK_PRIO任务创建成功\r\n");	

   xReturn=xTaskCreate((TaskFunction_t )RFID_task,             
                (const char*    )"RFID_task",           
                (uint16_t       )RFID_STK_SIZE,        
                (void*          )NULL,                  
                (UBaseType_t    )RFID_TASK_PRIO,        
                (TaskHandle_t*  )&RFIDTask_Handler); 
   if(xReturn==pdPASS)
		 printf("RFID_TASK_PRIO任务创建成功\r\n");

   xReturn=xTaskCreate((TaskFunction_t )AS608_task,             
                (const char*    )"AS608_task",           
                (uint16_t       )AS608_STK_SIZE,        
                (void*          )NULL,                  
                (UBaseType_t    )AS608_TASK_PRIO,        
                (TaskHandle_t*  )&AS608Task_Handler); 
   if(xReturn==pdPASS)
		 printf("AS608_TASK_PRIO任务创建成功\r\n");
	 
	  xReturn=xTaskCreate((TaskFunction_t )ESP8266_task,             
                (const char*    )"ESP8266_task",           
                (uint16_t       )ESP8266_STK_SIZE,        
                (void*          )NULL,                  
                (UBaseType_t    )ESP8266_TASK_PRIO,        
                (TaskHandle_t*  )&ESP8266Task_Handler); 
   if(xReturn==pdPASS)
		 printf("ESP8266_TASK_PRIO任务创建成功\r\n");
	 
	 
	 
    vTaskDelete(StartTask_Handler); //删除开始任务
    taskEXIT_CRITICAL();            //退出临界区
}

舵机任务(利用舵机模拟门锁转动)

void SG90_task(void * pvParameters)
{
	 volatile EventBits_t EventValue;	
	while(1)
	{
		
		
		   EventValue=xEventGroupWaitBits(EventGroupHandler,EVENTBIT_ALL,pdTRUE,pdFALSE,portMAX_DELAY);
		   
				  printf("接收事件成功\r\n");
		      set_Angle(180);
			    delay_xms(1000);
			    delay_xms(1000);
			    set_Angle(0);
			    LCD_ShowString(80,150,260,16,16,"              ");

			vTaskDelay(100); //延时10ms,也就是10个时钟节拍
				
	}	
}

LCD触摸屏输入密码任务

void LCD_task(void * pvParameters)
{
  
//	sg90flag=GET_NUM();
	
	while(1)
	{
		 
			  if(sg90flag==1||GET_NUM())
				{
					 BEEP=1;
					 delay_xms(100);
					 BEEP=0;
				   printf("密码输入正确\r\n");
					 LCD_ShowString(80,150,260,16,16,"password match");
		       xEventGroupSetBits(EventGroupHandler,EVENTBIT_0);
	 
				}
        else
				{
					 BEEP=1;
					 delay_xms(50);
					 BEEP=0;
					 delay_xms(50);
					 BEEP=1;
					 delay_xms(50);
					 BEEP=0;
					delay_xms(50);
					 BEEP=1;
					 delay_xms(50);
					 BEEP=0;
					printf("密码输入错误\r\n");
					LCD_ShowString(80,150,260,16,16,"password error");
					err++;
					if(err==3)
					{
					  vTaskSuspend(SG90Task_Handler);
						printf("舵机任务挂起\r\n");
						LCD_ShowString(0,100,260,16,16,"Task has been suspended");
					}			
				}					
			vTaskDelay(100); //延时10ms,也就是10个时钟节拍
	}	
}

rc522识别卡任务

void RFID_task(void * pvParameters)
{
	
//	 rfidflag=shibieka();
   while(1)
	 {
	    if(rfidflag==1||shibieka())
			{
				   BEEP=1;
					 delay_xms(100);
					 BEEP=0;
				 Chinese_Show_two(30,50,16,16,0);
	       Chinese_Show_two(50,50,18,16,0);
	       Chinese_Show_two(70,50,20,16,0);
	       Chinese_Show_two(90,50,8,16,0);
	       Chinese_Show_two(110,50,10,16,0);
	       
				xEventGroupSetBits(EventGroupHandler,EVENTBIT_1);
				printf("识别卡号成功\r\n");
				
			
			}
			else if(shibieka()==0)
			{
				BEEP=1;
					 delay_xms(50);
					 BEEP=0;
					 delay_xms(50);
					 BEEP=1;
					 delay_xms(50);
					 BEEP=0;
					delay_xms(50);
					 BEEP=1;
					 delay_xms(50);
					 BEEP=0;
				Chinese_Show_two(90,50,12,16,0);
	      Chinese_Show_two(110,50,14,16,0);
			  printf("识别卡号失败\r\n");
				err++;
					if(err==3)
					{
					  vTaskSuspend(SG90Task_Handler);
						printf("舵机任务挂起\r\n");
						LCD_ShowString(0,100,260,16,16,"Task has been suspended");
					}
				
			
			}
			
	   vTaskDelay(100); //延时10ms,也就是10个时钟节拍
	 }

}

as608指纹识别任务

void AS608_task(void *pvParameters)
{
  while(1)
	{
		if(PS_Sta)	 //检测PS_Sta状态,如果有手指按下
		{
		   if(press_FR()==1)
			{
				 BEEP=1;
				 delay_xms(100);
				 BEEP=0;
				 Chinese_Show_two(30,25,0,16,0);
	       Chinese_Show_two(50,25,2,16,0);
	       Chinese_Show_two(70,25,4,16,0);
	       Chinese_Show_two(90,25,6,16,0);
	       Chinese_Show_two(110,25,8,16,0);
	       Chinese_Show_two(130,25,10,16,0);
				 xEventGroupSetBits(EventGroupHandler,EVENTBIT_2);
			   printf("指纹识别成功");
				 
				 
			
			}
			else if(press_FR()==0)
			{
				BEEP=1;
					 delay_xms(50);
					 BEEP=0;
					 delay_xms(50);
					 BEEP=1;
					 delay_xms(50);
					 BEEP=0;
					delay_xms(50);
					 BEEP=1;
					 delay_xms(50);
					 BEEP=0;
				Chinese_Show_two(110,25,12,16,0);
	      Chinese_Show_two(130,25,14,16,0);
			  printf("指纹识别失败");
				err++;
					if(err==3)
					{
					  vTaskSuspend(SG90Task_Handler);
						printf("舵机任务挂起\r\n");
						LCD_ShowString(0,100,260,16,16,"Task has been suspended");
					}
			
			}
			     
		}
		vTaskDelay(100);
	}
}

esp8266任务

void ESP8266_task(void *pvParameters)
{

  while(1)
	{
	   if(USART3_RX_STA)
		{
			if(strstr((const char*)USART3_RX_BUF,"on"))
			{
				 BEEP=1;
				 delay_xms(100);
				 BEEP=0;
			   printf("开门成功\r\n");
				 xEventGroupSetBits(EventGroupHandler,EVENTBIT_0);
				 memset(USART3_RX_BUF,0,sizeof(USART3_RX_BUF));
			}				
				
			if(!strstr((const char*)USART3_RX_BUF,"on"))
			{
			  printf("密码错误\r\n");
				memset(USART3_RX_BUF,0,sizeof(USART3_RX_BUF));
			}				
	
			USART3_RX_STA=0;
//			continue;
		}
		vTaskDelay(100);	
	}
}

工程文件网盘链接

freertos项目,FreeRTOS,单片机,stm32,嵌入式硬件

链接:https://pan.baidu.com/s/1d_hQY91rDy5VRq5E4HCYZg 
提取码:dpfr文章来源地址https://www.toymoban.com/news/detail-780769.html

到了这里,关于FreeRTOS小项目实战------基于FreeRTOS和stm32的门禁系统的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于STM32的多功能门禁系统(AS608指纹识别、密码解锁、刷卡解锁)

    目录 一、项目功能 二、视频 三、原理图 4、材料选择 5、部分程序 1、AS608指纹解锁;可以录入、删除、验证指纹; 2、密码解锁;可以密码验证、修改密码和保存密码; 3、刷卡解锁; 4、OLED液晶显示; 基于STM32的多功能门禁系统(AS608指纹识别、密码解锁、刷卡解锁) AS608指纹

    2024年02月12日
    浏览(55)
  • stm32毕业设计 智能门禁系统

    Hi,大家好,今天向大家介绍一个学长做的单片机项目 基于单片机的门禁系统 大家可用于 课程设计 或 毕业设计 门禁系统的基本组成主要包括身份识别、传感与报警、处理与控制、电锁与执行、管理与设置。 本系统从应用角度出发,针对家庭或小型办公场所的使用需求,主

    2024年02月01日
    浏览(53)
  • RFID课程设计--基于STM32F103RCT6的智能门禁系统,STM32RCT6+RC522+OLED+DHT11+4*4矩阵键盘

      本次课程设计要求如下,我们团队两人完成了90%的功能。   其中我们设置的是刷卡错误3次不报警,密码输入错3次报警(原理相同,大家根据需要自行修改)   然后暂时只能显示卡号和卡是第几个录入到系统中的,想到身份证号和电话(身份信息)输进去有点长就没

    2024年01月16日
    浏览(81)
  • stm32毕设 stm32 RFID员工打卡门禁系统(源码+硬件+论文)

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月20日
    浏览(62)
  • 毕业设计 stm32人脸识别门禁系统(源码+硬件+论文)

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月09日
    浏览(78)
  • STM32外设集 -- 人脸识别门禁系统(K210--HEX协议版本)

    人脸,指纹识别已经走进人们的生活,无疑这方便了人们的生活,也提高了安全和可靠性,所以作为未来的学习方向,我也来接触接触人脸识别(有不足之处请见谅😁) 因为这款芯片有充足的开源资料足够支撑我们学习,并将文档也很友好 相关资料连接 使用说明 (Github):

    2023年04月08日
    浏览(46)
  • 详细!基于ESP32的智能门禁系统(华为云iot+微信小程序)

    git地址:智能门禁(云IOT+微信小程序) 开关门效果 创建产品 创建产品 , 协议类型选择MQTT,数据格式选择JSON ,其他参数自定 设备注册 找到所属产品,认证类型选择密钥,单击确定后注册成功 注册成功后出现如下页面,点击保存并关闭,会自动下载好\\\"device_id\\\"和\\\"secret\\\",保

    2023年04月26日
    浏览(45)
  • 【基于Arduino RFID门禁系统】

    介绍 射频识别或RFID(Radio-Frequency Identification)是一种通过无线电信号进行自动识别,通过RFID标签检索和存储数据的方法。 这些 RFID 标签可以贴在动物、物体上。因此,这些标签具有许多应用,例如贴在车辆上的不停车标签、动物识别。有 3 种类型的 RFID 标签:无源标签是对

    2024年02月12日
    浏览(48)
  • 基于树莓派的人脸识别门禁系统

    1、概述:本次在树莓派上安装Opencv及其扩展模块,考虑到树莓派的SD卡容量和内存的限制,不采用直接pip安装方法,而采用编译Opencv源码的方式进行安装。 2、遇到的问题及解决方法 遇到的问题 解决方法 缺少”cuda.hpp” 将/home/pi/opencv_contrib3.4.1/modules/xfeatures2d/include/opencv2下的

    2023年04月19日
    浏览(48)
  • 物联网毕业设计 基于RFID的门禁系统

    Hi,大家好,学长今天向大家介绍一个 如何使用RFID技术构建一个单片机门禁系统 基于RFID的门禁系统 大家可用于 课程设计 或 毕业设计 选题指导,项目分享: https://gitee.com/yaa-dc/warehouse-1/blob/master/iot/README.md 本篇博客,学长先向大家介绍射频识别技术的概念、 分类及工作原。

    2024年02月08日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包