关于制作基于STM32的指纹打卡器(不完全体)
笔者认为首先需要构思好此打卡器需要实现的功能有哪些?作为一个指纹打卡器首先应该具备指纹识别功能。其次需要将我们识别到的用户反馈到显示器上给予打卡者打卡成功的反馈,同时可以在打卡成功的同时加入蜂鸣器进行提醒。最后需要在打卡成功以后将打卡者的打卡时间存储到某个具有存储功能的介质当中。
首先实现实现第一步指纹的录入与识别。笔者使用的是YX-66319电容指纹识别模块,使用此模块的录入指纹我们需要首先使用其提供的上位机进行,录入成功以后。就可以进入指纹部分的代码编写了,更具官方提供的通信协议进行用户识别。
完成串口初始化以后,开启串口1的中断服务接收指纹信息
之后便可比打卡者指纹与指纹库中的指纹。代码如下:
u8 ACK_SEARCH()
{
u8 i;
USART1_RX_STA=0;
for(i=0;i<8;i++)
{
USART_SendData(USART1,CMD_SEARCH[i]);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//µÈ´ý·¢ËͽáÊø
}
while((USART1_RX_STA&0x80)==0)//µÈ´ý½ÓÊճɹ¦
{
i++;
delay_ms(10);
if(i==50)
return 1;//Èç¹ûʱ¼ä¹ý³¤ÔòÖ±½ÓÍ˳ö
}
if(Set[4]==ACK_NOUSER||Set[4]==ACK_TIMEOUT)
{
return 2;
}
else
{
name =(Set[2]<<8)+Set[3];
return 0;
}
}
判断其是否已经录入指纹,如果比对成功则返回其用户ID号。至此指纹模块的任务完成。
得到我们需要的ID号后我们可以将其与我们的用户库(即结构体数组)中的用户ID进行比对,然后再OLED上显示打卡者的姓名与打卡成功与否。笔者曾经想用IIC通信实现与OLED的通信,但是移植了中景的代码却一直没有成功,无奈放弃IIC通信使用SPI通信(请各位大佬指点)。
while(1)
{
i = ACK_SEARCH();
if(!i)
{
OLED_Clear();
OLED_ShowString(0,2,"Successfully");
OLED_ShowNum(0,6,name,3,12);
delay_ms(1000);
}
else if(i == 2)
{
OLED_Clear();
OLED_ShowCHinese(0,3,0);
OLED_ShowCHinese(18,3,1);
OLED_ShowCHinese(36,3,2);
OLED_ShowCHinese(54,3,3);
OLED_ShowCHinese(72,3,4);
OLED_ShowCHinese(90,3,5);
delay_ms(1000);
}
}
此处显示的便是成功识别用户显示其id号1号用户,打卡成功。假如识别失败时便显示不存在此用户。另外打卡成功时蜂鸣器会发出声响此处蜂鸣器代码便不展示了。
完成了了指纹的对比识别以及显示以后我们还需要考虑其功耗问题,因为笔者使用的是锂电池供电所以笔者与实验室的小伙伴认为还需让打卡器在不工作时进入待机模式于是笔者便移植了正点的待机唤醒方案。因为YX-66319电容指纹识别模块的2号引脚在用手指靠经识别时会提供一个高电平于是我们使其成为我们的唤醒信号。在代码移植方面只需将2号引脚接在PA0口。
if(WKUP_KD == 0){
delay_ms(1000);
if(WKUP_KD == 0){
Sys_Enter_Standby();
}
}
完成了这些以后便只差最后一步将其存储在存储介质中,笔者选择将其存储在SD卡中但是目前遇到比较多的问题首先是c8t6的大小不足,然后便是初始化一直失败返回0xFF,移植没有成功,后续成功后笔者会再发博完善。