目錄
收獲
系統(tǒng)總體框架
程序框架
具體程序?qū)崿F(xiàn)
工程文件網(wǎng)盤鏈接
收獲
學(xué)習(xí)freertos的移植與裁剪,對任務(wù)間通信的認(rèn)識更加深刻,加深了實(shí)時(shí)操作系統(tǒng)的理解,學(xué)習(xí)了as608指紋模塊,rc522刷卡模塊等模塊的簡單使用。
系統(tǒng)總體框架
該系統(tǒng)采用STM32F407ZGT6為主控芯片,在FreeRTOS下與分別通過as608指紋模塊,RFID射頻識別卡模塊,LCD觸屏模塊以及esp8266WIFI模塊完成解鎖,配合顯示模塊,舵機(jī),用蜂鳴器進(jìn)行提示共同組成整個(gè)門禁系統(tǒng),系統(tǒng)的整體框架圖如下所示
首先指紋模塊提前采取好需要識別的指紋到模塊內(nèi)置的芯片里面,將手指放到指紋識別模塊上,系統(tǒng)會(huì)檢測到指紋按下并且會(huì)采取當(dāng)前的指紋圖像與芯片內(nèi)部的指紋圖像進(jìn)行識別,若識別成功,蜂鳴器響兩下,并且LCD屏幕會(huì)顯示指紋識別成功,舵機(jī)會(huì)轉(zhuǎn)動(dòng)180°模擬解鎖成功,當(dāng)指紋識別到的圖像與模塊存儲(chǔ)的指紋識別不一致,則蜂鳴器會(huì)響3下,LCD屏幕會(huì)顯示指紋識別失敗,舵機(jī)不會(huì)轉(zhuǎn)動(dòng)。RFID射頻識別功能是當(dāng)使用者使用識別卡靠近RC522 RFID射頻模塊,此模塊會(huì)識別到當(dāng)前卡的卡號,若卡號與我寫入的卡號一致則解鎖成功,并且LCD屏幕會(huì)顯示識別卡成功,舵機(jī)會(huì)轉(zhuǎn)動(dòng)180°模擬解鎖成功;LCD觸屏密碼鎖的功能是當(dāng)使用者在屏幕輸入密碼,密碼正確則解鎖成功,并且LCD屏幕會(huì)顯示指紋識別成功,舵機(jī)會(huì)轉(zhuǎn)動(dòng)180°模擬解鎖成功。WIFI遠(yuǎn)程解鎖則是ESP8266模塊設(shè)置成AP+TCP服務(wù)器端,手機(jī)連接其熱點(diǎn)并且在TCP客戶端輸入正確ip地址和端口號,輸入正確的命令后解鎖成功。當(dāng)每一次解鎖失敗則會(huì)記錄下這一次解鎖失敗,當(dāng)累計(jì)3次后則舵機(jī)鎖死。
由基于FreeRTOS操作系統(tǒng)下創(chuàng)建了一個(gè)開始任務(wù)和四個(gè)控制任務(wù)。任務(wù)與任務(wù)之間使用事件標(biāo)志組進(jìn)行通信,當(dāng)TFTLCD屏幕觸屏輸入密碼的時(shí),當(dāng)密碼輸入正確,則向舵機(jī)任務(wù)發(fā)送一個(gè)事件標(biāo)志位;當(dāng)指紋識別成功時(shí),則向舵機(jī)任務(wù)發(fā)送一個(gè)事件標(biāo)志位;當(dāng)射頻識別卡識別成功卡號時(shí)候;則向舵機(jī)任務(wù)發(fā)送一個(gè)事件標(biāo)志位;當(dāng)藍(lán)牙從手機(jī)串口發(fā)生密碼時(shí),當(dāng)密碼識別成功,則向舵機(jī)任務(wù)發(fā)送一個(gè)事件標(biāo)志位。舵機(jī)任務(wù)只要接收到其中一個(gè)事件標(biāo)志位時(shí)候,舵機(jī)就會(huì)轉(zhuǎn)動(dòng)180°來模擬解鎖成功。當(dāng)如果每解鎖失敗一次之后,err全局變量加一,當(dāng)err等于3的時(shí)候,則舵機(jī)任務(wù)被掛起。
具體程序?qū)崿F(xiàn)
創(chuàng)建事件組
EventGroupHandle_t EventGroupHandler; //事件標(biāo)志組句柄
#define EVENTBIT_0 (1<<0) //事件位
#define EVENTBIT_1 (1<<1)
#define EVENTBIT_2 (1<<2)
#define EVENTBIT_ALL (EVENTBIT_0|EVENTBIT_1|EVENTBIT_2)
開始任務(wù)函數(shù)
//開始任務(wù)任務(wù)函數(shù)
void start_task(void *pvParameters)
{
BaseType_t xReturn;
taskENTER_CRITICAL(); //進(jìn)入臨界區(qū)
EventGroupHandler=xEventGroupCreate();
if(NULL!=EventGroupHandler)
printf("EventGroupHandler事件創(chuàng)建成功\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任務(wù)創(chuàng)建成功\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任務(wù)創(chuàng)建成功\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任務(wù)創(chuàng)建成功\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任務(wù)創(chuàng)建成功\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任務(wù)創(chuàng)建成功\r\n");
vTaskDelete(StartTask_Handler); //刪除開始任務(wù)
taskEXIT_CRITICAL(); //退出臨界區(qū)
}
舵機(jī)任務(wù)(利用舵機(jī)模擬門鎖轉(zhuǎn)動(dòng))
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); //延時(shí)10ms,也就是10個(gè)時(shí)鐘節(jié)拍
}
}
LCD觸摸屏輸入密碼任務(wù)
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("密碼輸入錯(cuò)誤\r\n");
LCD_ShowString(80,150,260,16,16,"password error");
err++;
if(err==3)
{
vTaskSuspend(SG90Task_Handler);
printf("舵機(jī)任務(wù)掛起\r\n");
LCD_ShowString(0,100,260,16,16,"Task has been suspended");
}
}
vTaskDelay(100); //延時(shí)10ms,也就是10個(gè)時(shí)鐘節(jié)拍
}
}
rc522識別卡任務(wù)
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("舵機(jī)任務(wù)掛起\r\n");
LCD_ShowString(0,100,260,16,16,"Task has been suspended");
}
}
vTaskDelay(100); //延時(shí)10ms,也就是10個(gè)時(shí)鐘節(jié)拍
}
}
as608指紋識別任務(wù)
void AS608_task(void *pvParameters)
{
while(1)
{
if(PS_Sta) //檢測PS_Sta狀態(tài),如果有手指按下
{
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("舵機(jī)任務(wù)掛起\r\n");
LCD_ShowString(0,100,260,16,16,"Task has been suspended");
}
}
}
vTaskDelay(100);
}
}
esp8266任務(wù)
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("密碼錯(cuò)誤\r\n");
memset(USART3_RX_BUF,0,sizeof(USART3_RX_BUF));
}
USART3_RX_STA=0;
// continue;
}
vTaskDelay(100);
}
}
工程文件網(wǎng)盤鏈接
文章來源:http://www.zghlxwxcb.cn/news/detail-780769.html
鏈接:https://pan.baidu.com/s/1d_hQY91rDy5VRq5E4HCYZg?
提取碼:dpfr文章來源地址http://www.zghlxwxcb.cn/news/detail-780769.html
到了這里,關(guān)于FreeRTOS小項(xiàng)目實(shí)戰(zhàn)------基于FreeRTOS和stm32的門禁系統(tǒng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!