当前位置:   article > 正文

基于STM32智能家居密码锁_基于32的智能门锁demo

基于32的智能门锁demo

智能门锁

  • 项目背景

在消费升级渗透在各个领域的今天,国民消费发生着巨大的变化,与每个人息息相关的家居行业也是如此。现今,越来越多的智能家居产品出现在普通老百姓的生活中,智能照明、智能窗帘、智能扫地机器人等各种智能产品都给人们的生活带来了极大的便利。智能门锁作为智能家居中重要的一环,也成为消费者家居智能化的重要选择。智能相比市面的机械门锁更加安全、更智能、更人性化而得到市场的认可,在智能门锁行业里,不少世界500强企业也在智能门锁上进行产品布局,像中国小米公司就生产智能门锁,致力打造智慧家庭,市场智能门锁能够支持五种解锁方式,支持指纹、手机、门禁卡、按键密码、钥匙解锁功能。可以说是智能家庭必不可少的成员。

开发工具:Keil5、取字软件

4*4矩阵按键

  1. int Key_Scan(void)
  2. {
  3. int keyValue ; //按键值初始化
  4. GPIO_Write(GPIOC,(GPIOC->ODR & 0xfc3f )| 0x0040);//让PC6-9输出0001,检测第1列
  5. if((GPIOC->IDR & 0x0800) != 0x0000)
  6. {
  7. delay_ms(5);//延时消抖
  8. if((GPIOC->IDR & 0x0800) != 0x0000)
  9. {
  10. only = 1; //标志位当有按键按下标志位置1
  11. while((GPIOC->IDR & 0x0800) != 0x0000);
  12. keyValue=1;
  13. }
  14. }
  15. if((GPIOB->IDR & 0x0040) != 0x0000)
  16. {
  17. delay_ms(5);//延时消抖
  18. if((GPIOB->IDR & 0x0040) != 0x0000)
  19. {
  20. only = 1;
  21. while((GPIOB->IDR & 0x0040) != 0x0000);
  22. keyValue=4;
  23. }
  24. }
  25. if((GPIOE->IDR & 0x0020) != 0x0000)
  26. {
  27. delay_ms(5);//延时消抖
  28. if((GPIOE->IDR & 0x0020) != 0x0000)
  29. {
  30. only = 1;
  31. while((GPIOE->IDR & 0x0020) != 0x0000);
  32. keyValue=7;
  33. }
  34. }
  35. if((GPIOE->IDR & 0x0040) != 0x0000)
  36. {
  37. delay_ms(5);//延时消抖
  38. if((GPIOE->IDR & 0x0040) != 0x0000)
  39. {
  40. only = 1;
  41. while((GPIOE->IDR & 0x0040) != 0x0000);
  42. keyValue='*';
  43. }
  44. }
  45. GPIO_Write(GPIOC,(GPIOC->ODR & 0xfc3f )| 0x0080);//让PC6-9输出0010,检测第二列
  46. if((GPIOC->IDR & 0x0800) != 0x0000)
  47. {
  48. delay_ms(5);//延时消抖
  49. if((GPIOC->IDR & 0x0800) != 0x0000)
  50. {
  51. only = 1;
  52. while((GPIOC->IDR & 0x0800) != 0x0000);
  53. keyValue=2;
  54. }
  55. }
  56. if((GPIOB->IDR & 0x0040) != 0x0000)
  57. {
  58. delay_ms(5);//延时消抖
  59. if((GPIOB->IDR & 0x0040) != 0x0000)
  60. {
  61. only = 1;
  62. while((GPIOB->IDR & 0x0040) != 0x0000);
  63. keyValue=5;
  64. }
  65. }
  66. if((GPIOE->IDR & 0x0020) != 0x0000)
  67. {
  68. delay_ms(5);//延时消抖
  69. if((GPIOE->IDR & 0x0020) != 0x0000)
  70. {
  71. only = 1;
  72. while((GPIOE->IDR & 0x0020) != 0x0000);
  73. keyValue=8;
  74. }
  75. }
  76. if((GPIOE->IDR & 0x0040) != 0x0000)
  77. {
  78. delay_ms(5);//延时消抖
  79. if((GPIOE->IDR & 0x0040) != 0x0000)
  80. {
  81. only = 1;
  82. while((GPIOE->IDR & 0x0040) != 0x0000);
  83. keyValue=0;
  84. }
  85. }

As608模块

  • 录入模块

        

  1. //录指纹
  2. void Add_FR(void)
  3. {
  4. u8 i,ensure ,processnum=0;
  5. u16 ID;
  6. while(1)
  7. {
  8. switch (processnum)
  9. {
  10. case 0:
  11. i++;
  12. OLED_CLS();//清屏
  13. for(int i=71;i<75;i++)
  14. {
  15. OLED_ShowCN(0+(i-71)*16,0,i);//测试显示中文
  16. }
  17. printf("请按指纹\n");
  18. delay_s(2);
  19. ensure=PS_GetImage();
  20. printf("%d\n",ensure);
  21. if(ensure==0x00)
  22. {
  23. printf("dasha\n");
  24. // BEEP=1;
  25. ensure=PS_GenChar(CharBuffer1);//生成特征
  26. //BEEP=0;
  27. if(ensure==0x00)
  28. {
  29. OLED_CLS();//清屏
  30. for(int i=75;i<79;i++)
  31. {
  32. OLED_ShowCN(0+(i-75)*16,0,i);//测试显示中文
  33. }
  34. printf("指纹正常\n");
  35. delay_s(2);
  36. i=0;
  37. processnum=1;//跳到第二步
  38. }
  39. else ShowErrMessage(ensure);
  40. }
  41. //else ShowErrMessage(ensure);
  42. break;
  43. case 1:
  44. i++;
  45. OLED_CLS();//清屏
  46. for(int i=83;i<88;i++)
  47. {
  48. OLED_ShowCN(0+(i-83)*16,0,i);//测试显示中文
  49. }
  50. printf("请按再按一次指纹\n");
  51. delay_s(2);
  52. ensure=PS_GetImage();
  53. if(ensure==0x00)
  54. {
  55. // BEEP=1;
  56. ensure=PS_GenChar(CharBuffer2);//生成特征
  57. // BEEP=0;
  58. if(ensure==0x00)
  59. {
  60. OLED_CLS();//清屏
  61. for(int i=75;i<79;i++)
  62. {
  63. OLED_ShowCN(0+(i-75)*16,0,i);//测试显示中文
  64. }
  65. printf("指纹正常\n");
  66. delay_s(2);
  67. i=0;
  68. processnum=2;//跳到第三步
  69. }else ShowErrMessage(ensure);
  70. }else ShowErrMessage(ensure);
  71. break;
  72. case 2:
  73. OLED_CLS();//清屏
  74. for(int i=112;i<118;i++)
  75. {
  76. OLED_ShowCN(0+(i-112)*16,0,i);//测试显示中文
  77. }
  78. printf("对比两次指纹\n");
  79. delay_s(2);
  80. ensure=PS_Match();
  81. if(ensure==0x00)
  82. {
  83. OLED_CLS();//清屏
  84. for(int i=88;i<94;i++)
  85. {
  86. OLED_ShowCN(0+(i-88)*16,0,i);//测试显示中文
  87. }
  88. printf("指纹对比成功\n");
  89. delay_s(2);
  90. processnum=3;//跳到第四步
  91. }
  92. else
  93. {
  94. OLED_CLS();//清屏
  95. for(int i=94;i<100;i++)
  96. {
  97. OLED_ShowCN(0+(i-94)*16,0,i);//测试显示中文
  98. }
  99. printf("指纹对比失败\n");
  100. delay_s(2);
  101. ShowErrMessage(ensure);
  102. i=0;
  103. processnum=0;//跳回第一步
  104. }
  105. delay_ms(1200);
  106. break;
  107. case 3:
  108. OLED_CLS();//清屏
  109. for(int i=100;i<106;i++)
  110. {
  111. OLED_ShowCN(0+(i-100)*16,0,i);//测试显示中文
  112. }
  113. printf("生成指纹模块\n");
  114. delay_s(2);
  115. ensure=PS_RegModel();
  116. if(ensure==0x00)
  117. {
  118. OLED_CLS();//清屏
  119. for(int i=106;i<112;i++)
  120. {
  121. OLED_ShowCN(0+(i-106)*16,0,i);//测试显示中文
  122. }
  123. printf("生成指纹成功\n");
  124. GPIO_ToggleBits(GPIOF, GPIO_Pin_9);
  125. delay_s(2);
  126. processnum=4;//跳到第五步
  127. }else {processnum=0;ShowErrMessage(ensure);}
  128. delay_ms(1200);
  129. break;
  130. case 4:
  131. PS_ValidTempleteNum(&ValidN);//读库指纹个数
  132. ID = ValidN +1;
  133. ensure=PS_StoreChar(CharBuffer2,ID);//储存模板
  134. if(ensure==0x00)
  135. {
  136. printf("请按enter\n");
  137. printf("录入成功");
  138. PS_ValidTempleteNum(&ValidN);//读库指纹个数
  139. OLED_CLS();//清屏
  140. for(int i=59;i<63;i++)
  141. {
  142. OLED_ShowCN(35+(i-59)*16,0,i);//测试显示中文
  143. }
  144. OLED_ShowStr(10,0,"1.",2);//测试6*8字符
  145. for(int i=63;i<67;i++)
  146. {
  147. OLED_ShowCN(35+(i-63)*16,3,i);//测试显示中文
  148. }
  149. OLED_ShowStr(10,3,"2.",2);//测试6*8字符
  150. for(int i=67;i<71;i++)
  151. {
  152. OLED_ShowCN(35+(i-67)*16,6,i);//测试显示中文
  153. }
  154. OLED_ShowStr(10,6,"3.",2);//测试6*8字符
  155. return;
  156. }
  157. else {processnum=0;ShowErrMessage(ensure);}
  158. break;
  159. }
  160. delay_ms(400);
  161. if(i==5)//超过5次没有按手指则退出
  162. {
  163. OLED_CLS();//清屏
  164. for(int i=59;i<63;i++)
  165. {
  166. OLED_ShowCN(35+(i-59)*16,0,i);//测试显示中文
  167. }
  168. OLED_ShowStr(10,0,"1.",2);//测试6*8字符
  169. for(int i=63;i<67;i++)
  170. {
  171. OLED_ShowCN(35+(i-63)*16,3,i);//测试显示中文
  172. }
  173. OLED_ShowStr(10,3,"2.",2);//测试6*8字符
  174. for(int i=67;i<71;i++)
  175. {
  176. OLED_ShowCN(35+(i-67)*16,6,i);//测试显示中文
  177. }
  178. OLED_ShowStr(10,6,"3.",2);//测试6*8字符
  179. printf("超过五次\n");
  180. break;
  181. }
  182. }
  183. }
  • 鉴定模块

        

  1. //刷指纹
  2. void press_FR(void)
  3. {
  4. int i =0;
  5. int j = 0;
  6. SearchResult seach;
  7. u8 ensure;
  8. u8 str[64] = {0};
  9. u8 str1[64] = {0};
  10. //GPIO_ToggleBits(GPIOF, GPIO_Pin_10);
  11. while(1)
  12. {
  13. OLED_CLS();//清屏
  14. for(int i=71;i<75;i++)
  15. {
  16. OLED_ShowCN(0+(i-71)*16,0,i);//测试显示中文
  17. }
  18. delay_s(1);
  19. ensure=PS_GetImage();
  20. if(ensure==0x00)//获取图像成功
  21. {
  22. printf("dasha");
  23. // GPIO_ToggleBits(GPIOE, GPIO_Pin_13);
  24. //BEEP=1;//打开蜂鸣器
  25. delay_s(1);
  26. ensure=PS_GenChar(CharBuffer1);
  27. if(ensure==0x00) //生成特征成功
  28. {
  29. //GPIO_ToggleBits(GPIOF, GPIO_Pin_10);
  30. printf("qqqq:%d\n",ensure);
  31. while(1)
  32. {
  33. ensure=PS_HighSpeedSearch(CharBuffer1,0,AS608Para.PS_max,&seach);
  34. if(ensure==0x00)//搜索成功
  35. {
  36. printf("ensure:%d\n",ensure);
  37. OLED_CLS();//清屏
  38. OLED_ShowStr(0,0,"enen",2);//测试6*8字符
  39. delay_s(2);
  40. break;
  41. }
  42. else
  43. {
  44. ShowErrMessage(ensure);
  45. delay_s(1);
  46. break;
  47. }
  48. }
  49. if(seach.mathscore>30)
  50. {
  51. printf("ID:%d",seach.pageID);
  52. printf("匹配得分:%d",seach.mathscore);
  53. sprintf(str,"ID:%d",seach.pageID);
  54. sprintf(str1,":%d",seach.mathscore);
  55. OLED_CLS();//清屏
  56. for(int i=144;i<148;i++)
  57. {
  58. OLED_ShowCN(0+(i-144)*16,0,i);//测试显示中文
  59. }
  60. OLED_ShowStr(0,3,str,2);//测试6*8字符
  61. OLED_ShowStr(60,0,str1,2);//测试6*8字符
  62. //Show_Str_Mid(0,140,(u8*)str,16,240);
  63. //myfree(SRAMIN,str);
  64. TIM_SetCompare1(TIM14, 500);
  65. TIM_SetCompare4(TIM2, 800);
  66. delay_s(2);
  67. TIM_SetCompare4(TIM2, 0);
  68. delay_s(3);
  69. TIM_SetCompare1(TIM14, 0);
  70. delay_s(2);
  71. figuer_login();
  72. }
  73. }
  74. else
  75. ShowErrMessage(ensure);
  76. delay_ms(1200);
  77. }
  78. //超过5次没有按手指则退出
  79. if(i++==8)
  80. {
  81. OLED_CLS();//清屏
  82. for(int i=59;i<63;i++)
  83. {
  84. OLED_ShowCN(35+(i-59)*16,0,i);//测试显示中文
  85. }
  86. OLED_ShowStr(10,0,"1.",2);//测试6*8字符
  87. for(int i=63;i<67;i++)
  88. {
  89. OLED_ShowCN(35+(i-63)*16,3,i);//测试显示中文
  90. }
  91. OLED_ShowStr(10,3,"2.",2);//测试6*8字符
  92. for(int i=67;i<71;i++)
  93. {
  94. OLED_ShowCN(35+(i-67)*16,6,i);//测试显示中文
  95. }
  96. OLED_ShowStr(10,6,"3.",2);//测试6*8字符
  97. printf("超过五次\n");
  98. break;
  99. }
  100. }
  101. }
  • 删除模块

        

  1. //指纹库清空
  2. void _PS_Empty(void)
  3. {
  4. u8 ensure;
  5. ensure=PS_Empty();//清空指纹库
  6. printf("hhhhh:%d\n",ensure);
  7. if(ensure == 0)
  8. {
  9. OLED_CLS();//清屏
  10. for(int i=131;i<137;i++)
  11. {
  12. OLED_ShowCN(0+(i-131)*16,0,i);//测试显示中文
  13. }
  14. }
  15. delay_s(2);
  16. Del_FR();
  17. }
  18. void _PS_DeletChar()
  19. {
  20. u8 figuer_buff[64] = {0};
  21. u8 ensure;
  22. int figuer_add_4;
  23. OLED_CLS();//清屏
  24. for(int i=137;i<144;i++)
  25. {
  26. OLED_ShowCN(0+(i-137)*16,0,i);//测试显示中文
  27. }
  28. OLED_ShowStr(0,3,"ID: ",2);//测试6*8字符
  29. only = 0;
  30. while(1)
  31. {
  32. figuer_add_4 = Key_Scan();
  33. if(only == 1) //按一次打印一次
  34. {
  35. only = 0;
  36. sprintf(figuer_buff,"%d",figuer_add_4);
  37. OLED_ShowStr(40,3,figuer_buff,2);//测试6*8字符
  38. ensure=PS_DeletChar(figuer_add_4,1);
  39. printf("ghjkkkkk:%d",ensure);
  40. if(ensure==0)
  41. {
  42. OLED_CLS();//清屏
  43. for(int i=131;i<137;i++)
  44. {
  45. OLED_ShowCN(0+(i-131)*16,0,i);//测试显示中文
  46. }
  47. }
  48. break;
  49. }
  50. only = 0;
  51. }
  52. delay_s(2);
  53. Del_FR();
  54. }

以上代码仅供参考

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/878245
推荐阅读
相关标签
  

闽ICP备14008679号