学生智能打卡系统(接入blinker)-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 16797|回复: 27

[项目] 学生智能打卡系统(接入blinker)

[复制链接]
发表于 2019-3-20 17:26 | 显示全部楼层 |阅读模式
本帖最后由 新手之帆 于 2019-4-28 21:10 编辑

项目名称】学生智能打卡系统(接入blinker)打卡物联网部分,5/1期间再钻研,最近学习太紧了,望各位评委老师理解。
一.感谢各位大佬
首先感谢社区的管理员大佬,然后感谢奈何大佬,以及帮助过我的各位大佬。

二.项目思路
我正是小学6年级,学习任务很紧,班里每天都不允许迟到,老师每天都要记迟到的号数,实在太麻烦了!如果有时老师没来,该怎么办?于是,我就想创造一个学生智能打卡系统。
三.项目介绍
本项目是接入了blinker,接入了blinker,接入了blinker(重要的事情说三遍),通过blinker来选择删除一切注册信息,设置迟到时间,获取未到号数。
本项目主要有4个界面(1.初始时间显示 2.注册学号 密码 指纹 3.用指纹或密码打卡 4.查看未到的人的号数   还有一些小界面)


说明:密码是4位,号数是2位!

1.初始时间及项目名称显示,通过blinker获取年 月 日 时 分 星期几进行显示,还有上面是项目名称,用取模

2.注册学号,按下按键3进入注册学号界面,每次按下按键3,所在的位数数值+1,按下按键2,下一位。直至第3位就进入注册密码界面,如果该号数已经注册,就会显示号码重复,重新输入直至不重复为止。注册密码界面也是同理每次按下按键3,所在的位数数值+1,按下按键2,下一位。直至第5位进入指纹注册界面,如果密码重复,也会重复输入。指纹注册界面显示的都是英文,我会翻译后,再发在帖子里。指纹完成后(也就是屏幕出现“
stored),就会显示注册是否成功,如果成功,显示号数和密码,语音播放“注册成功”。后,有返回初始界面。


3.打卡,首先,会显示"press button 1 pw(就是password)press button 2 finger(指纹)"就是按下按键1,密码打卡,按键2,指纹打卡。如果按键1被按下,就进入密码打卡,密码打卡按下按键1该数位的数+=1,按键2下一位。5位后,如果成功,显示“打卡成功”以及该学号,失败,显示“打卡失败”,3秒后退出。  如果按键2被按下,进入指纹打卡界面,等待到"ok”就可以了,就会显示是否符合存储指纹,不符合显示“打卡失败”,语音播放"打卡失败"后退出,符合显示“打卡成功”,语音播放“打卡成功”。


4.查看未到的人的号数
单独按下按键2自动查看,3秒后返回初始界面。
四:图片和视频
IMG_20190325_125405_看图王.jpg IMG_20190325_130021.jpg

视频地址:https://www.bilibili.com/video/av50015041/<iframe src="//player.bilibili.com/player.html?aid=50015041&cid=87560776&page=1" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"> </iframe>
五.部分代码(关键)
代码也很容易写,我就放指纹代码和所用到的库吧

[mw_shl_code=arduino,true]int get_fingerprint() {
  display.clearDisplay();
  display.setCursor(20,20);
  display.print("finger now as");
  display.display();
  uint8_t p = finger.getImage();
  if (p != FINGERPRINT_OK)  return -1;

  p = finger.image2Tz();
  if (p != FINGERPRINT_OK)  return -1;

  p = finger.fingerFastSearch();
  if (p != FINGERPRINT_OK)  return -1;

  // found a match!
  display.setCursor(20,0);
  display.print("OK ID");
  display.print(finger.fingerID);
  display.display();
  get_finger_flag=1;
  c_ok[finger.fingerID]=1;
// play(0x01);
  Blinker.delay(1500);
  return finger.fingerID;
}



//上面是打卡时的指纹代码,下面是注册时的

uint8_t get_finger(uint8_t id) {
  display.clearDisplay();
  int p = -1;
  display.setCursor(0,0);
  display.print("As #"); display.println(id);
  display.display();
  Blinker.delay(2000);
  display.clearDisplay();
  while (p != FINGERPRINT_OK) {
    p = finger.getImage();
    display.setCursor(0,0);
    switch (p) {
    case FINGERPRINT_OK:
      display.print("Image taken");
      break;
    case FINGERPRINT_NOFINGER:
      display.print(".");
      break;
    case FINGERPRINT_PACKETRECIEVEERR:
      display.print("error");
      break;
    case FINGERPRINT_IMAGEFAIL:
      display.print("Imaging error");
      break;
    default:
      display.print("Unknown error");
      break;
    }
    display.display();
    Blinker.delay(1500);
    display.clearDisplay();
  }
  display.clearDisplay();
  // OK success!

  p = finger.image2Tz(1);
  display.setCursor(0,0);
  switch (p) {

    case FINGERPRINT_OK:
      display.print("Image converted");
      display.display();
      Blinker.delay(1500);
      break;
    case FINGERPRINT_IMAGEMESS:
      display.print("Image too messy");
      display.display();
      Blinker.delay(1500);
      return p;
    case FINGERPRINT_PACKETRECIEVEERR:
      display.print("error");      
      display.display();
      Blinker.delay(1500);
      return p;
    case FINGERPRINT_FEATUREFAIL:
      display.print("can't find features");     
      display.display();
      Blinker.delay(1500);      
      return p;
    case FINGERPRINT_INVALIDIMAGE:
      display.print("can't find features");
      display.display();
      Blinker.delay(1500);
      return p;
    default:
      display.print("Unknown error");
      display.display();
      Blinker.delay(1500);
      return p;
  }
  display.clearDisplay();
  display.setCursor(0,0);
  display.print("Remove finger");
  display.display();
  Blinker.delay(2000);
  display.clearDisplay();
  p = 0;
  while (p != FINGERPRINT_NOFINGER) {
    p = finger.getImage();
  }
  display.setCursor(0,0);
  display.print("ID "); display.print(id);
  p = -1;
  display.print("same again");
  Blinker.delay(2000);
  display.clearDisplay();
  while (p != FINGERPRINT_OK) {
    display.setCursor(0,0);
    p = finger.getImage();
    switch (p) {
    case FINGERPRINT_OK:
      display.print("Image taken");
      break;
    case FINGERPRINT_NOFINGER:
      display.print(".");
      break;
    case FINGERPRINT_PACKETRECIEVEERR:
      display.print("error");
      break;
    case FINGERPRINT_IMAGEFAIL:
      display.print("Imaging error");
      break;
    default:
      display.print("Unknown error");
      break;
    }
    display.display();
    Blinker.delay(1500);
    display.clearDisplay();
  }

  // OK success!
  display.clearDisplay();
  p = finger.image2Tz(2);
  display.setCursor(0,0);
  switch (p) {
    case FINGERPRINT_OK:
      display.print("Image converted");
      display.display();
      Blinker.delay(1500);
      break;
    case FINGERPRINT_IMAGEMESS:
      display.print("Image too messy");
      display.display();
      Blinker.delay(1500);
      return p;
    case FINGERPRINT_PACKETRECIEVEERR:
      display.print("error");
      display.display();
      Blinker.delay(1500);
      return p;
    case FINGERPRINT_FEATUREFAIL:
      display.print("can't find finger");
      display.display();
      Blinker.delay(1500);
      return p;
    case FINGERPRINT_INVALIDIMAGE:
      display.print("can't find finger");
      display.display();
      Blinker.delay(1500);
      return p;
    default:
      display.print("Unknown error");
      display.display();
      Blinker.delay(1500);
      return p;
  }
   display.clearDisplay();
  // OK converted!
  display.setCursor(0,0);
  display.print("Creating model for #");  display.print(id);
  display.display();
  Blinker.delay(2000);
  display.clearDisplay();
  p = finger.createModel();
  display.setCursor(0,0);
  if (p == FINGERPRINT_OK) {
    display.print("Prints matched!");
    display.display();
    Blinker.delay(1500);
  } else if (p == FINGERPRINT_PACKETRECIEVEERR) {
    display.print("error");
    display.display();
    Blinker.delay(1500);
    return p;
  } else if (p == FINGERPRINT_ENROLLMISMATCH) {
    display.print("Did not match");
    display.display();
    Blinker.delay(1500);
    return p;
  } else {
    display.print("Unknown error");
    display.display();
    Blinker.delay(1500);
    return p;
  }   
  display.clearDisplay();
  display.setCursor(0,0);
  display.print("ID "); display.print(id);
  display.display();
  Blinker.delay(1500);
  p = finger.storeModel(id);
  display.clearDisplay();
  display.setCursor(0,0);
  if (p == FINGERPRINT_OK) {
    display.print("Stored!");
    display.display();
    Blinker.delay(1500);
  } else if (p == FINGERPRINT_PACKETRECIEVEERR) {
    display.print("Communication error");
    display.display();
    Blinker.delay(1500);
    return p;
  } else if (p == FINGERPRINT_BADLOCATION) {
    display.print("Could not store in that location");
    display.display();
    Blinker.delay(1500);
    return p;
  } else if (p == FINGERPRINT_FLASHERR) {
    display.print("Error writing to flash");
    display.display();
    Blinker.delay(1500);
    return p;
  } else {
    display.print("Unknown error");
    display.display();
    Blinker.delay(1500);
    return p;
  }
  flag=1;  
  display.clearDisplay();
}[/mw_shl_code]

