这个指纹锁是运行在宿舍门上的,通过一个14g金属舵机控制门锁——没错,我们学校的门锁就这么烂……
板子是Arduino Mega,接了一个舵机,一个4×4的键盘(键位在程序中可以看到),一块5110LCD,一个微动开关(触发指纹模块电源),以及我们的主角,TFS-M74A指纹模块。
BTW,十指科技的指纹模块的协议是互通的,都可以交换使用。只是最大储存数不同,需要改下(自己去找吧,少年!)。
接在那里之类的,在程序中可以看到。本应该写下来,可惜懒了……5110库是LCD5110_Graph,没有的请百度。
本人八人寝(四人寝或更少的同志请不要晒优越哦……),所以名字那个数组预留了16个(左右指各一个),大家可以改一下。
懒得注释了,自己分析吧……
- /*
- 指纹锁程序 by SamCui.com at oct 15, 2013
- 更改请注明原作者,谢谢!
- What’s New:
- v2
- 更改指纹传感器,重写部分段落,规范注释.
- 并为完全离机做准备.
- v2.1
- 完成稿
- */
- void printStage(int s, int r = 24);
- // 指纹识别器常量定义
- #define TIMEOUT 2500
- // 基本应答信息定义
- #define ACK_SUCCESS 0x00
- #define ACK_FAIL 0x01
- #define ACK_FULL 0x04
- #define ACK_NO_USER 0x05
- #define ACK_USER_EXIST 0x07
- #define ACK_TIMEOUT 0x08
- #define ACK_GO_OUT 0x0F
- #define ACK_NOTHING 0xEF
- // 用户信息定义
- #define ACK_ALL_USER 0x00
- #define ACK_GUEST_USER 0x01
- #define ACK_NORMAL_USER 0x02
- #define ACK_MASTER_USER 0x03
- #define USER_MAX_CNT 50
- // 命令定义
- #define CMD_HEAD 0xF5
- #define CMD_TAIL 0xF5
- #define CMD_ADD_1 0x01
- #define CMD_ADD_2 0x02
- #define CMD_ADD_3 0x03
- #define CMD_MATCH 0x0C
- #define CMD_DEL 0x04
- #define CMD_DEL_ALL 0x05
- #define CMD_USER_CNT 0x09
- #define CMD_LP_MODE 0x2C
- #define CMD_FINGER_DETECTED 0x14
- // 指纹模块定义结束
- // 微动开关接口
- #define SWITCH_PIN 36
- #define POWER_PIN 37
- // LCD5110库
- #include <LCD5110_Graph.h>
- LCD5110 myGLCD(34,33,32,30,31);// 接口
- extern uint8_t SmallFont[];// 设置字体为小
- // 键盘库
- #include <Keypad.h>
- const byte ROWS = 4;//4行
- const byte COLS = 4;//4列
- // 行列对应内容
- char keys[ROWS][COLS] = {
- {‘1′,’2′,’3′,’A’},
- {‘4′,’5′,’6′,’B’},
- {‘7′,’8′,’9′,’C’},
- {‘*’,’0′,’#’,’D’}
- };
- // 相应接口
- byte rowPins[ROWS] = {22,23,24,25};
- byte colPins[COLS] = {26,27,28,29};
- // initialize an instance of class NewKeypad
- Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
- // 指纹识别模块
- // 串口发送子程序,收发串口,返回状态值,并写入q1,q2,q3至uint8_t[3].
- uint8_t TxAndRsCmd(uint8_t packet[], uint8_t cmd, uint8_t p1 = 0, uint8_t p2 = 0, uint8_t p3 = 0, uint8_t p4 = 0)
- {
- // 发送段
- uint8_t chk = 0;
- chk ^= cmd;
- chk ^= p1;
- chk ^= p2;
- chk ^= p3;
- chk ^= p4;
- Serial1.write((uint8_t)CMD_HEAD);
- Serial1.write((uint8_t)cmd);
- Serial1.write((uint8_t)p1);
- Serial1.write((uint8_t)p2);
- Serial1.write((uint8_t)p3);
- Serial1.write((uint8_t)p4);
- Serial1.write((uint8_t)chk);
- Serial1.write((uint8_t)CMD_TAIL);
- // 接收段
- int timer = 0;
- uint8_t reply[8], idx = 0;
- while (true) {
- if (timer >= TIMEOUT) return ACK_TIMEOUT;
- while (!Serial1.available()) {
- delay(1);
- timer++;
- if (timer >= TIMEOUT) return ACK_TIMEOUT;
- }
- reply[idx] = Serial1.read();
- if ((idx == 0) && (reply[0] != CMD_HEAD)){
- timer++;
- delay(1);
- continue;
- }
- idx++;
- if (idx >= 8) {
- chk = 0;
- int i;
- for(i = 1; i <= 5; i++){
- chk ^= reply[i];
- }
- if(reply[1] != cmd || reply[6] != chk || reply[7] != CMD_TAIL){
- return ACK_FAIL;
- }
- for (i = 0; i < 3; i++) {
- packet[i] = reply[2+i];
- }
- return ACK_SUCCESS;
- }
- }
- return ACK_FAIL;
- }
- // 指纹添加子程序,返回是否成功,参数k为用户序号.
- uint8_t addUser(int k, uint8_t level = ACK_NORMAL_USER)
- {
- uint8_t p1, p2, p3;
- uint8_t m = ACK_NOTHING;
- uint8_t cmd;
- uint8_t cmdAdd[] = {CMD_ADD_1, CMD_ADD_2, CMD_ADD_3};
- int i;
- for (i = 0; i < 3; i++){
- cmd = cmdAdd[i], p1 = (k >> 8), p2 = k, p3 = level;
- uint8_t packet[] = {ACK_NOTHING, ACK_NOTHING, ACK_NOTHING};
- for(int j = 0; j < 3; j++){
- if(m != ACK_SUCCESS || packet[2] != ACK_SUCCESS){
- m = TxAndRsCmd(packet, cmd, p1, p2, p3);
- if(m == ACK_SUCCESS && packet[2] == ACK_SUCCESS){
- printStage((i+1)*4);
- break;
- }else if(packet[2] == ACK_USER_EXIST || packet[2] == ACK_FULL){
- return packet[2];
- }else if(j >= 2){
- return ((m == ACK_SUCCESS)? (packet[2]): (m));
- }
- }
- }
- }
- return ACK_SUCCESS;
- }
- // 删除用户子程序,返回是否成功,参数k为用户序号.
- uint8_t delUser(int k)
- {
- uint8_t m = ACK_NOTHING, p1, p2;
- uint8_t cmd;
- uint8_t packet[] = {ACK_NOTHING, ACK_NOTHING, ACK_NOTHING};
- cmd = CMD_DEL, p1 = (k >> 8), p2 = k;
- int i;
- for(i = 0; i < 3; i++){
- if(m != ACK_SUCCESS || packet[2] != ACK_SUCCESS){
- m = TxAndRsCmd(packet, cmd, p1, p2);
- if(m == ACK_SUCCESS && packet[2] == ACK_SUCCESS){
- break;
- }else if(i >= 2){
- return ((m == ACK_SUCCESS)? (packet[2]): (m));
- }
- }
- }
- return ACK_SUCCESS;
- }
- // 清除所有用户子程序,返回是否成功.
- uint8_t clrAllUser(void)
- {
- uint8_t m = ACK_NOTHING;
- uint8_t cmd;
- uint8_t packet[] = {ACK_NOTHING, ACK_NOTHING, ACK_NOTHING};
- cmd = CMD_DEL_ALL;
- int i;
- for(i = 0; i < 3; i++){
- if(m != ACK_SUCCESS || packet[2] != ACK_SUCCESS){
- m = TxAndRsCmd(packet, cmd);
- if(m == ACK_SUCCESS && packet[2] == ACK_SUCCESS){
- break;
- }else if(i >= 2){
- return ((m == ACK_SUCCESS)? (packet[2]): (m));
- }
- }
- }
- return ACK_SUCCESS;
- }
- // 取用户总数子程序,返回是否成功,赋*t值为用户总数,参数*t为用户总数.
- uint8_t getUserCount(int *t)
- {
- uint8_t m = ACK_NOTHING;
- uint8_t cmd;
- uint8_t packet[] = {ACK_NOTHING, ACK_NOTHING, ACK_NOTHING};
- cmd = CMD_USER_CNT;
- int i;
- for(i = 0; i < 3; i++){
- if(m != ACK_SUCCESS || packet[2] != ACK_SUCCESS){
- m = TxAndRsCmd(packet, cmd);
- if(m == ACK_SUCCESS && packet[2] == ACK_SUCCESS){
- int k = packet[0];
- k <<= 8;
- k |= packet[1];
- *t = k;
- return ACK_SUCCESS;
- }else if(i >= 2){
- return ((m == ACK_SUCCESS)? (packet[2]): (m));
- }
- }
- }
- return ACK_FAIL;
- }
- // 指纹1:N比对子程序,返回是否成功,赋*t值为用户id,参数*t为用户id,参数*level为用户等级.
- uint8_t matchUser(int *t, uint8_t *level)
- {
- uint8_t m = ACK_NOTHING;
- uint8_t cmd;
- uint8_t packet[] = {ACK_NOTHING, ACK_NOTHING, ACK_NOTHING};
- cmd = CMD_MATCH;
- int i;
- for(i = 0; i < 3; i++){
- if(m != ACK_SUCCESS || packet[2] == ACK_TIMEOUT){
- m = TxAndRsCmd(packet, cmd);
- if(m == ACK_SUCCESS && packet[2] != ACK_NO_USER && packet[2] != ACK_TIMEOUT){
- int k = packet[0];
- k <<= 8;
- k |= packet[1];
- *t = k;
- *level = packet[2];
- return ACK_SUCCESS;
- }else if(packet[2] == ACK_NO_USER){
- return packet[2];
- }else if(i >= 2){
- return ((m == ACK_SUCCESS)? (packet[2]): (m));
- }
- }
- }
- return ACK_FAIL;
- }
- // 指纹1:N比对子程序,返回是否成功,赋*t值为用户id,参数*t为用户id.
- uint8_t matchUser(int *t)
- {
- uint8_t m = ACK_NOTHING;
- uint8_t cmd;
- uint8_t packet[] = {ACK_NOTHING, ACK_NOTHING, ACK_NOTHING};
- cmd = CMD_MATCH;
- int i;
- for(i = 0; i < 3; i++){
- if(m != ACK_SUCCESS || packet[2] == ACK_TIMEOUT){
- m = TxAndRsCmd(packet, cmd);
- if(m == ACK_SUCCESS && packet[2] != ACK_NO_USER && packet[2] != ACK_TIMEOUT){
- int k = packet[0];
- k <<= 8;
- k |= packet[1];
- *t = k;
- return ACK_SUCCESS;
- }else if(packet[2] == ACK_NO_USER){
- return packet[2];
- }else if(i >= 2){
- return ((m == ACK_SUCCESS)? (packet[2]): (m));
- }
- }
- }
- return ACK_FAIL;
- }
- // 取用户权限子程序,返回是否成功,赋*t值为用户总数,参数*t为用户总数.
- uint8_t userLevel(int *t)
- {
- uint8_t m = ACK_NOTHING;
- uint8_t cmd;
- uint8_t packet[] = {ACK_NOTHING, ACK_NOTHING, ACK_NOTHING};
- cmd = CMD_MATCH;
- int i;
- for(i = 0; i < 3; i++){
- if(m != ACK_SUCCESS || packet[2] == ACK_TIMEOUT){
- m = TxAndRsCmd(packet, cmd);
- if(m == ACK_SUCCESS && packet[2] != ACK_NO_USER && packet[2] != ACK_TIMEOUT){
- *t = packet[2];
- return ACK_SUCCESS;
- }else if(packet[2] == ACK_NO_USER){
- return packet[2];
- }else if(i >= 2){
- return ((m == ACK_SUCCESS)? (packet[2]): (m));
- }
- }
- }
- return ACK_FAIL;
- }
- // 指纹识别模块结束
- // 在5110上的第n行像素起表示阶段,参数n为第n行像素,参数s为现阶段,共有12阶段.
- void printStage(int s, int r)
- {
- myGLCD.print(“[“, 0, r);
- for(int i=1; i<13 && i<s; i++){
- myGLCD.print(“=”, i*6, r);
- }
- if (s=12) {
- myGLCD.print(“=”, 72, r);
- }else{
- myGLCD.print(“>”, s*6, r);
- }
- myGLCD.print(“]”, 78, r);
- myGLCD.update();
- }
- // 在5110的(0, 28)处打印”Mr. xxx!”信息,参数为人员id,之后应有myGLCD.update()函数上传.
- void printPeople(int peoid)
- {
- String peoName[16] = {
- “Mr. Cui!”,“Mr. Cui!”,“Mr. Lin!”,“Mr. Lin!”,“Mr. Jiang!”,“Mr. Jiang!”,“Mr. Yan!”,“Mr. Yan!”,“Mr. Hu!”,“Mr. Hu!”,“Mr. Zhao!”,“Mr. Zhao!”,“Mr. Shang!”,“Mr. Shang!”,“Mr. Zhong!”,“Mr. Zhong!”
- };
- myGLCD.print(peoName[peoid], 0, 28);
- }
- // 获得6位密码,返回六位字符串,参数gskask为输入提示.
- String getSixKeys(String gskask)
- {
- gskBack:
- myGLCD.clrScr();
- myGLCD.update();
- myGLCD.print(gskask, 0, 0);
- myGLCD.update();
- int gsk = 0;
- char gskpw[6];
- while(gsk <= 5){
- char gskkey = keypad.waitForKey();
- gskpw[gsk] = gskkey;
- if(String(gskkey) == “*”){goto gskBack;}
- myGLCD.print(“*”, gsk*6, 8);
- myGLCD.update();
- gsk++;
- delay(50);
- }
- int i;
- String sixKeys;
- for(i=0;i<=5;i++){
- sixKeys = sixKeys + String(gskpw[i]);
- }
- return sixKeys;
- }
- // 舵机驱动模块
- int servopin = 35;// 舵机方波输出
- // 舵机脉冲发生函数,输出控制舵机的方波,参数angle为转动度数,值的范围为0到165.
- void servopulse(int angle)
- {
- int pulsewidth=(angle*11)+500; // 将角度转化为500-2480的脉宽值
- digitalWrite(servopin,HIGH); // 将舵机接口电平至高
- delayMicroseconds(pulsewidth); // 延时脉宽值的微秒数
- digitalWrite(servopin,LOW); // 将舵机接口电平至低
- delayMicroseconds(20000-pulsewidth);
- }
- // 舵机驱动函数,调用void servopulse(int angle),参数angle为转动度数,值的范围为0到165,参数time为转动时间,以毫秒为单位,应为20的倍数.
- void servoDrive(int angle,int time)
- {
- time /= 20;
- // 值的范围为0到165
- // 发送time个脉冲
- for(int i=0;i<time;i++)
- {
- // 引用脉冲函数
- servopulse(angle);
- }
- }
- // 舵机驱动模块结束
- void unlock()
- {
- myGLCD.clrScr();
- myGLCD.update();
- myGLCD.print(“Waiting!”, 21, 0);
- myGLCD.update();
- int id = 1000;
- uint8_t m;
- m = matchUser(&id);
- if(id != 1000 && m == ACK_SUCCESS){
- myGLCD.print(“ComeIn!”, 21, 8);
- myGLCD.print(“Welcome,”, 0, 20);
- printPeople(id);
- myGLCD.print(“ID:”, 0, 40);
- myGLCD.print(String(id), 18, 40);
- myGLCD.update();
- servoDrive(20,3000);
- delay(1500);
- servoDrive(90,2000);
- }else if(m == ACK_NO_USER){
- myGLCD.print(“Sorry!”, 21, 8);
- myGLCD.print(“FngrUndefined!”, 0, 16);
- myGLCD.update();
- delay(1500);
- }
- myGLCD.clrScr();
- myGLCD.update();
- }
- void adminAddUser()
- {
- myGLCD.clrScr();
- myGLCD.update();
- myGLCD.print(” Add User “, 0, 0);
- myGLCD.print(“Input the ID: “, 0, 8);
- myGLCD.print(“(0~400, and “, 0, 16);
- myGLCD.print(“\”#\” for End)”, 0, 24);
- myGLCD.print(“*=> BackToMenu”, 0, 40);
- myGLCD.update();
- uint8_t out = 0;
- int i;
- char num[] = {0, 0, 0, 0};
- char key;
- for(i = 0; i < 4; i++){
- key = keypad.waitForKey();
- if(i >= 3 && isdigit(key)){
- myGLCD.print(” Overflow! “, 0, 32);
- myGLCD.update();
- delay(500);
- out = 1;
- break;
- }else if(isdigit(key)){
- myGLCD.print(&key, i*6, 32);
- myGLCD.update();
- num[i] = key;
- }else if(key == ‘#’){
- num[i] = ‘\0’;
- break;
- }else if(key == ‘*’){
- myGLCD.print(” Backing! “, 0, 32);
- myGLCD.update();
- delay(500);
- out = 1;
- break;
- }else{
- myGLCD.print(” Wrong Char “, 0, 32);
- myGLCD.update();
- delay(500);
- out = 1;
- break;
- }
- }
- if(out == 1)
- return;
- i = 0;
- int k = 0;
- while(isdigit(num[i])){
- k = k*10 + (num[i] – ‘0’);
- i++;
- }
- if(k>=0 && k<=399){
- ;
- }else{
- myGLCD.print(” Overflow! “, 0, 32);
- myGLCD.update();
- delay(500);
- return;
- }
- myGLCD.clrScr();
- myGLCD.update();
- myGLCD.print(” Add User “, 0, 0);
- myGLCD.print(“Put on Your”, 0, 8);
- myGLCD.print(“Finger!”, 0, 16);
- myGLCD.update();
- uint8_t m = addUser(k);
- if(m == ACK_SUCCESS){
- myGLCD.print(” SUCCESS! “, 0, 32);
- myGLCD.update();
- }else if(m == ACK_USER_EXIST){
- myGLCD.print(” USER EXIST! “, 0, 32);
- myGLCD.update();
- }else if(m == ACK_FULL){
- myGLCD.print(” FULL! “, 0, 32);
- myGLCD.update();
- }else if(m == ACK_TIMEOUT){
- myGLCD.print(” TIMEOUT! “, 0, 32);
- myGLCD.update();
- }else{
- myGLCD.print(“Unknown Error!”, 0, 32);
- myGLCD.update();
- }
- delay(500);
- }
- void adminDelUser()
- {
- myGLCD.clrScr();
- myGLCD.update();
- myGLCD.print(” Del User “, 0, 0);
- myGLCD.print(“Input the ID: “, 0, 8);
- myGLCD.print(“(0~400, and “, 0, 16);
- myGLCD.print(“\”#\” for End)”, 0, 24);
- myGLCD.print(“*=> BackToMenu”, 0, 40);
- myGLCD.update();
- uint8_t out = 0;
- int i;
- char num[] = {0, 0, 0, 0};
- char key;
- for(i = 0; i < 4; i++){
- key = keypad.waitForKey();
- if(i >= 3 && isdigit(key)){
- myGLCD.print(” Overflow! “, 0, 32);
- myGLCD.update();
- delay(500);
- out = 1;
- break;
- }else if(isdigit(key)){
- myGLCD.print(&key, i*6, 32);
- myGLCD.update();
- num[i] = key;
- }else if(key == ‘#’){
- num[i] = ‘\0’;
- break;
- }else if(key == ‘*’){
- myGLCD.print(” Backing! “, 0, 32);
- myGLCD.update();
- delay(500);
- out = 1;
- break;
- }else{
- myGLCD.print(” Wrong Char “, 0, 32);
- myGLCD.update();
- delay(500);
- out = 1;
- break;
- }
- }
- if(out == 1)
- return;
- i = 0;
- int k = 0;
- while(isdigit(num[i])){
- k = k*10 + (num[i] – ‘0’);
- i++;
- }
- if(k>=0 && k<=399){
- ;
- }else{
- myGLCD.print(” Overflow! “, 0, 32);
- myGLCD.update();
- delay(500);
- return;
- }
- uint8_t m = delUser(k);
- if(m == ACK_SUCCESS){
- myGLCD.print(” SUCCESS! “, 0, 32);
- myGLCD.update();
- }else if(m == ACK_USER_EXIST){
- myGLCD.print(” USER EXIST! “, 0, 32);
- myGLCD.update();
- }else if(m == ACK_FULL){
- myGLCD.print(” FULL! “, 0, 32);
- myGLCD.update();
- }else if(m == ACK_TIMEOUT){
- myGLCD.print(” TIMEOUT! “, 0, 32);
- myGLCD.update();
- }else{
- myGLCD.print(“Unknown Error!”, 0, 32);
- myGLCD.update();
- }
- delay(500);
- }
- void adminClrAllUser()
- {
- myGLCD.clrScr();
- myGLCD.update();
- myGLCD.print(” Clr All User “, 0, 0);
- myGLCD.print(“Input \”#ABC\” “, 0, 8);
- myGLCD.print(“for Yes: “, 0, 16);
- myGLCD.print(“*=> BackToMenu”, 0, 40);
- myGLCD.update();
- uint8_t out = 0;
- int i;
- char num[] = {0, 0, 0, 0};
- char key;
- for(i = 0; i < 4; i++){
- key = keypad.waitForKey();
- if(key == ‘*’){
- myGLCD.print(” Backing! “, 0, 32);
- myGLCD.update();
- delay(500);
- out = 1;
- break;
- }else{
- myGLCD.print(&key, i*6, 24);
- myGLCD.update();
- num[i] = key;
- }
- }
- if(out == 1)
- return;
- if(num[0] == ‘#’ && num[1] == ‘A’ && num[2] == ‘B’ && num[3] == ‘C’){
- ;
- }else{
- myGLCD.print(” Wrong Verify!”, 0, 32);
- myGLCD.update();
- delay(500);
- return;
- }
- uint8_t m = clrAllUser();
- if(m == ACK_SUCCESS){
- myGLCD.print(” SUCCESS! “, 0, 32);
- myGLCD.update();
- delay(500);
- }else if(m == ACK_USER_EXIST){
- myGLCD.print(” USER EXIST! “, 0, 32);
- myGLCD.update();
- delay(500);
- return;
- }else if(m == ACK_FULL){
- myGLCD.print(” FULL! “, 0, 32);
- myGLCD.update();
- delay(500);
- return;
- }else if(m == ACK_TIMEOUT){
- myGLCD.print(” TIMEOUT! “, 0, 32);
- myGLCD.update();
- delay(500);
- return;
- }else{
- myGLCD.print(“Unknown Error!”, 0, 32);
- myGLCD.update();
- delay(500);
- return;
- }
- // 间隔
- myGLCD.clrScr();
- myGLCD.update();
- myGLCD.print(” Clr All User “, 0, 0);
- myGLCD.print(“Put on Your”, 0, 8);
- myGLCD.print(“Finger!”, 0, 16);
- myGLCD.update();
- m = addUser(1, ACK_MASTER_USER);
- if(m == ACK_SUCCESS){
- myGLCD.print(” SUCCESS! “, 0, 32);
- myGLCD.update();
- }else if(m == ACK_USER_EXIST){
- myGLCD.print(” USER EXIST! “, 0, 32);
- myGLCD.update();
- }else if(m == ACK_FULL){
- myGLCD.print(” FULL! “, 0, 32);
- myGLCD.update();
- }else if(m == ACK_TIMEOUT){
- myGLCD.print(” TIMEOUT! “, 0, 32);
- myGLCD.update();
- }else{
- myGLCD.print(“Unknown Error!”, 0, 32);
- myGLCD.update();
- }
- delay(500);
- }
- void adminPanel()
- {
- while(1){
- myGLCD.clrScr();
- myGLCD.update();
- myGLCD.print(“AdminPanel”, 12, 0);
- myGLCD.print(“A=> Add User”, 0, 8);
- myGLCD.print(“B=> Del User”, 0, 16);
- myGLCD.print(“C=> ClrAllUser”, 0, 24);
- myGLCD.print(“*=> Exit”, 0, 32);
- myGLCD.print(“Input A,B or C”, 0, 40);
- myGLCD.update();
- uint8_t out = 0;
- int timer = 0;
- switch(keypad.waitForKey()){
- case ‘A’:
- adminAddUser();
- break;
- case ‘B’:
- adminDelUser();
- break;
- case ‘C’:
- adminClrAllUser();
- break;
- case ‘*’:
- out = 1;
- break;
- default:
- for(int i = 0; i < 3; i++){
- myGLCD.print(” “, 0, 40);
- myGLCD.update();
- delay(250);
- myGLCD.print(“Input A,B or C”, 0, 40);
- myGLCD.update();
- delay(250);
- }
- if(timer >= 2){
- out = 1;
- myGLCD.print(” “, 0, 40);
- myGLCD.update();
- myGLCD.print(“Error for 3rd!”, 0, 40);
- myGLCD.update();
- delay(500);
- myGLCD.print(” Auto Exit! “, 0, 40);
- myGLCD.update();
- delay(500);
- }
- timer++;
- break;
- }
- if(out == 1)
- break;
- }
- myGLCD.clrScr();
- myGLCD.update();
- }
- void adminVerify()
- {
- myGLCD.clrScr();
- myGLCD.update();
- myGLCD.print(“AdminPanel”, 12, 0);
- myGLCD.print(“PutOnYourFinger!”, 0, 8);
- myGLCD.update();
- int id = 1000;
- uint8_t level = ACK_ALL_USER;
- uint8_t m;
- m = matchUser(&id, &level);
- if(id != 1000 && m == ACK_SUCCESS && level == ACK_MASTER_USER){
- adminPanel();
- }else if(m == ACK_NO_USER){
- myGLCD.print(“Error!”, 21, 16);
- myGLCD.print(“FngrUndefined!”, 0, 24);
- myGLCD.update();
- delay(1500);
- }else if(level != ACK_MASTER_USER){
- myGLCD.print(“Error!”, 21, 16);
- myGLCD.print(“YouAreNotAdmin!”, 0, 24);
- myGLCD.update();
- delay(1500);
- }else if(m == ACK_TIMEOUT){
- myGLCD.print(“Error!”, 21, 16);
- myGLCD.print(“Timeout!”, 18, 16);
- myGLCD.update();
- delay(1500);
- }else{
- myGLCD.print(“Error!”, 21, 16);
- myGLCD.print(“UnknownError!”, 0, 16);
- myGLCD.update();
- delay(1500);
- }
- myGLCD.clrScr();
- myGLCD.update();
- }
- void setup()
- {
- pinMode(servopin,OUTPUT);// 设定舵机接口为输出接口
- pinMode(SWITCH_PIN,INPUT_PULLUP);// 设定微动开关接口为输入接口,并上拉
- pinMode(POWER_PIN,OUTPUT);//指纹模块电源接在这里
- Serial1.begin(19200);
- // LCD5110初始化
- myGLCD.InitLCD();
- myGLCD.setFont(SmallFont);
- }
- void loop()
- {
- myGLCD.print(” Press Sensor “, 0, 4);
- myGLCD.print(“to Unlock Door”, 0, 12);
- myGLCD.print(” Press # Key “, 0, 28);
- myGLCD.print(“to Login admin”, 0, 36);
- myGLCD.update();
- if(digitalRead(SWITCH_PIN) == 0){
- digitalWrite(POWER_PIN,HIGH);
- delay(500);
- unlock();
- digitalWrite(POWER_PIN,LOW);
- }
- if(keypad.getKey() == ‘#’){
- digitalWrite(POWER_PIN,HIGH);
- delay(500);
- adminVerify();
- digitalWrite(POWER_PIN,LOW);
- }
- }
PS.在这种文章中间一定要加<!–more–>……
不明觉厉。。。