本帖最后由 新手之帆 于 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秒后返回初始界面。
四:图片和视频
视频地址: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.………………
好了,大赛终于提交好了!上学去了!!!!
最后,献上丑照。
绝对是应付的!!!!!(斜眼笑)
|