Arduino Nano - Keypad Deurslot

Deze tutorial laat u zien hoe u een deurbeveiligingssysteem kunt bouwen dat beveiligd is met een wachtwoord, met behulp van een Arduino Nano, keypad, solenoïde slot of elektromagnetisch slot, en een LCD-display. Het deurslot systeem werkt als volgt:

Om het eenvoudig te maken, is deze tutorial opgedeeld in meerdere stappen, van makkelijk tot moeilijk:

Over Keypad, Solenoïde Slot, Elektromagnetisch Slot en LCD-display

Zowel het solenoïde slot als het elektromagnetisch slot worden gebruikt om de deur te vergrendelen/ontgrendelen. Ze verschillen vooral qua mechanisch ontwerp. De bedrading naar de Arduino Nano is vergelijkbaar en de Arduino Nano-code om ze te besturen is hetzelfde.

Bent u niet bekend met keypad, solenoïde slot, elektromagnetisch slot en LCD-display (pinout, hoe het werkt, programmeren, enz.), dan kunnen de volgende tutorials u helpen:

Bedradingsschema

  • Bedradingsschema met Arduino Nano, keypad en solenoïde slot
Arduino Nano, keypad, solenoid lock wiring diagram

This image is created using Fritzing. Click to enlarge image

  • Bedradingsschema met Arduino Nano, keypad en elektromagnetisch slot
Arduino Nano, keypad, electromagnetic lock wiring diagram

This image is created using Fritzing. Click to enlarge image

Arduino Nano Code - Keypad Deurslot

/* * Deze Arduino Nano code is ontwikkeld door newbiely.nl * Deze Arduino Nano code wordt zonder enige beperking aan het publiek beschikbaar gesteld. * Voor volledige instructies en schema's, bezoek: * https://newbiely.nl/tutorials/arduino-nano/arduino-nano-keypad-door-lock */ #include <Keypad.h> const int ROW_NUM = 4; //four rows const int COLUMN_NUM = 3; //four columns const int RELAY_PIN = 2; // The Arduino Nano pin connected to the IN pin of relay module const byte pin_rows[ROW_NUM] = {10, 9, 8, 7}; // The Arduino Nano pin connected to the row pins of the keypad const byte pin_column[COLUMN_NUM] = {6, 5, 4}; // The Arduino Nano pin connected to the column pins of the keypad char key_layout[ROW_NUM][COLUMN_NUM] = { {'1', '2', '3'}, {'4', '5', '6'}, {'7', '8', '9'}, {'*', '0', '#'} }; Keypad keypad = Keypad( makeKeymap(key_layout), pin_rows, pin_column, ROW_NUM, COLUMN_NUM); const String password = "1234"; // change your password here String input_password; void setup() { Serial.begin(9600); input_password.reserve(32); // maximum input characters is 32, change if needed pinMode(RELAY_PIN, OUTPUT); // initialize pin as an output. digitalWrite(RELAY_PIN, HIGH); // lock the door } void loop() { char key = keypad.getKey(); if (key) { Serial.println(key); if (key == '*') { input_password = ""; // reset the input password } else if (key == '#') { if (input_password == password) { Serial.println("The correct password! Unlocking the door in 20 seconds"); digitalWrite(RELAY_PIN, LOW); // unlock the door for 20 seconds delay(20000); digitalWrite(RELAY_PIN, HIGH); // lock the door } else { Serial.println("The incorrect password! try again"); } input_password = ""; // reset the input password } else { input_password += key; // append new character to input password string } } }

※ Notiz:

Het adres van het LCD kan verschillen afhankelijk van de fabrikant. In onze code is 0x27 gebruikt, zoals aangegeven door DIYables.

Snelle Stappen

  • Verbind een USB-kabel met de Arduino Nano en de PC.
  • Open de Arduino IDE en selecteer het juiste board en de juiste poort.
  • Klik op het Libraries icoon in de linker balk van de Arduino IDE.
  • Zoek naar “keypad”, en vind de keypad bibliotheek van Mark Stanley en Alexander Brevig.
  • Druk op de Install knop om de keypad bibliotheek te installeren.
