This fingerprint lock is installed on our dorm room door. A 14 g metal-geared servo operates the lock—yes, our university's door locks really are that bad…
The board is an Arduino Mega, connected to a servo, a 4×4 keypad (the key layout is in the code), a 5110LCD, a microswitch (which switches on power to the fingerprint module), and the star of the show: the TFS-M74A fingerprint module.
By the way, Shizhi Technology's fingerprint modules use compatible protocols and are interchangeable. Their maximum storage capacities differ, so you'll need to change that setting (find it yourself, young grasshopper!).
The connections and such are shown in the code. I should have written them down, but I was too lazy… The 5110 library is LCD5110_Graph; search Baidu if you don't have it.
I live in an eight-person dorm room (those of you in four-person rooms or smaller, please don't rub it in…), so I reserved 16 entries in the names array—one finger from each hand per person. You can change that.
Too lazy to add comments. Work it out for yourselves…
- /*
- 指纹锁程序 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);
- }
- }
P.S. You really need to put <!–more–> in the middle of a post like this…