指纹库太大了!
[mw_shl_code=arduino,true]#include <Adafruit_Fingerprint.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>/*OLED库*/
#include <Adafruit_SSD1306.h>/*OLED*/
#include <Blinker.h>/*blinker库*/[/mw_shl_code]
几个库网上都有,需要就加我Q3320987642


终于更新完了,以后会继续改进的
1.加入语音播报(模块已经有了,懒)
2.换成薄膜矩阵键盘(我绝对不会告诉你我会用2个板子通信识别指令的)
3.………………


好了,大赛终于提交好了!上学去了!!!!










最后,献上丑照。



IMG_20190325_134022.jpg IMG_20190325_133844.jpg IMG_20190325_133911.jpg

绝对是应付的!!!!!(斜眼笑)















 楼主| 发表于 2019-3-25 17:20 | 显示全部楼层
做好冷板凳
 楼主| 发表于 2019-3-25 20:29 | 显示全部楼层
今晚做好了语音播报,明天视频更新!!
发表于 2019-3-26 01:03 | 显示全部楼层
可以啊,我六年级还不会看帖子。。也就会点亮个灯泡吧。。。
 楼主| 发表于 2019-3-26 12:38 | 显示全部楼层
Dhgs1026805647 发表于 2019-3-26 01:03
可以啊,我六年级还不会看帖子。。也就会点亮个灯泡吧。。。

大佬,过奖
 楼主| 发表于 2019-3-26 19:53 | 显示全部楼层
等电容按键到,我再发个第二代(其实只更新了语音播报,换了按键(为了更方便)),但是,这个项目会不断更新的,所以请大佬多多支持
发表于 2019-4-7 22:54 | 显示全部楼层
演示视频前加加下比赛海报哈~
 楼主| 发表于 2019-4-8 13:20 | 显示全部楼层
syl312 发表于 2019-4-7 22:54
演示视频前加加下比赛海报哈~

好的,我有空发个新版本再加
 楼主| 发表于 2019-4-8 21:39 | 显示全部楼层
blinker端还没调好,,,,,,我努力吧
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 02:31 , Processed in 0.143960 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表