Stap 4: Code
De code gebruikt bestaande bibliotheken voor de LCD, Servo en toetsenbord. Ik heb mijn eigen code met betrekking tot de wachtwoordsysteem en de algehele functionaliteit. De code bevat drie opties voor de veilige: open, nauwe en ingestelde wachtwoord. Om het wachtwoord te wijzigen, heeft de gebruiker het bestaande wachtwoord weten. De code is volledig toegelicht voor het gemak van een persoon die nieuw voor de programmering.
De volgende en aangesloten is mijn code. Aarzel dan niet om het te gebruiken!
/***************************************************************************************************************************
Titel: Hoofd van de Lego Safe
Auteur: Kaitlin Bellerose
Datum: 11/01/2014
Bijgewerkt: 12/03/2014
Doel: Deze schets biedt het controlesysteem voor de Lego Head veilig.
Deze sketch leent uit meerdere bronnen. De originele bronnen zal hier in het titelblok worden genoemd als algemene benaderingen werden gevolgd.
1) Keypad.h bibliotheek geschreven door Mark Stanley en Alexander Brevig (mstanley alexanderbrevig
2) er is een password.h bibliotheek beschikbaar op Instructables site en vergelijkbare sites. Ik kon het niet schelen voor de uitvoering, dus ik heb mijn eigen gemaakt. ****************************************************************************************************************************/
#include < Wire.h >
#include < LiquidCrystal_I2C.h >
#include < Servo.h >
#include < Keypad.h >
LiquidCrystal_I2C lcd(0x27,16,2); Instantiëren van een 16 x 2 LCD van de I2C display met adres 0x27
Servo myServo; Instantiëren van een servo
int pos; Declareren om servo positiewaarde te houden (Opmerking: "positie is een gereserveerd woord)
int servoSpeed; Declareren om servo snelheid waarde te houden (Opmerking: "snelheid" is een gereserveerd woord) char wachtwoord [3]; Matrix die in het bezit van de master-wachtwoord. Ingesteld op de lengte die u wenst. Ik koos voor 3 voor het gemak van binnenkomst van de char demo [3]; Matrix die in het bezit van de poging van de gebruiker ingevoerde wachtwoord
Booleaanse isAlreadyOpen; Vlag waarmee wordt bijgehouden of veilige is al geopend
Booleaanse isAlreadyClosed; Vlag waarmee wordt bijgehouden of kluis is reeds gesloten
Const byte rijen = 4; Vier rijen in 4 x 4 toetsenbord matrix
Const byte COLS = 4; Vier kolommen in 4 x 4 toetsenbord matrix
char toetsen [ROWS] [COLS] = {/ / kaarten van de waarden van het toetsenblok {'1', '2', '3', 'A'}, {'4', '5', '6', 'B'}, {'7', '8', '9', 'C'}, {'* ', '0', '#', 'D'}};
byte rowPins [ROWS] = {8, 7, 6, 5}; Verbinding maken met de pinouts rij van het toetsenbord
byte colPins [COLS] = {4, 3, 2, 10}; Verbinding maken met de kolom pinouts van het klavier
Gebruik maken van 1 of meer passende pin voor wat ik heb aangeduid als "10"
Mijn Arduino heeft veel dode poorten die ik heb om te navigeren
Toetsenbord toetsenbord toetsenbord = (makeKeymap(keys), rowPins, colPins, rijen, COLS); Een instantie van een toetsenbord met de waarden doorgegeven.
/ *** Set-up functie *** /
void setup {Serial.begin(9600); / / Set seriële tot 9600 baud
myServo.attach(11); Set servo aan op pin 11
isAlreadyOpen = 0; Sets open vlag op false
isAlreadyClosed = 1; Sets gesloten vlag op true
POS = 90; Waarde voor de servo arm positie ingesteld op 90 graden
servoSpeed = 3; Wordt servo snelheid ingesteld op 3 graden per seconde
myServo.write(pos); Servo arm ingesteld op 90 graden
wachtwoord [0] = '1'; Zorg dat de beginwaarde in enkele aanhalingstekens vanwege de aard van de char
wachtwoord [1] = "2"; Tweede waarde in wachtwoord matrix
wachtwoord [2] = '3'; Laatste waarde in het vak wachtwoord. Het wachtwoord wordt standaard "123" wanneer / / stroomonderbreking.
keypad.setDebounceTime(250); Sets de knop debounce tijd voor het toetsenblok
LCD.init(); Initialiseren van de LCD
LCD.backlight(); Instellen van het display worden verlicht
LCD.Print ("Welkom thuis!"); Welkom boodschap aan LCD afdrukken
delay(1000); Bericht weergeven voor 1000 milseconds
LCD.Clear(); Schakel het weergeven
LCD.Print("1) open 2) Close"); Afdrukken van menu-opties
lcd.setCursor(0,1); Cursor naar de tweede lijn
LCD.Print("3) Code ingesteld"); Tweede deel van de opties in het menu afdrukken
delay(3000); Vertraging
}
/***************Main Loop*****************/
void loop {}
vermelding [0] = NO_KEY; Opnieuw instellen van de toegang array met elke lus of anders
post [1] = NO_KEY; je krijgt "valse" vermeldingen van bestaande waarden
post [2] = NO_KEY; Instellen dat de laatste toetsen aan NO_KEY (lijkt op het installeren / /
waarde op NULL in C++)
char sleutel = keypad.getKey(); De eerste indrukken van een toets met betrekking tot menu te krijgen.
Als (sleutel == '1') {/ / initieert logica als "Open safe" optie is geselecteerd
if(isAlreadyOpen == 1) / / wordt gecontroleerd als de kluis al geopend is. Geen punt bij het openen van iets al open
{
LCD.Clear(); Clear LCD
LCD.Print ("Safe is al"); Bericht afdrukken
lcd.setCursor(0,1); Cursor naar de tweede lijn
LCD.Print("open."); Tweede deel van de opties in het menu afdrukken
delay(2000); Vertraging 2000 miliseconden}
anders / / als de kluis nog niet geopend is, de volgende code neemt {}
LCD.Clear(); Schakelt het LCD-scherm
LCD.Print ("1e sleutel invoeren:"); Bericht aan het werven van de eerste indrukken van een toets
lcd.setCursor(0,1); Cursor verplaatsen naar tweede regel
terwijl (post [0] == NO_KEY) / / de lus wordt uitgevoerd totdat een geldige toetsaanslag wordt gemaakt
`{
vermelding [0] = keypad.getKey(); De eerste waarde van de door de gebruiker ingevoerde poging tot wachtwoord opgeslagen
}
LCD.Print(Entry[0]); De waarde van de prints voor weergave op LCD-scherm. Gebruiken voor foutopsporing en gebruiksgemak. delay(1000); Vertragingen voor 1000 miliseconden
LCD.Clear(); Hiermee wist u de LCD
LCD.Print ("2de sleutel invoeren:"); Voer de tweede indrukken van een toets
lcd.setCursor(0,1); Verplaatsen curosr
terwijl (post [1] == NO_KEY) / / een andere lus die eindeloos wordt uitgevoerd, tenzij een geldig ToetsIndrukken (KeyPress) is gemaakt
{post [1] = keypad.getKey(); / / slaat de tweede waarde van de door de gebruiker ingevoerde poging tot wachtwoord}
LCD.Print(Entry[1]); De waarde van de prints voor weergave op LCD-scherm. Gebruiken voor foutopsporing en gebruiksgemak. delay(1000); Vertraging voor 1000 miliseconden
LCD.Clear(); Clear LCD
LCD.Print ("3de sleutel invoeren:"); Werven van derde indrukken van een toets
lcd.setCursor(0,1); Verplaatst de cursor
terwijl (post [2] == NO_KEY) / / weer een tijdje loop aan continu poll unti een geldige toetsaanslag wordt gemaakt. {
post [2] = keypad.getKey(); Deze eigenschap haalt de laatste indrukken van een toets
}
LCD.Print(Entry[2]); De waarde van de prints voor weergave op LCD-scherm. Gebruiken voor foutopsporing en gebruiksgemak. delay(1000); Vertraging voor 1000 miliseconden
LCD.Clear(); Clear LCD
Als ((post [0] == password[0]) & & post [1] == wachtwoord [1] & & post [2] == password[2]) / / als de gebruiker heeft ingevoerd, overeenkomt met het opgeslagen wachtwoord, deze lus wordt uitgevoerd
{
isAlreadyOpen = 1; IsAlreadyOpen vlag is ingesteld op true/hoog
isAlreadyClosed = 0; IsAlreadyClosed vlag is ingesteld op false/laag
POS = 180; Positie instellen tot 180 graden
myServo.write(pos); De servo ingesteld op 180 graden
LCD.Clear(); Clear LCD in afwachting van bericht
LCD.Print ("Safe is geopend."); Bericht dat het veilig geopend is
delay(2000); Vertraging van 2000 miliseconden}
anders / / als de verkeerde code is ingevoerd, wordt dit uitgevoerd
{
LCD.Clear(); Clear LCD
LCD.Print ("ongeldige code."); Ongeldige code bericht
delay(1000); Vertraging 1000 miliseconden
LCD.Clear(); Clear LCD}}
mainLCDMenu(); Ongeacht of invoeren van wachtwoorden geslaagd is, schopt dit terug naar het belangrijkste menufuncties}
anders als (sleutel == '2')
{/ / Initieert als "Nauwe safe" is geselecteerd
if(isAlreadyClosed == 1) / / als het hoofd al gesloten is, waarom sluit u dit opnieuw?
{
LCD.Clear(); Clear LCD
LCD.Print ("Safe is al"); Begin van bericht dat het veilig al gesloten lcd.setCursor(0,1) is; Cursor naar de tweede lijn
LCD.Print("closed."); Einde bericht
delay(2000); Vertraging voor 2000 miliseconden vertraging}
anders / / als de kluis niet al is gesloten, dit wordt uitgevoerd
{isAlreadyOpen = 0; / / Sets isAlreadyOpen vlag op false/laag
isAlreadyClosed = 1; IsAlreadyClosed markering ingesteld op true/hoog
POS = 90; Pos ingesteld op 90 graden
myServo.write(pos); Sets servo tot 90 graden
LCD.Clear(); Hiermee wist u de LCD
LCD.Print ("Safe is gesloten."); Bericht dat het veilig is gesloten
delay(2000); Vertraging 2000 miliseconden}
LCD.Clear(); Clear LCD
mainLCDMenu(); Hoe dan ook, ga terug naar het hoofdmenu}
anders als (sleutel == '3') {/ / als optie "Set code" is geselecteerd
LCD.Clear(); Clear LCD
LCD.Print ("1e sleutel invoeren:"); De code die volgen is een herhaling van code in optie 1 lcd.setCursor(0,1); De gebruiker heeft met succes het wachtwoord invoeren voordat u deze wijzigt
terwijl (post [0] == NO_KEY)
{vermelding [0] = keypad.getKey();}
LCD.Print(Entry[0]);
delay(1000);
LCD.Clear();
LCD.Print ("2de sleutel invoeren:");
lcd.setCursor(0,1);
terwijl (post [1] == NO_KEY)
{post [1] = keypad.getKey();}
LCD.Print(Entry[1]);
delay(1000);
LCD.Clear();
LCD.Print ("3de sleutel invoeren:");
lcd.setCursor(0,1);
terwijl (post [2] == NO_KEY)
{post [2] = keypad.getKey();}
LCD.Print(Entry[2]);
delay(1000);
LCD.Clear();
Als ((post [0] == password[0]) & & post [1] == wachtwoord [1] & & post [2] == password[2]) / / als het wachtwoord correct zijn ingevoerd, deze logica voert
{wachtwoord [0] = NO_KEY; / / Reset de wachtwoordwaarde 0 nee-KEY wachtwoord [1] = NO_KEY; / / Reset de wachtwoordwaarde 1 NO-KEY wachtwoord [2] = NO_KEY; / / Reset de wachtwoordwaarde 2 aan NO-KEY
LCD.Print ("1e sleutel instellen:"); Eerste belangrijke waarde instellen
lcd.setCursor(0,1);
terwijl (wachtwoord [0] == NO_KEY) / Loops eindeloos totdat geldige toets pers ontvangen / {wachtwoord [0] = keypad.getKey(); / / wachtwoord [0] stelt op nieuwe waarde} lcd.print(password[0]); Prenten uit nieuwe waarde
delay(1000);
LCD.Clear(); Clear LCD
LCD.Print ("2de sleutel instellen:"); Bericht voor 2de sleutel
lcd.setCursor(0,1); Code handmatig verplaatsen
terwijl (wachtwoord [1] == NO_KEY) / Loops eindeloos totdat geldige toets pers ontvangen / {wachtwoord [1] = keypad.getKey(); / / wachtwoord [1] stelt op nieuwe waarde} lcd.print(password[1]); Prenten uit nieuwe waarde
delay(1000); Vertraging 1000 miliseconden
LCD.Clear(); Clear LCD
LCD.Print ("de sleutel van de 3e instellen:"); Bericht voor de derde sleutel
lcd.setCursor(0,1); Cursor verplaatsen
terwijl (wachtwoord [2] == NO_KEY) / Loops eindeloos totdat geldige toets pers ontvangen / {wachtwoord [2] = keypad.getKey(); / / wachtwoord [2] stelt op nieuwe waarde}
LCD.Print(password[2]); Prenten uit nieuwe waarde
delay(1000); Vertraging 1000 miliseconden
LCD.Clear(); Clear LCD}
anders / / dit wordt uitgevoerd als de gebruiker het verkeerde wachtwoord voor verificatie vooraf typt {/ / te wijzigen van het wachtwoord. Gebruiker kan wachtwoord niet wijzigen zonder het wachtwoord te kennen
LCD.Clear(); Clear LCD
LCD.Print ("ongeldige code."); Ongeldige code bericht
delay(1000); Vertraging 1000 miliseconden
LCD.Clear(); Clear LCD}
mainLCDMenu(); Ongeacht het resultaat, ga terug naar het hoofdmenu
} }