LEGO huvud Safe (4 / 5 steg)
Steg 4: kod
Koden används befintliga bibliotek för LCD, Servo och knappsats. Jag har skapat min egen kod lösenord system och övergripande funktionaliteten. Koden innehåller tre alternativ för säkert: öppet, nära och ange lösenord. För att ändra lösenord, har användaren veta den existerande lösenordet. Koden är fullt kommenterade för välbefinnande av en person som är ny på programmering.
Följande och bifogade är min kod. Du får gärna använda det!
/***************************************************************************************************************************
Titel: Lego huvud Safe
Författare: Inga-Lill Bellerose
Datum: 11/01/2014
Uppdaterad: 12/03/2014
Syfte: Denna skiss ger kontrollsystemet för Lego Head säker.
Denna skiss lånar från flera källor. De ursprungliga källorna kommer att nämnas här i rubrikblocket när allmänna tillvägagångssätt följdes.
1) Keypad.h bibliotek Skrivet av Mark Stanley och Alexander Brevig (mstanley alexanderbrevig
2) det finns ett password.h bibliotek på Instructables och liknande sajter. Jag brydde mig inte för genomförandet, så jag skapade mitt eget. ****************************************************************************************************************************/
#include < Wire.h >
#include < LiquidCrystal_I2C.h >
#include < Servo.h >
#include < Keypad.h >
LiquidCrystal_I2C lcd(0x27,16,2); Instansiera en 16 x 2 I2C LCD display med adress 0x27
Servo myServo; Instansiera en servo
int pos; Ange variabeln att hålla servo position värde (Obs: "är ett reserverat ord)
int servoSpeed; Ange variabeln att hålla servo hastighet värde (Obs: "fart" är ett reserverat ord) röding lösenord [3]. Matris som innehar huvudlösenord. Ange längd du vill ha. Jag valde 3 för enkel demo char posten [3]. Matris som innehar användarsparade lösenord försök
booleska isAlreadyOpen; Flagga som spårar om säker är redan öppen
booleska isAlreadyClosed; Flagga som spårar om säker är redan stängd
CONST byte rader = 4; Fyra rader i 4 x 4 knappsatsen matris
CONST byte COLS = 4; Fyra kolumner i 4 x 4 knappsatsen matris
char nycklar [rader] [COLS] = {/ / kartor knappsatsen värdena {'1', '2', '3', 'A'}, {"4", "5", "6", "B"}, {'7', '8', '9', 'C'}, {'* ', '0', '#', 'D'}};
byte rowPins [rader] = {8, 7, 6, 5}; Ansluta till rad Stifttilldelningar för knappsatsen
byte colPins [COLS] = {4, 3, 2, 10}; Ansluta till kolumn Stifttilldelningar för knappsatsen
Använd 1 eller mer lämpligt stift för vad jag har märkt som "10"
Min Arduino har många döda hamnar jag har att navigera runt
Tangentbordet knappsatsen = knappsatsen (makeKeymap(keys), rowPins, colPins, rader, kolumner); Instansierar en knappsats med värden gått.
/ *** Set-up funktion *** /
void setup() {Serial.begin(9600); / / Ställ in följetong till 9600 baud
myServo.attach(11); Ställ in servo till stift 11
isAlreadyOpen = 0; Uppsättningar öppna flagga falskt
isAlreadyClosed = 1; Uppsättningar stängt flaggan True
POS = 90. Anger värde för servo arm position i 90 grader
servoSpeed = 3; Ställer in servo hastighet till 3 grader per sekund
myServo.write(pos); Ställer in servo arm till 90 grader
lösenord [0] = '1'; Se till att sätta initiala värdet i enkla citattecken på grund av dess char natur
lösenord [1] = '2'; Andra värdet i lösenord matris
lösenord [2] = '3'; Senaste värdet i lösenord. Lösenordet används som standard för "123" när / / power är förlorad.
keypad.setDebounceTime(250); SET knappen Dämpningstid tid för knappsatsen
LCD.init(); Initiera LCD
LCD.backlight(); Ställa in displayen vara bakgrundsbelyst
LCD.Print ("Välkommen hem!"); Skriva ut meddelandet så att LCD
Delay(1000); Har meddelande visas för 1000 milseconds
LCD.Clear(); Avmarkera Visa
LCD.Print("1) Open 2) nära"); Skriva ut menyn Alternativ
lcd.setCursor(0,1); Flytta markören till andra raden
LCD.Print("3) Ange kod"); Skriva ut andra delen av menyalternativ
Delay(3000); Dröjsmål
}
/***************Main Loop*****************/
void loop() {
posten [0] = NO_KEY; Återställa posten matrisen med varje slinga eller annars
Inlägg [1] = NO_KEY; får du "false" poster från befintliga värden
posten [2] = NO_KEY; Ange det sista tangentbordet till NO_KEY (liknar inställningen / /
värdet null i C++)
char nyckel = keypad.getKey(); Få den första knapptryckning när det gäller menyn.
om (nyckel == '1') {/ / initierar logik om "Öppna safe" är markerat
IF(isAlreadyOpen == 1) / / kontrollerar om säker redan är öppen. Ingen idé att öppna något redan öppen
{
LCD.Clear(); Clear LCD
LCD.Print ("Safe är redan"); Skriver ut meddelandet
lcd.setCursor(0,1); Flytta markören till andra raden
LCD.Print("Open."); Skriva ut andra delen av menyalternativ
Delay(2000); Dröjsmål 2000 millisekunder}
annat / / om säker inte redan är öppen följande kod engagerar {
LCD.Clear(); Tydlig LCD
LCD.Print ("Ange 1 nyckel:"); Meddelande att värva den första tryckning
lcd.setCursor(0,1); Flyttar markören till andra raden
medan (post [0] == NO_KEY) / / loopen kör tills en giltig nyckel pressa görs
`{
posten [0] = keypad.getKey(); Lagrar det första värdet av användarangivna försök på lösenord
}
LCD.Print(Entry[0]); Skriver ut värdet för visning på LCD. Använda för felsökning och användarvänlighet. Delay(1000); Förseningar för 1000 millisekunder
LCD.Clear(); Clear LCD
LCD.Print ("Ange 2. nyckel:"); Ange den andra tryckning
lcd.setCursor(0,1); Flytta curosr
medan (post [1] == NO_KEY) / / annan slinga som kommer att köras oändlighet såvida inte en giltig knapptryckning görs
{posten [1] = keypad.getKey(); / / butiker det andra värdet av användarangivna försök på lösenord}
LCD.Print(Entry[1]); Skriver ut värdet för visning på LCD. Använda för felsökning och användarvänlighet. Delay(1000); Fördröjning för 1000 millisekunder
LCD.Clear(); Clear LCD
LCD.Print ("Ange 3. nyckel:"); Värva tredje tryckning
lcd.setCursor(0,1); Flyttas markören
medan (post [2] == NO_KEY) / / igen, ett tag loop att kontinuerligt poll tills en giltig nyckel pressa görs. {
posten [2] = keypad.getKey(); Blir den slutliga tryckning
}
LCD.Print(Entry[2]); Skriver ut värdet för visning på LCD. Använda för felsökning och användarvänlighet. Delay(1000); Fördröjning för 1000 millisekunder
LCD.Clear(); Clear LCD
om ((post [0] == password[0]) & & post [1] == lösenord [1] & & post [2] == password[2]) / / om vad användaren angett matchar det lagrade lösenordet, denna loop körs
{
isAlreadyOpen = 1; Ange isAlreadyOpen-flaggan till true/hög
isAlreadyClosed = 0; Ange isAlreadyClosed-flaggan till falskt/låg
POS = 180; Ange position till 180 grader
myServo.write(pos); Ställa in servo till 180 grader
LCD.Clear(); Clear LCD i väntan på meddelande
LCD.Print ("Safe är öppet."); Meddelande att kassaskåpet är öppen
Delay(2000); Fördröjning av 2000 millisekunder}
annat / / om fel kod angetts ska detta utför
{
LCD.Clear(); Clear LCD
LCD.Print ("ogiltig kod."). Ogiltig kod meddelande
Delay(1000); Dröjsmål 1000 millisekunder
LCD.Clear(); Clear LCD}}
mainLCDMenu(); Oavsett om lösenord inträde var framgångsrik, sparkar detta tillbaka till huvudmenyn funktioner}
annars om (nyckel == "2")
{/ / Initierar om "Nära safe" är markerat
IF(isAlreadyClosed == 1) / / om huvudet är redan stängd, varför stänga den igen?
{
LCD.Clear(); Clear LCD
LCD.Print ("Safe är redan"); Börja meddelandet att säker redan är slutna lcd.setCursor(0,1); Flytta markören till andra raden
LCD.Print("closed."); Slutmeddelande
Delay(2000); Fördröjning för 2000 millisekunder dröjsmål}
annat / / om säker inte är redan stängd, detta körs
{isAlreadyOpen = 0; / / anger isAlreadyOpen flagga till falskt/låg
isAlreadyClosed = 1; Anger isAlreadyClosed flagga till true/hög
POS = 90. Anger pos till 90 grader
myServo.write(pos); Uppsättningar servo till 90 grader
LCD.Clear(); Clear LCD
LCD.Print ("Safe stängs."); Meddelande att kassaskåpet är stängd
Delay(2000); Dröjsmål 2000 millisekunder}
LCD.Clear(); Clear LCD
mainLCDMenu(); Hursomhelst, gå tillbaka till huvudmenyn}
annars om (nyckel == "3") {/ / om "Ange kod" alternativet
LCD.Clear(); Clear LCD
LCD.Print ("Ange 1 nyckel:"); Den kod som följer är en upprepning av koden i alternativ 1 lcd.setCursor(0,1); Användaren måste ange lösenordet framgångsrikt innan du ändrar det
medan (post [0] == NO_KEY)
{posten [0] = keypad.getKey();}
LCD.Print(Entry[0]);
Delay(1000);
LCD.Clear();
LCD.Print ("Ange 2. nyckel:");
lcd.setCursor(0,1);
medan (post [1] == NO_KEY)
{posten [1] = keypad.getKey();}
LCD.Print(Entry[1]);
Delay(1000);
LCD.Clear();
LCD.Print ("Ange 3. nyckel:");
lcd.setCursor(0,1);
medan (post [2] == NO_KEY)
{posten [2] = keypad.getKey();}
LCD.Print(Entry[2]);
Delay(1000);
LCD.Clear();
om ((post [0] == password[0]) & & post [1] == lösenord [1] & & post [2] == password[2]) / / om lösenordet har angetts korrekt, denna logik utför
{lösenord [0] = NO_KEY; / / återställa lösenordsvärdet 0 till NO-nyckel lösenord [1] = NO_KEY; / / återställa lösenordsvärdet 1 till nr-nyckel lösenord [2] = NO_KEY; / / återställa lösenordsvärdet 2 till NO-nyckel
LCD.Print ("Ange 1 nyckel:"); Ange första nyckelvärde
lcd.setCursor(0,1);
medan (lösenord [0] == NO_KEY) / / loopar oändlighet tills giltig nyckel tryck emot {lösenord [0] = keypad.getKey(); / / sätter lösenord [0] nytt värde} lcd.print(password[0]); Skriver ut nytt värde
Delay(1000);
LCD.Clear(); Clear LCD
LCD.Print ("2: a nyckeln:"); Meddelande för 2: a nyckel
lcd.setCursor(0,1); Flytta kod
medan (lösenord [1] == NO_KEY) / / loopar oändlighet tills giltig nyckel tryck emot {lösenord [1] = keypad.getKey(); / / sätter lösenord [1] till nytt värde} lcd.print(password[1]); Skriver ut nytt värde
Delay(1000); Dröjsmål 1000 millisekunder
LCD.Clear(); Clear LCD
LCD.Print ("3: e nyckeln:"); Meddelande för tredje nyckel
lcd.setCursor(0,1); Flytta markören
medan (lösenord [2] == NO_KEY) / / loopar oändlighet tills giltig nyckel tryck emot {lösenord [2] = keypad.getKey(); / / sätter lösenord [2] till nytt värde}
LCD.Print(Password[2]); Skriver ut nytt värde
Delay(1000); Dröjsmål 1000 millisekunder
LCD.Clear(); Clear LCD}
annat / / detta körs om användaren skriver in fel lösenord för verifiering innan {/ / för att ange lösenord. Användaren kan inte ändra lösenordet utan att veta lösenordet
LCD.Clear(); Clear LCD
LCD.Print ("ogiltig kod."). Ogiltig kod meddelande
Delay(1000); Dröjsmål 1000 millisekunder
LCD.Clear(); Clear LCD}
mainLCDMenu(); Oavsett resultatet, gå tillbaka till huvudmenyn
} }