Arduino Nano keypad library
  • Kopieer bovenstaande code en open deze in de Arduino IDE.
  • Klik op de Upload knop om de code naar de Arduino Nano te uploaden.
  • Open de Serial Monitor.
  • Druk op de toetsen 12345 gevolgd door het symbool #.
  • Druk daarna op de toetsen 1234 gevolgd door het symbool #.
  • Controleer de status van de vergrendelingspen gedurende 20 seconden.
  • Bekijk het resultaat in de Serial Monitor.
COM6
Send
The incorrect password! try again The correct password! Unlocking the door in 20 seconds
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Code Uitleg

De geldige wachtwoorden zijn vooraf gedefinieerd in de Arduino Nano code. Een string wordt gebruikt om het door gebruikers ingevoerde wachtwoord op te slaan, dit heet input string. Op het keypad worden twee toetsen (* en #) gebruikt voor speciale functies: om het wachtwoord te wissen en om het wachtwoord te beëindigen. Het systeem werkt als volgt:

  • Behalve de twee speciale toetsen, wordt elke andere ingedrukte toets toegevoegd aan de input string.
  • Als * wordt ingedrukt, wordt de input string gewist. Dit kan gebruikt worden om de invoer opnieuw te starten.
  • Als # wordt ingedrukt:
    • Vergelijkt de Arduino Nano de input string met de vooraf gedefinieerde wachtwoorden. Als het overeenkomt met één van deze wachtwoorden, bestuurt Arduino Nano het relais om de deur te ontgrendelen.
    • Ongeacht of het wachtwoord juist is of niet, wist de Arduino Nano de input string voor de volgende invoer.

Arduino Nano Code - Meerdere Wachtwoorden

/* * Deze Arduino Nano code is ontwikkeld door newbiely.nl * Deze Arduino Nano code wordt zonder enige beperking aan het publiek beschikbaar gesteld. * Voor volledige instructies en schema's, bezoek: * https://newbiely.nl/tutorials/arduino-nano/arduino-nano-keypad-door-lock */ #include <Keypad.h> const int ROW_NUM = 4; //four rows const int COLUMN_NUM = 3; //four columns const int RELAY_PIN = 2; // The Arduino Nano pin connected to the IN pin of relay module const byte pin_rows[ROW_NUM] = {10, 9, 8, 7}; // The Arduino Nano pin connected to the row pins of the keypad const byte pin_column[COLUMN_NUM] = {6, 5, 4}; // The Arduino Nano pin connected to the column pins of the keypad char key_layout[ROW_NUM][COLUMN_NUM] = { {'1', '2', '3'}, {'4', '5', '6'}, {'7', '8', '9'}, {'*', '0', '#'} }; Keypad keypad = Keypad( makeKeymap(key_layout), pin_rows, pin_column, ROW_NUM, COLUMN_NUM); const String password_1 = "1234"; // change your password here const String password_2 = "5642"; // change your password here const String password_3 = "12345"; // change your password here String input_password; void setup() { Serial.begin(9600); input_password.reserve(32); // maximum input characters is 33, change if needed pinMode(RELAY_PIN, OUTPUT); // initialize pin as an output. digitalWrite(RELAY_PIN, LOW); // lock the door } void loop() { char key = keypad.getKey(); if (key) { Serial.println(key); if (key == '*') { input_password = ""; // reset the input password } else if (key == '#') { if (input_password == password_1 || input_password == password_2 || input_password == password_3) { Serial.println("The correct password! Unlocking the door in 20 seconds"); digitalWrite(RELAY_PIN, HIGH); // unlock the door for 20 seconds delay(20000); digitalWrite(RELAY_PIN, LOW); // lock the door } else { Serial.println("The incorrect password! try again"); } input_password = ""; // reset the input password } else { input_password += key; // append new character to input password string } } }

LCD-Display Toevoegen aan het RFID Deurslot

Optioneel kunnen we een LCD-display toevoegen om de status (bijvoorbeeld TOEGEKEND/GEWEIGERD) aan gebruikers te tonen.

Bedradingsschema - Deurslot systeem met keypad, solenoïde of elektromagnetisch slot en LCD-display

Arduino Nano door lock system lcd wiring diagram

This image is created using Fritzing. Click to enlarge image

Houd er rekening mee dat in bovenstaand bedrading schema zowel het relais als de LCD mogelijk niet werkt of onstabiel functioneert door onvoldoende stroomvoorziening. Wij raden sterk aan om een externe voeding te gebruiken voor zowel het relais als de LCD. Raadpleeg het volgende bedrading schema voor richtlijnen:

Arduino Nano door lock system lcd external power supply wiring diagram

This image is created using Fritzing. Click to enlarge image

Arduino Nano Code - Keypad Deurslot

/* * Deze Arduino Nano code is ontwikkeld door newbiely.nl * Deze Arduino Nano code wordt zonder enige beperking aan het publiek beschikbaar gesteld. * Voor volledige instructies en schema's, bezoek: * https://newbiely.nl/tutorials/arduino-nano/arduino-nano-keypad-door-lock */ #include <Keypad.h> #include <LiquidCrystal_I2C.h> const int ROW_NUM = 4; //four rows const int COLUMN_NUM = 3; //four columns const int RELAY_PIN = 2; // The Arduino Nano pin connected to the IN pin of relay module const byte pin_rows[ROW_NUM] = {10, 9, 8, 7}; // The Arduino Nano pin connected to the row pins of the keypad const byte pin_column[COLUMN_NUM] = {6, 5, 4}; // The Arduino Nano pin connected to the column pins of the keypad char key_layout[ROW_NUM][COLUMN_NUM] = { {'1', '2', '3'}, {'4', '5', '6'}, {'7', '8', '9'}, {'*', '0', '#'} }; Keypad keypad = Keypad( makeKeymap(key_layout), pin_rows, pin_column, ROW_NUM, COLUMN_NUM); LiquidCrystal_I2C lcd(0x27, 16, 2); // I2C address 0x27 (from DIYables LCD), 16 column and 2 rows const String password_1 = "1234"; // change your password here const String password_2 = "5642"; // change your password here const String password_3 = "12345"; // change your password here String input_password; void setup() { Serial.begin(9600); input_password.reserve(32); // maximum input characters is 33, change if needed pinMode(RELAY_PIN, OUTPUT); // initialize pin as an output. digitalWrite(RELAY_PIN, HIGH); // lock the door lcd.init(); // Initialize the LCD I2C display lcd.backlight(); } void loop() { char key = keypad.getKey(); if (key) { Serial.println(key); if (key == '*') { input_password = ""; // reset the input password lcd.clear(); } else if (key == '#') { lcd.clear(); if (input_password == password_1 || input_password == password_2 || input_password == password_3) { Serial.println("password is correct"); lcd.setCursor(0, 0); lcd.print("CORRECT!"); lcd.setCursor(0, 1); lcd.print("DOOR UNLOCKED!"); digitalWrite(RELAY_PIN, LOW); // unlock the door for 20 seconds delay(20000); digitalWrite(RELAY_PIN, HIGH); // lock the door } else { Serial.println("password is incorrect, try again"); lcd.setCursor(0, 0); lcd.print("INCORRECT!"); lcd.setCursor(0, 1); lcd.print("ACCESS DENIED!"); } input_password = ""; // reset the input password } else { if (input_password.length() == 0) { lcd.clear(); } input_password += key; // append new character to input password string lcd.setCursor(input_password.length(), 0); // move cursor to new position lcd.print('*'); // print * key as hiden character } } }

※ Notiz:

Het adres van het LCD kan verschillen afhankelijk van de fabrikant. In onze code is 0x27 gebruikt, zoals aangegeven door DIYables.

Pieptoon Toevoegen bij Toetsindrukking

We kunnen het deurslot responsiever maken door een piezo buzzer toe te voegen die een korte piep laat horen elke keer wanneer een toets op het keypad wordt ingedrukt.

Dit is vrij eenvoudig te realiseren. Daarom laten we dit deel aan uw creativiteit over. U kunt de Arduino Nano - Keypad Pieptoon tutorial bekijken voor meer begeleiding.

Een Deursensor Toevoegen aan het Keypad Deurslot

In de eerder genoemde code vergrendelt de Arduino Nano de deur na een time-out na het ontgrendelen. In de praktijk wordt er meestal een deursensor aan het systeem toegevoegd. Als de Arduino Nano detecteert dat de deur gesloten is, vergrendelt hij de deur direct in plaats van te wachten op de time-out.

Om het overzichtelijk te houden, hebben we de deursensor niet opgenomen in het bedrading schema en de code. Dit deel laten we aan uw creativiteit over. Raadpleeg de tutorials Arduino Nano - Deursensor en Arduino Nano - Deursensor besturing Relay voor meer uitleg.

Beheer en Opslag van Geldige Wachtwoorden in EEPROM

De hierboven genoemde code gebruikt vaste wachtwoorden (UID’s) die in de Arduino Nano code zijn vastgelegd. Dit betekent dat u de code moet aanpassen en opnieuw uploaden als u wachtwoorden wilt toevoegen of verwijderen, wat onhandig is.

In praktische toepassingen is het noodzakelijk om wachtwoorden te beheren zonder telkens de code te wijzigen en te uploaden. Om dit mogelijk te maken kunnen wachtwoorden opgeslagen worden in de EEPROM in plaats van hardcoded. Hiervoor is een methode nodig om gemakkelijk de wachtwoorden vanuit de EEPROM te beheren.

Er zijn twee methoden beschikbaar om wachtwoorden in EEPROM te beheren:

  • Gebruik van master wachtwoorden
    • Door een wachtwoord te gebruiken als ADD master wachtwoord, kunnen nieuwe wachtwoorden aan het systeem worden toegevoegd. Zodra de Arduino Nano het ADD master wachtwoord detecteert, schakelt hij tussen ADD-modus en OPERATION-modus.
    • Tijdens de ADD-modus voegt Arduino Nano nieuwe wachtwoorden die hij detecteert toe aan de EEPROM.
    • Een vergelijkbare aanpak wordt toegepast voor het DELETE master wachtwoord en DELETE-modus.
  • Gebruik van ADD/DELETE-commando’s via Serial/Bluetooth/IR
    • Commando’s worden verzonden via Serial/Bluetooth/IR met tools als Serial Monitor, Bluetooth-app of IR-controller.
    • De commando’s bestaan uit een instructie (ADD/DELETE) en het wachtwoord.

    Om één van deze twee methoden te gebruiken, moet er aanzienlijke Arduino Nano-code toegevoegd worden. Dit kan een uitdaging zijn voor beginners in programmeren. Daarom is deze tutorial bedoeld om een basisbegrip van het deurslot systeem te bieden zonder beginners te overladen met complexe code. Wilt u dit systeem praktisch toepassen, neem dan contact met ons op via onze betaalde programmeerservice.

Toegangsgeschiedenis Opslaan op een SD-kaart

Om de toegangsgeschiedenis bij te houden, kan het nodig zijn om de toegangstoestand (TOEGESTAAN/GEWEIGERD), datum en tijd op te slaan. Omdat EEPROM onvoldoende capaciteit heeft om de volledige geschiedenis op te slaan, kan hiervoor een SD-kaart worden gebruikt. Zie de tutorial Arduino Nano - Gegevens loggen met tijdstempel naar SD-kaart voor meer informatie.

Video Tutorial

We overwegen het maken van videotutorials. Als u videotutorials belangrijk vindt, abonneer u dan op ons YouTube-kanaal om ons te motiveren de video's te maken.

[Video-inhoud en links blijven onveranderd en worden hier weergegeven.]

[Geen opmerkingen]

※ ONZE BERICHTEN

  • U bent welkom om de link naar deze tutorial te delen. Gebruik onze inhoud echter niet op andere websites. We hebben veel moeite en tijd gestoken in het maken van de inhoud, respecteer alstublieft ons werk!