Door fingerprint sensor lock
Fingerprint sensor that locks/unlocks door with RGB LED and OLED display feedback
Components and supplies
Adafruit NeoPixel Digital RGB LED Strip 144 LED, 1m White
Arduino UNO
Breadboard (generic)
Fingerprint Sensor
Power MOSFET N-Channel
SG90 Micro-servo motor
OLED Display, Blue on Black
Tools and machines
3D Printer (generic)
Drill / Driver, Cordless
Hot glue gun (generic)
Apps and platforms
Arduino IDE
Project description
Code
Code for master (fingerprint sensor one) page 2/2
c_cpp
1void servoToggle(){ 2 int doorOpen = EEPROM.read(1); 3Serial.println(doorOpen); 4 if(doorOpen==0){ //locked 5 myservo.write(135); 6 analogWrite(slaveArd, 100);//~1-2v 7 8 display.clearDisplay(); 9 display.setTextSize(1); 10 display.setCursor(0, 0); 11 display.println("Status: UNLOCKED"); 12 display.setTextSize(3); 13 display.println("Come in"); 14 display.display(); 15 doorOpen=1; 16 EEPROM.write(1,1); // (address,value) 17 delay(2000); 18 } 19 else{ 20 myservo.write(45); 21 analogWrite(slaveArd, 50);//~.5-1v 22 23 display.clearDisplay(); 24 display.setTextSize(1); 25 display.setCursor(0, 0); 26 display.println("Status: LOCKED"); 27 display.setTextSize(1); 28 display.println("May be davening or changing"); 29 display.display(); 30 doorOpen=1; 31 doorOpen=0; 32 EEPROM.write(1,0); 33 delay(2000); 34 } 35 36} 37
Code for salve(rgb one)
c_cpp
upload to the second arduino
1//Written by Zack for Engineering Foundations 5/1/2020 2 3int redLED 4 = 6; 5int greenLED = 5; 6int blueLED = 3; 7int redNew = (int)random(0, 255); 8int 9 blueNew = (int)random(0, 255); 10int greenNew = (int)random(0, 255); 11int red, 12 green, blue = 0; 13int dataValue; 14int count; 15int i; 16void setup() { 17 18 // put your setup code here, to run once: 19 pinMode(redLED, OUTPUT); 20 pinMode(greenLED, 21 OUTPUT); 22 pinMode(blueLED, OUTPUT); 23 pinMode(A0, INPUT); 24 pinMode(9,OUTPUT); 25 26 Serial.begin(9600); 27 analogWrite(redLED, 0); 28 analogWrite(greenLED, 0); 29 30 analogWrite(blueLED, 0); 31 32} 33 34void loop() { 35if(i==155){ 36 i=0; 37 38 count = 0; 39 red = redNew; 40 green = greenNew; 41 blue = blueNew; 42 43 redNew = (int)random(0, 255); 44 greenNew = (int)random(0, 255); 45 blueNew 46 = (int)random(0, 255); 47 } 48analogWrite(9,i); 49 i++; 50 51 Serial.println(i); 52 53 for(int i = 0;i<50;i++){ 54 dataValue += analogRead(A0); 55 }dataValue/=50; 56float 57 voltage = dataValue * (5.0 / 1023.0); 58 Serial.print(voltage); 59 Serial.println("v"); 60 61 62 if(/*at rest*/ (voltage <.5)&&(voltage>=0)){ 63 rgbFade(); 64 } 65 if(/*doorLocked*/(voltage>=.5)&&(voltage<1)){ 66 67 Serial.println("locked"); 68 setColor(255,0,0); 69 red = 255; 70 71 green=0; 72 blue=0; 73 } 74 if(/*door unlocked*/(voltage>=1)&&(voltage<2.5)){ 75 76 setColor(0,255,0);Serial.println("unlock"); 77 red = 0; 78 green=255; 79 80 blue=0; 81 } 82 if(/*incorect finger*/(voltage>=2.5)&&(voltage<3)){ 83 84 85 Serial.println("incorrect finger"); 86 for(int i=0;i<3;i++){ 87 88 setColor(255,0,0); 89 delay(250); 90 setColor(0,0,0); 91 delay(250); 92 93 red = 255; 94 green=0; 95 blue=0; 96 } 97 } 98 delay(100); 99} 100 101 102void 103 whiteFade() { 104 Serial.println("White Fade"); 105 for (int i = 0; i < 255; 106 i++) { 107 analogWrite(redLED, i); 108 analogWrite(greenLED, i); 109 analogWrite(blueLED, 110 i); 111 delay(10); 112 Serial.println(i); 113 } 114 for (int i = 255; i 115 > 0; i--) { 116 analogWrite(redLED, i); 117 analogWrite(greenLED, i); 118 119 analogWrite(blueLED, i); 120 delay(10); 121 Serial.println(i); 122 } 123} 124 125void 126 rgbFlash() { 127 Serial.println("rgb flash"); 128 analogWrite(redLED, (int)random(0, 129 255)); 130 analogWrite(greenLED, (int)random(0, 255)); 131 analogWrite(blueLED, 132 (int)random(0, 255)); 133 delay(500); 134} 135void rgbFade() { 136 Serial.print(red); 137 138 Serial.print(" "); 139 Serial.print(green); 140 Serial.print(" "); 141 Serial.println(blue); 142 143 dataValue = analogRead(A0); 144float voltage = dataValue * (5.0 / 1023.0); 145 146 if(voltage<1){ 147 Serial.println("rgb fade"); 148 //if(i == 0){ 149 //------------------------------------ 150 151 // } 152 if (red < redNew) { 153 analogWrite(redLED, red); 154 red++; 155 156 delay(10); 157 } 158 if (red > redNew) { 159 analogWrite(redLED, red); 160 161 red--; 162 delay(10); 163 } 164 //-- 165 if (green < greenNew) { 166 analogWrite(greenLED, 167 green); 168 green++; 169 delay(10); 170 } 171 if (green > greenNew) { 172 173 analogWrite(greenLED, green); 174 green--; 175 delay(10); 176 } 177 //-- 178 179 if (blue < blueNew) { 180 analogWrite(blueLED, blue); 181 blue++; 182 delay(10); 183 184 } 185 if (blue > blueNew) { 186 analogWrite(blueLED, blue); 187 blue--; 188 189 delay(10); 190 } 191 192} 193delay(10); 194} 195 196void setColor(int red, 197 int green, int blue) { 198 Serial.println("set color"); 199 analogWrite(redLED, 200 red); 201 analogWrite(greenLED, green); 202 analogWrite(blueLED, blue); 203}
Code for master (fingerprint sensor one) page 1/2
c_cpp
1//Created by Zachary Mankowitz 2#include <EEPROM.h> 3 4#include 5 <Servo.h> 6 7 #include <DYE_Fingerprint.h> 8// pin #2 is IN from sensor (GREEN 9 wire) 10// pin #3 is OUT from arduino (WHITE wire) 11#include <SoftwareSerial.h> 12SoftwareSerial 13 mySerial(2, 3); 14 15DYE_Fingerprint finger = DYE_Fingerprint(&mySerial); 16 17Servo 18 myservo; // create servo object to control a servo 19// twelve servo objects can 20 be created on most boards 21 22#include <Wire.h> 23#include <Adafruit_GFX.h> 24#include 25 <Adafruit_SSD1306.h> 26 27#define OLED_RESET 4 28Adafruit_SSD1306 display(OLED_RESET); 29int 30 slaveArd = 6; 31void setup() 32{ 33 pinMode(slaveArd, OUTPUT); 34 analogWrite(slaveArd, 35 0); 36 // by default, we'll generate the high voltage from the 3.3v line internally! 37 (neat!) 38 display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C 39 addr 0x3D (for the 128x64) 40 display.clearDisplay(); 41 display.setTextColor(WHITE); 42 43 44 myservo.attach(9); // attaches the servo on pin 9 to the 45 servo object 46 47 servoToggle(); 48 49 50 //pinMode(10,OUTPUT); //LED 51 Serial.begin(9600); 52 while 53 (!Serial); 54 delay(100); 55 Serial.println("\ 56\ 57finger detect test"); 58 59 60 // set the data rate for the sensor serial port 61 finger.begin(57600); 62 63 64 if (finger.verifyPassword()) { 65 Serial.println("Found fingerprint 66 sensor!"); 67 } else { 68 Serial.println("Did not find fingerprint sensor 69 :("); 70 while (1) { delay(1); } 71 } 72 Serial.println("Waiting for valid 73 finger..."); 74} 75 76void loop() // run over and over again 77{ 78 79 analogWrite(slaveArd, 0);//rest 80 getFingerprintIDez(); 81 delay(50); //don't 82 ned to run this at full speed. 83} 84 85uint8_t getFingerprintID() { 86 uint8_t 87 p = finger.getImage(); 88 switch (p) { 89 case FINGERPRINT_OK: 90 Serial.println("Image 91 taken"); 92 break; 93 case FINGERPRINT_NOFINGER: 94 Serial.println("No 95 finger detected"); 96 return p; 97 case FINGERPRINT_PACKETRECIEVEERR: 98 99 Serial.println("Communication error"); 100 return p; 101 case FINGERPRINT_IMAGEFAIL: 102 103 Serial.println("Imaging error"); 104 return p; 105 default: 106 107 Serial.println("Unknown error"); 108 return p; 109 } 110 111 // OK 112 success! 113 114 p = finger.image2Tz(); 115 switch (p) { 116 case FINGERPRINT_OK: 117 118 Serial.println("Image converted"); 119 break; 120 case FINGERPRINT_IMAGEMESS: 121 122 Serial.println("Image too messy"); 123 return p; 124 case FINGERPRINT_PACKETRECIEVEERR: 125 126 Serial.println("Communication error"); 127 return p; 128 case FINGERPRINT_FEATUREFAIL: 129 130 Serial.println("Could not find fingerprint features"); 131 return p; 132 133 case FINGERPRINT_INVALIDIMAGE: 134 Serial.println("Could not find fingerprint 135 features"); 136 return p; 137 default: 138 Serial.println("Unknown 139 error"); 140 return p; 141 } 142 143 // OK converted! 144 p = finger.fingerFastSearch(); 145 146 if (p == FINGERPRINT_OK) { 147 Serial.println("Found a print match!"); 148 149 } else if (p == FINGERPRINT_PACKETRECIEVEERR) { 150 Serial.println("Communication 151 error"); 152 return p; 153 } else if (p == FINGERPRINT_NOTFOUND) { 154 Serial.println("Did 155 not find a match"); 156 return p; 157 } else { 158 Serial.println("Unknown 159 error"); 160 return p; 161 } 162 163 // found a match! NOT SURE WHAT 164 THIS DOES 165 Serial.print("Found ID #"); Serial.print(finger.fingerID); 166 167 Serial.print(" with confidence of "); Serial.println(finger.confidence); 168 169 170 171 return finger.fingerID; 172} 173 174// returns -1 if failed, otherwise returns 175 ID # 176int getFingerprintIDez() { 177 uint8_t p = finger.getImage(); 178 if (p 179 != FINGERPRINT_OK) return -1; 180 181 p = finger.image2Tz(); 182 if (p != FINGERPRINT_OK) 183 return -1; 184 185 186 p = finger.fingerFastSearch(); 187 if (p != FINGERPRINT_OK) 188 { 189 Serial.println("bad"); 190 analogWrite(slaveArd, 150);//~3v 191 display.clearDisplay(); 192 193 display.setTextSize(1); 194 display.setCursor(0, 0); 195 display.println("FINGER"); 196 197 display.setTextSize(2); 198 display.println("INCOREECT"); 199 display.display(); 200 201 //delay(100); 202 return -1; 203 } 204 205 // found a match! 206 Serial.print("Found 207 ID #"); Serial.print(finger.fingerID); 208 Serial.print(" with confidence of 209 "); Serial.println(finger.confidence); 210 211 servoToggle(); 212 213 214 215 return finger.fingerID; 216}
Code for salve(rgb one)
c_cpp
upload to the second arduino
1//Written by Zack for Engineering Foundations 5/1/2020 2 3int redLED = 6; 4int greenLED = 5; 5int blueLED = 3; 6int redNew = (int)random(0, 255); 7int blueNew = (int)random(0, 255); 8int greenNew = (int)random(0, 255); 9int red, green, blue = 0; 10int dataValue; 11int count; 12int i; 13void setup() { 14 // put your setup code here, to run once: 15 pinMode(redLED, OUTPUT); 16 pinMode(greenLED, OUTPUT); 17 pinMode(blueLED, OUTPUT); 18 pinMode(A0, INPUT); 19 pinMode(9,OUTPUT); 20 Serial.begin(9600); 21 analogWrite(redLED, 0); 22 analogWrite(greenLED, 0); 23 analogWrite(blueLED, 0); 24 25} 26 27void loop() { 28if(i==155){ 29 i=0; 30 count = 0; 31 red = redNew; 32 green = greenNew; 33 blue = blueNew; 34 redNew = (int)random(0, 255); 35 greenNew = (int)random(0, 255); 36 blueNew = (int)random(0, 255); 37 } 38analogWrite(9,i); 39 i++; 40 41 Serial.println(i); 42 for(int i = 0;i<50;i++){ 43 dataValue += analogRead(A0); 44 }dataValue/=50; 45float voltage = dataValue * (5.0 / 1023.0); 46 Serial.print(voltage); 47 Serial.println("v"); 48 49 if(/*at rest*/ (voltage <.5)&&(voltage>=0)){ 50 rgbFade(); 51 } 52 if(/*doorLocked*/(voltage>=.5)&&(voltage<1)){ 53 Serial.println("locked"); 54 setColor(255,0,0); 55 red = 255; 56 green=0; 57 blue=0; 58 } 59 if(/*door unlocked*/(voltage>=1)&&(voltage<2.5)){ 60 setColor(0,255,0);Serial.println("unlock"); 61 red = 0; 62 green=255; 63 blue=0; 64 } 65 if(/*incorect finger*/(voltage>=2.5)&&(voltage<3)){ 66 67 Serial.println("incorrect finger"); 68 for(int i=0;i<3;i++){ 69 setColor(255,0,0); 70 delay(250); 71 setColor(0,0,0); 72 delay(250); 73 red = 255; 74 green=0; 75 blue=0; 76 } 77 } 78 delay(100); 79} 80 81 82void whiteFade() { 83 Serial.println("White Fade"); 84 for (int i = 0; i < 255; i++) { 85 analogWrite(redLED, i); 86 analogWrite(greenLED, i); 87 analogWrite(blueLED, i); 88 delay(10); 89 Serial.println(i); 90 } 91 for (int i = 255; i > 0; i--) { 92 analogWrite(redLED, i); 93 analogWrite(greenLED, i); 94 analogWrite(blueLED, i); 95 delay(10); 96 Serial.println(i); 97 } 98} 99 100void rgbFlash() { 101 Serial.println("rgb flash"); 102 analogWrite(redLED, (int)random(0, 255)); 103 analogWrite(greenLED, (int)random(0, 255)); 104 analogWrite(blueLED, (int)random(0, 255)); 105 delay(500); 106} 107void rgbFade() { 108 Serial.print(red); 109 Serial.print(" "); 110 Serial.print(green); 111 Serial.print(" "); 112 Serial.println(blue); 113 dataValue = analogRead(A0); 114float voltage = dataValue * (5.0 / 1023.0); 115 if(voltage<1){ 116 Serial.println("rgb fade"); 117 //if(i == 0){ 118 //------------------------------------ 119 // } 120 if (red < redNew) { 121 analogWrite(redLED, red); 122 red++; 123 delay(10); 124 } 125 if (red > redNew) { 126 analogWrite(redLED, red); 127 red--; 128 delay(10); 129 } 130 //-- 131 if (green < greenNew) { 132 analogWrite(greenLED, green); 133 green++; 134 delay(10); 135 } 136 if (green > greenNew) { 137 analogWrite(greenLED, green); 138 green--; 139 delay(10); 140 } 141 //-- 142 if (blue < blueNew) { 143 analogWrite(blueLED, blue); 144 blue++; 145 delay(10); 146 } 147 if (blue > blueNew) { 148 analogWrite(blueLED, blue); 149 blue--; 150 delay(10); 151 } 152 153} 154delay(10); 155} 156 157void setColor(int red, int green, int blue) { 158 Serial.println("set color"); 159 analogWrite(redLED, red); 160 analogWrite(greenLED, green); 161 analogWrite(blueLED, blue); 162}
Code for master (fingerprint sensor one) page 2/2
c_cpp
1void servoToggle(){ 2 int doorOpen = EEPROM.read(1); 3Serial.println(doorOpen); 4 if(doorOpen==0){ //locked 5 myservo.write(135); 6 analogWrite(slaveArd, 100);//~1-2v 7 8 display.clearDisplay(); 9 display.setTextSize(1); 10 display.setCursor(0, 0); 11 display.println("Status: UNLOCKED"); 12 display.setTextSize(3); 13 display.println("Come in"); 14 display.display(); 15 doorOpen=1; 16 EEPROM.write(1,1); // (address,value) 17 delay(2000); 18 } 19 else{ 20 myservo.write(45); 21 analogWrite(slaveArd, 50);//~.5-1v 22 23 display.clearDisplay(); 24 display.setTextSize(1); 25 display.setCursor(0, 0); 26 display.println("Status: LOCKED"); 27 display.setTextSize(1); 28 display.println("May be davening or changing"); 29 display.display(); 30 doorOpen=1; 31 doorOpen=0; 32 EEPROM.write(1,0); 33 delay(2000); 34 } 35 36} 37
Code for master (fingerprint sensor one) page 1/2
c_cpp
1//Created by Zachary Mankowitz 2#include <EEPROM.h> 3 4#include <Servo.h> 5 6 #include <DYE_Fingerprint.h> 7// pin #2 is IN from sensor (GREEN wire) 8// pin #3 is OUT from arduino (WHITE wire) 9#include <SoftwareSerial.h> 10SoftwareSerial mySerial(2, 3); 11 12DYE_Fingerprint finger = DYE_Fingerprint(&mySerial); 13 14Servo myservo; // create servo object to control a servo 15// twelve servo objects can be created on most boards 16 17#include <Wire.h> 18#include <Adafruit_GFX.h> 19#include <Adafruit_SSD1306.h> 20 21#define OLED_RESET 4 22Adafruit_SSD1306 display(OLED_RESET); 23int slaveArd = 6; 24void setup() 25{ 26 pinMode(slaveArd, OUTPUT); 27 analogWrite(slaveArd, 0); 28 // by default, we'll generate the high voltage from the 3.3v line internally! (neat!) 29 display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3D (for the 128x64) 30 display.clearDisplay(); 31 display.setTextColor(WHITE); 32 33 myservo.attach(9); // attaches the servo on pin 9 to the servo object 34 35 servoToggle(); 36 37 //pinMode(10,OUTPUT); //LED 38 Serial.begin(9600); 39 while (!Serial); 40 delay(100); 41 Serial.println("\ 42\ 43finger detect test"); 44 45 // set the data rate for the sensor serial port 46 finger.begin(57600); 47 48 if (finger.verifyPassword()) { 49 Serial.println("Found fingerprint sensor!"); 50 } else { 51 Serial.println("Did not find fingerprint sensor :("); 52 while (1) { delay(1); } 53 } 54 Serial.println("Waiting for valid finger..."); 55} 56 57void loop() // run over and over again 58{ 59 analogWrite(slaveArd, 0);//rest 60 getFingerprintIDez(); 61 delay(50); //don't ned to run this at full speed. 62} 63 64uint8_t getFingerprintID() { 65 uint8_t p = finger.getImage(); 66 switch (p) { 67 case FINGERPRINT_OK: 68 Serial.println("Image taken"); 69 break; 70 case FINGERPRINT_NOFINGER: 71 Serial.println("No finger detected"); 72 return p; 73 case FINGERPRINT_PACKETRECIEVEERR: 74 Serial.println("Communication error"); 75 return p; 76 case FINGERPRINT_IMAGEFAIL: 77 Serial.println("Imaging error"); 78 return p; 79 default: 80 Serial.println("Unknown error"); 81 return p; 82 } 83 84 // OK success! 85 86 p = finger.image2Tz(); 87 switch (p) { 88 case FINGERPRINT_OK: 89 Serial.println("Image converted"); 90 break; 91 case FINGERPRINT_IMAGEMESS: 92 Serial.println("Image too messy"); 93 return p; 94 case FINGERPRINT_PACKETRECIEVEERR: 95 Serial.println("Communication error"); 96 return p; 97 case FINGERPRINT_FEATUREFAIL: 98 Serial.println("Could not find fingerprint features"); 99 return p; 100 case FINGERPRINT_INVALIDIMAGE: 101 Serial.println("Could not find fingerprint features"); 102 return p; 103 default: 104 Serial.println("Unknown error"); 105 return p; 106 } 107 108 // OK converted! 109 p = finger.fingerFastSearch(); 110 if (p == FINGERPRINT_OK) { 111 Serial.println("Found a print match!"); 112 } else if (p == FINGERPRINT_PACKETRECIEVEERR) { 113 Serial.println("Communication error"); 114 return p; 115 } else if (p == FINGERPRINT_NOTFOUND) { 116 Serial.println("Did not find a match"); 117 return p; 118 } else { 119 Serial.println("Unknown error"); 120 return p; 121 } 122 123 // found a match! NOT SURE WHAT THIS DOES 124 Serial.print("Found ID #"); Serial.print(finger.fingerID); 125 Serial.print(" with confidence of "); Serial.println(finger.confidence); 126 127 128 return finger.fingerID; 129} 130 131// returns -1 if failed, otherwise returns ID # 132int getFingerprintIDez() { 133 uint8_t p = finger.getImage(); 134 if (p != FINGERPRINT_OK) return -1; 135 136 p = finger.image2Tz(); 137 if (p != FINGERPRINT_OK) return -1; 138 139 140 p = finger.fingerFastSearch(); 141 if (p != FINGERPRINT_OK) { 142 Serial.println("bad"); 143 analogWrite(slaveArd, 150);//~3v 144 display.clearDisplay(); 145 display.setTextSize(1); 146 display.setCursor(0, 0); 147 display.println("FINGER"); 148 display.setTextSize(2); 149 display.println("INCOREECT"); 150 display.display(); 151 //delay(100); 152 return -1; 153 } 154 155 // found a match! 156 Serial.print("Found ID #"); Serial.print(finger.fingerID); 157 Serial.print(" with confidence of "); Serial.println(finger.confidence); 158 159 servoToggle(); 160 161 162 return finger.fingerID; 163}
Downloadable files
Fritzing (full)
Fritzing (full)

Fritzing (full)
Fritzing (full)

Schematic (fingerprint sensor excluded)
Schematic (fingerprint sensor excluded)

Comments
Only logged in users can leave comments