Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <Adafruit_Fingerprint.h>
- #include <LiquidCrystal_I2C.h>
- #include <Servo.h>
- #include <SPI.h>
- #include <MFRC522.h>
- #include <SoftwareSerial.h>
- #include <EEPROM.h>
- #define ZATVORENE A2
- #define ZAMOK 4
- #define BUZZER 5
- #define SERVO 8
- #define SS 10
- #define RST 9
- #define UID_COUNT 10
- #define POTVRDENIE 6
- #define PREPINANIE 7
- #define Z_MEKCEN 0
- #define E_DLZEN 1
- #define A_DLZEN 2
- #define A_BODKY 3
- #define C_MEKCEN 4
- #define KURZOR 5
- #define NORMAL 0
- #define SERVICE 1
- #define PRIDANIE_KARTY 2
- #define VYMAZANIE_KARTY 3
- #define PRIDANIE_ODTLACOK 4
- #define VYMAZANIE_ODTLACOK 5
- //Pridanie odtlačku
- #define PRILOZENIE 0
- #define KONVERTOVANIE 1
- #define UKLADANIE 2
- #define HOTOVO 3
- SoftwareSerial SSerial(2, 3);
- Adafruit_Fingerprint finger = Adafruit_Fingerprint(&SSerial);
- LiquidCrystal_I2C lcd(0x27, 20, 4);
- MFRC522 rfid_reader(SS, RST);
- const char* medzera = " ";
- uint32_t rfid_cas = 0;
- String uid = "";
- String uids[UID_COUNT];
- String pridat_uid = "";
- uint8_t rezim = NORMAL;
- uint8_t pridanie_odtlacok_stav;
- uint8_t fingerprint_miesta[16];
- uint8_t volne_miesto;
- const byte z_mekcen[] = {
- 0b01010,
- 0b00100,
- 0b11111,
- 0b00010,
- 0b00100,
- 0b01000,
- 0b11111,
- 0b00000
- };
- const byte e_dlzen[] = {
- 0b00010,
- 0b00100,
- 0b01110,
- 0b10001,
- 0b11111,
- 0b10000,
- 0b01110,
- 0b00000
- };
- const byte a_dlzen[] = {
- 0b00010,
- 0b00100,
- 0b01110,
- 0b00001,
- 0b01111,
- 0b10001,
- 0b01111,
- 0b00000
- };
- const byte a_bodky[] = {
- 0b01010,
- 0b00000,
- 0b01110,
- 0b00001,
- 0b01111,
- 0b10001,
- 0b01111,
- 0b00000
- };
- const byte c_mekcen[] = {
- 0b01010,
- 0b00100,
- 0b01110,
- 0b10000,
- 0b10000,
- 0b10000,
- 0b01110,
- 0b00000
- };
- const byte kurzor[] = {
- 0b00000,
- 0b00000,
- 0b11111,
- 0b10001,
- 0b10001,
- 0b11111,
- 0b00000,
- 0b00000
- };
- struct dvere {
- uint8_t poloha = 90;
- uint8_t poloha_otvorene = 0;
- uint32_t cas_serva = 0;
- uint32_t cas_zopnutia = 0;
- bool otvaranie = false;
- bool zamok = false;
- Servo servo;
- } dvere;
- struct Tlacidlo {
- bool stav;
- uint32_t cas;
- };
- Tlacidlo potvrdenie{false, 0};
- Tlacidlo prepinanie{false, 0};
- struct Menu {
- bool prve_zobrazenie;
- uint8_t kurzor;
- uint32_t kurzor_cas;
- uint32_t potvrdenie_cas;
- };
- Menu servis{true, 0, 0, 0};
- Menu pridanie_karty{true, 0, 0, 0};
- Menu vymazanie_karty{true, 0, 0, 0};
- Menu pridanie_odtlacok{true, 0, 0, 0};
- Menu vymazanie_odtlacok{true, 0, 0, 0};
- void setup() {
- Serial.begin(9600);
- finger.begin(57600);
- lcd.init();
- lcd.createChar(Z_MEKCEN, z_mekcen);
- lcd.createChar(E_DLZEN, e_dlzen);
- lcd.createChar(A_DLZEN, a_dlzen);
- lcd.createChar(A_BODKY, a_bodky);
- lcd.createChar(C_MEKCEN, c_mekcen);
- lcd.createChar(KURZOR, kurzor);
- lcd.backlight();
- clearScreen();
- dvere.servo.attach(SERVO);
- dvere.servo.write(90);
- _delay_ms(200);
- dvere.servo.detach();
- SPI.begin();
- rfid_reader.PCD_Init();
- pinMode(ZATVORENE, OUTPUT);
- pinMode(ZAMOK, OUTPUT);
- pinMode(POTVRDENIE, INPUT_PULLUP);
- pinMode(PREPINANIE, INPUT_PULLUP);
- readId();
- volne_miesto = getClosestEmptyId();
- uint8_t j, i;
- /** Čítanie UIDov do EEPROM */
- for (i = 0; i < UID_COUNT; i++) {
- char s[9];
- if (EEPROM.read(9 * i) == 255) break;
- for (j = 0; j < 8; j++) {
- s[j] = EEPROM.read(9 * i + j);
- }
- s[8] = '\0';
- uids[i] = s;
- }
- }
- void loop() {
- /** Potvrdzovacie tlačidlo pooling */
- if (millis() >= (potvrdenie.cas + 200)) {
- potvrdenie.stav = !digitalRead(POTVRDENIE);
- potvrdenie.cas = millis();
- }
- /** Prepínacie tlačidlo pooling */
- if (millis() >= (prepinanie.cas + 200)) {
- prepinanie.stav = !digitalRead(PREPINANIE);
- if (rezim == SERVICE && prepinanie.stav) {
- servis.kurzor = ++servis.kurzor % 6;
- }
- prepinanie.cas = millis();
- }
- if (!dvere.zamok) {
- digitalWrite(ZATVORENE, HIGH);
- } else {
- digitalWrite(ZATVORENE, LOW);
- }
- /** Čítanie RFID */
- if (!dvere.zamok && millis() >= rfid_cas + 1000) {
- if (rfid_reader.PICC_IsNewCardPresent()) {
- rfid_reader.PICC_ReadCardSerial();
- uid = "";
- for (uint8_t i = 0; i < rfid_reader.uid.size; i++) {
- uid.concat(String(rfid_reader.uid.uidByte[i] < 0x10 ? "0" : ""));
- uid.concat(String(rfid_reader.uid.uidByte[i], HEX));
- }
- uid.toUpperCase();
- Serial.println(uid);
- }
- rfid_cas = millis();
- }
- rfidCheck();
- /** Prepínanie medzi režimami */
- switch (rezim) {
- /** Servisný režim */
- case SERVICE: {
- if (servis.prve_zobrazenie) {
- lcd.clear();
- lcd.setCursor(0, 0);
- lcd.print("Servisn"); lcd.write(E_DLZEN); lcd.print(" menu:");
- lcd.setCursor(2, 1);
- lcd.print("+ karta - karta");
- lcd.setCursor(2, 2);
- lcd.print("+ odtl. - odtl.");
- lcd.setCursor(14, 3);
- lcd.print("exit");
- servis.prve_zobrazenie = false;
- }
- /** Kurzor */
- if (millis() >= servis.kurzor_cas + 50) {
- switch (servis.kurzor) {
- case 0: {
- lcd.setCursor(12, 3);
- lcd.print(" ");
- break;
- }
- case 1: {
- lcd.setCursor(0, 1);
- lcd.write(KURZOR);
- break;
- }
- case 2: {
- lcd.setCursor(0, 1);
- lcd.print(" ");
- lcd.setCursor(0, 2);
- lcd.write(KURZOR);
- break;
- }
- case 3: {
- lcd.setCursor(0, 2);
- lcd.print(" ");
- lcd.setCursor(10, 1);
- lcd.write(KURZOR);
- break;
- }
- case 4: {
- lcd.setCursor(10, 1);
- lcd.print(" ");
- lcd.setCursor(10, 2);
- lcd.write(KURZOR);
- break;
- }
- case 5: {
- lcd.setCursor(10, 2);
- lcd.print(" ");
- lcd.setCursor(12, 3);
- lcd.write(KURZOR);
- break;
- }
- }
- servis.kurzor_cas = millis();
- }
- /** Prepínanie medzi stavmi v servisnom menu */
- if (potvrdenie.stav) {
- if (servis.kurzor == 1) {
- servis.prve_zobrazenie = true;
- rezim = PRIDANIE_KARTY;
- servis.kurzor = 0;
- break;
- } else if (servis.kurzor == 2) {
- servis.prve_zobrazenie = true;
- rezim = PRIDANIE_ODTLACOK;
- servis.kurzor = 0;
- break;
- } else if (servis.kurzor == 3) {
- servis.prve_zobrazenie = true;
- rezim = VYMAZANIE_KARTY;
- servis.kurzor = 0;
- break;
- } else if (servis.kurzor == 4) {
- servis.prve_zobrazenie = true;
- rezim = VYMAZANIE_ODTLACOK;
- servis.kurzor = 0;
- } else if (servis.kurzor == 5) {
- servis.prve_zobrazenie = true;
- rezim = NORMAL;
- servis.kurzor = 0;
- clearScreen();
- break;
- }
- }
- break;
- }
- /** Režim pridávania kariet */
- case PRIDANIE_KARTY: {
- if (pridanie_karty.prve_zobrazenie) {
- lcd.clear();
- lcd.print("Pridanie karty:");
- pridanie_karty.prve_zobrazenie = false;
- pridanie_karty.potvrdenie_cas = millis();
- }
- if (millis() - pridanie_karty.potvrdenie_cas >= 500 && potvrdenie.stav) {
- rezim = SERVICE;
- pridanie_karty.prve_zobrazenie = true;
- }
- if (pridat_uid != "") {
- lcd.setCursor(0, 1);
- lcd.print(pridat_uid);
- if (!rfidInMemory(pridat_uid)) {
- static uint8_t first_empty;
- for (first_empty = 0; first_empty < UID_COUNT; first_empty++) {
- if (uids[first_empty].c_str()[0] == '\0') {
- break;
- }
- }
- if (first_empty == UID_COUNT) {
- pridat_uid = "";
- lcd.setCursor(0, 2);
- lcd.print("Pln"); lcd.write(A_DLZEN); lcd.print("pam"); lcd.write(A_BODKY); lcd.print("t");
- delay(5000);
- rezim = SERVICE;
- pridanie_karty.prve_zobrazenie = true;
- break;
- } else {
- uids[first_empty] = pridat_uid;
- }
- pridat_uid = "";
- updateEEPROM();
- lcd.setCursor(0, 2);
- lcd.print("Karta pridan"); lcd.write(A_DLZEN);
- delay(5000);
- rezim = SERVICE;
- pridanie_karty.prve_zobrazenie = true;
- } else {
- /** Ak sa nachádza v pamäti odíď z menu */
- pridat_uid = "";
- lcd.setCursor(0, 2);
- lcd.print("U"); lcd.write(Z_MEKCEN); lcd.print(" nahrat"); lcd.write(E_DLZEN);
- delay(5000);
- rezim = SERVICE;
- pridanie_karty.prve_zobrazenie = true;
- }
- }
- break;
- }
- /** Režim vymazávania kariet */
- case VYMAZANIE_KARTY: {
- if (vymazanie_karty.prve_zobrazenie) {
- lcd.clear();
- lcd.print("Vymazavanie kariet:");
- vymazanie_karty.prve_zobrazenie = false;
- vymazanie_karty.potvrdenie_cas = millis();
- }
- if (millis() - vymazanie_karty.potvrdenie_cas >= 500 && potvrdenie.stav) {
- rezim = SERVICE;
- vymazanie_karty.prve_zobrazenie = true;
- }
- if (pridat_uid != "") {
- if (rfidInMemory(pridat_uid)) {
- static uint8_t i;
- for (i = 0; i < UID_COUNT; i++) {
- if (pridat_uid == uids[i]) {
- do {
- uids[i] = uids[i + 1];
- i++;
- } while (i < (UID_COUNT - 1));
- uids[UID_COUNT - 1] = "";
- break;
- }
- }
- updateEEPROM();
- lcd.setCursor(0, 1);
- lcd.print(pridat_uid);
- lcd.setCursor(0, 2);
- lcd.print("Odstranen"); lcd.write(A_DLZEN);
- delay(5000);
- rezim = SERVICE;
- vymazanie_karty.prve_zobrazenie = true;
- } else {
- pridat_uid = "";
- lcd.setCursor(0, 2);
- lcd.print("Nie je nahrat"); lcd.write(A_DLZEN);
- delay(5000);
- rezim = SERVICE;
- vymazanie_karty.prve_zobrazenie = true;
- }
- }
- break;
- }
- /** Pridanie odtlačku */
- case PRIDANIE_ODTLACOK: {
- if (pridanie_odtlacok.prve_zobrazenie) {
- lcd.clear();
- lcd.print("Pridanie odtla"); lcd.write(C_MEKCEN); lcd.print("ku:");
- lcd.setCursor(0, 1);
- lcd.print("Prilo"); lcd.write(Z_MEKCEN); lcd.print("te prst");
- pridanie_odtlacok.prve_zobrazenie = false;
- pridanie_odtlacok_stav = PRILOZENIE;
- pridanie_odtlacok.potvrdenie_cas = millis();
- }
- if (pridanie_odtlacok_stav == HOTOVO) {
- rezim = SERVICE;
- pridanie_odtlacok.prve_zobrazenie = true;
- }
- if (millis() - pridanie_odtlacok.potvrdenie_cas >= 500 && potvrdenie.stav) {
- rezim = SERVICE;
- pridanie_odtlacok.prve_zobrazenie = true;
- }
- switch (pridanie_odtlacok_stav) {
- case PRILOZENIE: {
- if (finger.getImage() == FINGERPRINT_OK) {
- lcd.setCursor(0, 1);
- lcd.print("Konvertovanie...");
- _delay_ms(500);
- pridanie_odtlacok_stav = KONVERTOVANIE;
- }
- break;
- }
- case KONVERTOVANIE: {
- if (finger.image2Tz(1) == FINGERPRINT_OK) {
- lcd.setCursor(0, 1);
- lcd.print("Ukladanie... ");
- _delay_ms(500);
- pridanie_odtlacok_stav = UKLADANIE;
- } else {
- lcd.setCursor(0, 1);
- lcd.print("Neuspesne... ");
- _delay_ms(1000);
- pridanie_odtlacok_stav = HOTOVO;
- }
- break;
- }
- case UKLADANIE: {
- if (finger.storeModel(volne_miesto) == FINGERPRINT_OK) {
- lcd.setCursor(0, 1);
- lcd.print("Ulo"); lcd.write(Z_MEKCEN); lcd.print("ene... ID: "); lcd.print(volne_miesto);
- _delay_ms(1000);
- storeId(volne_miesto, true); //uloží miesto
- volne_miesto = getClosestEmptyId(); //nájde nové voľné miesto
- pridanie_odtlacok_stav = HOTOVO;
- } else {
- lcd.setCursor(0, 1);
- lcd.print("Neuspesne... ");
- _delay_ms(1000);
- pridanie_odtlacok_stav = HOTOVO;
- }
- }
- }
- break;
- }
- /** Vymazanie odtlačku */
- case VYMAZANIE_ODTLACOK: {
- if (vymazanie_odtlacok.prve_zobrazenie) {
- lcd.clear();
- lcd.print("Vymazanie odtla"); lcd.write(C_MEKCEN); lcd.print("ku:");
- vymazanie_odtlacok.kurzor = 0;
- vymazanie_odtlacok.prve_zobrazenie = false;
- vymazanie_odtlacok.potvrdenie_cas = millis();
- }
- /** fixme: meh */
- if (prepinanie.stav) {
- do {
- vymazanie_odtlacok.kurzor = ++vymazanie_odtlacok.kurzor % 127;
- } while (!readId(vymazanie_odtlacok.kurzor) || vymazanie_odtlacok.kurzor != 0);
- }
- if (millis() - vymazanie_odtlacok.potvrdenie_cas > 500 && potvrdenie.stav) {
- if (vymazanie_odtlacok.kurzor != 0) {
- lcd.print("Vymazané ID: ");
- lcd.print(vymazanie_odtlacok.kurzor);
- } else {
- rezim = SERVICE;
- vymazanie_odtlacok.prve_zobrazenie = true;
- }
- }
- if (millis() - vymazanie_odtlacok.kurzor_cas >= 500) {
- lcd.setCursor(0, 1);
- lcd.print(vymazanie_odtlacok.kurzor);
- lcd.print(" ");
- vymazanie_odtlacok.kurzor_cas = millis();
- }
- break;
- }
- /** Primárny režim */
- case NORMAL: {
- /** Otváranie dverí */
- if (dvere.zamok && (millis() >= (dvere.cas_zopnutia + 500)) || dvere.otvaranie) {
- dvere.otvaranie = true;
- if (dvere.poloha == dvere.poloha_otvorene) {
- dvere.otvaranie = false;
- } else if (millis() >= dvere.cas_serva + 5) {
- dvere.servo.write(--dvere.poloha);
- dvere.cas_serva = millis();
- }
- }
- /** Zatvorenie dverí */
- if (dvere.zamok && millis() >= (dvere.cas_zopnutia + 3000) && !dvere.otvaranie) {
- dvere.zamok = false;
- digitalWrite(ZAMOK, LOW);
- noTone(BUZZER);
- dvere.servo.write(90);
- dvere.poloha = 90;
- clearScreen();
- _delay_ms(200);
- dvere.servo.detach();
- }
- /** Odomknutie pomocou odtlačku */
- if (!dvere.zamok && fingerprintCheck() != -1) {
- otvor();
- }
- break;
- }
- }
- }
- /** Otvorí dvere */
- void otvor() {
- dvere.servo.attach(SERVO);
- dvere.zamok = true;
- digitalWrite(ZAMOK, HIGH);
- lcd.setCursor(0, 0);
- lcd.print(medzera);
- lcd.setCursor(0, 1);
- lcd.print(medzera);
- lcd.setCursor(3, 2);
- lcd.print("Dvere otvoren"); lcd.write(E_DLZEN);
- tone(BUZZER, 500);
- dvere.cas_zopnutia = millis();
- }
- /** Vyčistí a nastavý základnú obrazovku primárneho režimu (NORMAL) */
- void clearScreen() {
- lcd.clear();
- lcd.setCursor(4, 0);
- lcd.print("Prilo"); lcd.write(Z_MEKCEN); lcd.print(" prst");
- lcd.setCursor(7, 1);
- lcd.print("alebo");
- lcd.setCursor(7, 2);
- lcd.print("kartu");
- }
- /** Skontroľuje validáciu RFID */
- int8_t rfidCheck() {
- if (uid != "") {
- if (rezim == NORMAL && potvrdenie.stav && uid == uids[0]) {
- rezim = SERVICE;
- } else if (rezim == NORMAL) {
- if (rfidInMemory(uid)) {
- otvor();
- }
- } else if (rezim == PRIDANIE_KARTY || rezim == VYMAZANIE_KARTY) {
- pridat_uid = uid;
- }
- uid = "";
- }
- }
- /** Kontroluje či sa nachádza UID v pamäti */
- bool rfidInMemory(String uid) {
- for (uint8_t i = 0; i < UID_COUNT; i++) {
- if (uid == uids[i]) {
- return true;
- } else if (uids[i][0] == '\0') {
- return false;
- }
- }
- return false;
- }
- /** Zapisovanie UID do EEPROM */
- void updateEEPROM() {
- static uint8_t i, j;
- for (i = 0; i < UID_COUNT; i++) {
- const char* s = uids[i].c_str();
- if (s[0] == '\0') break;
- for (j = 0; s[j] != '\0'; j++) {
- EEPROM.update(9 * i + j, s[j]);
- }
- EEPROM.update(9 * i + j + 1, '\0');
- }
- }
- /** Skontroľuje validitu fingerprintu */
- int8_t fingerprintCheck() {
- uint8_t p = finger.getImage(); //Skenovanie
- if (p != FINGERPRINT_OK) return -1;
- p = finger.image2Tz(); //Konvertovanie
- if (p != FINGERPRINT_OK) return -1;
- p = finger.fingerFastSearch(); //Porovnavanie s pamäťou v module DY-50
- if (p != FINGERPRINT_OK) return -1;
- return finger.fingerID;
- }
- /** Nájde najbližšie voľné miesto v pamäti fingerprint senzora */
- uint8_t getClosestEmptyId() {
- for (int i = 0; i < 16; i++) {
- for (int j = 0; j < 8; j++) {
- uint8_t power = (uint8_t)(0.5 + pow(2, j));
- if ((fingerprint_miesta[i] & power) == 0 && !(i == 0 && j == 0)) {
- return 8 * i + j;
- }
- }
- }
- return -1;
- }
- /** Uloží ID do EEPROM, 0 je neobsadená */
- void storeId(uint8_t id, bool type) {
- int byteNumber = id / 8;
- int bytePosition = id % 8;
- if (type) {
- fingerprint_miesta[byteNumber] |= 1 << bytePosition;
- } else {
- fingerprint_miesta[byteNumber] &= 0 << bytePosition;
- }
- EEPROM.update(100 + byteNumber, fingerprint_miesta[byteNumber]);
- }
- /** Nájde stav konkrétneho ID */
- bool readId(uint8_t id) {
- uint8_t power = (uint8_t)(0.5 + pow(2, id % 8));
- return fingerprint_miesta[id / 8] & power != 0;
- }
- /** Prečíta EEPROM kde sa nachádzajú ID odtlačkov */
- void readId() {
- for (int i = 0; i < 16; i++) {
- fingerprint_miesta[i] = EEPROM.read(100 + i);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement