Étape 4: Code
Le code utilisé des bibliothèques existantes pour le LCD, Servo et clavier. J’ai créé mon propre code en ce qui concerne le système de mot de passe et de la fonctionnalité globale. Le code propose trois options pour le coffre-fort : ouvert, étroite et définir mot de passe. Afin de changer le mot de passe, l’utilisateur doit connaître le mot de passe existant. Le code est entièrement commenté pour la facilité d’une personne nouvelle à la programmation.
Attaché et suivants sont mon code. S’il vous plaît n’hésitez pas à l’utiliser !
/***************************************************************************************************************************
Titre : Tête de Lego Safe
Auteur : Kaitlin Bellerose
Date : 01/11/2014
Mise à jour : 03/12/2014
But : Cette esquisse fournit le système de contrôle pour le Lego Head sans danger.
Cette esquisse s’inspire de sources multiples. Les sources originales seront citées ici dans la cartouche quand les approches générales ont été observées.
1) Bibliothèque de Keypad.h écrite par Mark Stanley et Alexander Brevig (mstanley alexanderbrevig
2) il existe une bibliothèque password.h sur Instructables et des sites similaires. J’ai ne se souciait pas de la mise en œuvre, donc j’ai créé mon propre. ****************************************************************************************************************************/
#include < Wire.h >
#include < LiquidCrystal_I2C.h >
#include < Servo.h >
#include < Keypad.h >
LiquidCrystal_I2C lcd(0x27,16,2) ; Instancier un LCD 16 x 2 I2C avec adresse 0 x 27
Servo myServo ; Instancier un servo
int pos ; Déclarer la variable destinée à contenir la valeur de position servo (NOTE: « la position est un mot réservé)
int servoSpeed ; Déclarer la variable destinée à contenir la valeur de vitesse de servo (NOTE: « vitesse » est un mot réservé) mot de passe de char [3] ; Tableau qui contient le mot de passe principal. Affectez à la longueur que vous désirez. J’ai choisi 3 pour faciliter l’entrée de char démo [3] ; Tableau qui contient la tentative de l’utilisateur a entré le mot de passe
Boolean isAlreadyOpen ; Indicateur qui suit si sûre est déjà ouvert
Boolean isAlreadyClosed ; Indicateur qui suit si le coffre est déjà fermé
const byte rangs = 4 ; Quatre lignes de matrice clavier 4x4
const byte COLS = 4 ; Quatre colonnes de la matrice clavier 4x4
char des touches [lignes] [colonnes] = {/ / mappe les valeurs de clavier {« 1 », « 2 », '3', 'A'}, {« 4 », « 5 », "6", "B"}, {« 7 », « 8 », "9", "C"}, {'* ', « 0 », « # »,'d '}} ;
rowPins Byte [rangs] = {7, 8, 5, 6} ; Se connecter à la ligne de brochage du clavier
colPins Byte [CDL] = {4, 3, 2, 10} ; Se connecter à la liste des broches colonne du clavier
Utiliser la broche 1 ou plus approprié pour ce que j’ai étiqueté comme « 10 »
Mon Arduino dispose de nombreux ports morts que je dois naviguer autour
Clavier clavier = clavier (makeKeymap(keys), rowPins, colPins, lignes, colonnes) ; Instancie un clavier avec les valeurs passées.
/ *** Montage fonction *** /
void setup() {Serial.begin(9600); / / Set série à 9600 bauds
myServo.attach(11) ; Set servo sur la broche 11
isAlreadyOpen = 0 ; Ensembles ouvrir faux
isAlreadyClosed = 1 ; Drapeau des ensembles fermés true
POS = 90 ; Définit la valeur pour la position du bras servo à 90 degrés
servoSpeed = 3 ; Définit la vitesse du servo à 3 degrés par seconde
myServo.write(pos) ; Bras de servo ensembles à 90 degrés
mot de passe [0] = « 1 » ; N’oubliez pas de mettre la valeur initiale dans des guillemets simples en raison de sa nature de char
mot de passe [1] = « 2 » ; Deuxième valeur dans tableau de mot de passe
mot de passe [2] = « 3 » ; Dernière valeur de mot de passe. Le mot de passe par défaut est « 123 » quand / / puissance est perdue.
keypad.setDebounceTime(250) ; Définit le bouton debounce temps pour le clavier
LCD.init() ; Initialiser l’écran LCD
LCD.backlight() ; Définir l’affichage rétro-éclairé
LCD.Print ("Welcome Home!") ; Imprimer le message de bienvenue pour LCD
Delay(1000) ; Avez une message pour 1000 milseconds
LCD.Clear() ; Effacer l’affichage
LCD.Print("1) Open 2) étroite ») ; Menu options d’impression
lcd.setCursor(0,1) ; Déplacer le curseur à la deuxième ligne
"LCD.Print("3) Set Code ») ; Imprimer la deuxième partie des options du menu
Delay(3000) ; Delay
}
/***************Main Loop*****************/
void loop() {}
entrée [0] = NO_KEY ; Réinitialiser le tableau d’entrée dont chaque boucle ou autre
entrée [1] = NO_KEY ; vous obtiendrez des « fausses » entrées de valeurs existantes
entrée [2] = NO_KEY ; Programmer le clavier final à NO_KEY (similaire au paramètre / /
valeur null en C++)
clé char = keypad.getKey() ; Téléchargez la première presse clée en ce qui concerne le menu.
Si (clé == « 1 ») {/ / établit la logique si « Coffre ouvert » est cochée
if(isAlreadyOpen == 1) / / vérifie si le coffre est déjà ouvert. Inutile d’ouvrir quelque chose de déjà ouvert
{
LCD.Clear() ; Clear LCD
LCD.Print ("Safe is already") ; Message de tirages
lcd.setCursor(0,1) ; Déplacer le curseur à la deuxième ligne
LCD.Print("Open.") ; Imprimer la deuxième partie des options du menu
Delay(2000) ; Millisecondes de retard 2000}
else / / si le coffre n’est pas déjà ouvert, le code suivant s’engage {}
LCD.Clear() ; Effacer l’écran LCD
LCD.Print ("entrez clé 1er:") ; Message pour solliciter la première pression de touche
lcd.setCursor(0,1) ; Déplace le curseur à la deuxième ligne
tandis que (entrée [0] == NO_KEY) / / la boucle s’exécute jusqu'à ce qu’une touche valide est rendue
`{
entrée [0] = keypad.getKey() ; Stocke la valeur première de la tentative d’entrées par l’utilisateur mot de passe
}
LCD.Print(entry[0]) ; Imprime la valeur pour l’affichage sur écran LCD. Utiliser pour le débogage et la facilité d’utilisation. Delay(1000) ; Retards pour 1000 millisecondes
LCD.Clear() ; Efface l’écran LCD
LCD.Print ("entrez la touche 2nd:") ; Entrez la deuxième pression de touche
lcd.setCursor(0,1) ; Déménagement curosr
tandis que (entrée [1] == NO_KEY) / / une autre boucle qui s’exécute indéfiniment à moins que la pression d’une touche valide est faite
{entrée [1] = keypad.getKey(); / / stocke la seconde valeur de la tentative d’entrées par l’utilisateur mot de passe}
LCD.Print(entry[1]) ; Imprime la valeur pour l’affichage sur écran LCD. Utiliser pour le débogage et la facilité d’utilisation. Delay(1000) ; Délai pour 1000 millisecondes
LCD.Clear() ; Clear LCD
LCD.Print ("entrez clé 3:") ; Solliciter des tiers sur une touche
lcd.setCursor(0,1) ; Déplacé le curseur
tandis que (entrée [2] == NO_KEY) / / encore une fois, un certain temps une boucle à continuellement sondage unti une touche valide est faite. {
entrée [2] = keypad.getKey() ; Obtient la touche finale
}
LCD.Print(entry[2]) ; Imprime la valeur pour l’affichage sur écran LCD. Utiliser pour le débogage et la facilité d’utilisation. Delay(1000) ; Délai pour 1000 millisecondes
LCD.Clear() ; Clear LCD
Si ((entrée [0] == password[0]) & & entrée [1] == mot de passe [1] & & entrée [2] == password[2]) / / si correspond à ce que l’utilisateur a entré le mot de passe stockée, cette boucle est exécutée
{
isAlreadyOpen = 1 ; Drapeau d’isAlreadyOpen la valeur true/haut
isAlreadyClosed = 0 ; Drapeau d’isAlreadyClosed la valeur false/faible
POS = 180 ; Position réglée à 180 degrés
myServo.write(pos) ; Mettre le servo à 180 degrés
LCD.Clear() ; Clear LCD en prévision du message
LCD.Print ("Safe est ouvert.") ; Message que le coffre est ouvert
Delay(2000) ; Retard de 2000 millisecondes}
else / / si un code incorrect a été entré, elle exécute
{
LCD.Clear() ; Clear LCD
LCD.Print ("code non valide.") ; Message de code non valide
Delay(1000) ; Retard de 1000 millisecondes
LCD.Clear() ; Clear LCD}}
mainLCDMenu() ; Peu importe si l’entrée de mot de passe a réussi, c’est utilisé retour aux fonctions menu principal}
ElseIf (clé == « 2 »)
{/ / Établit si « Safe étroite » est sélectionnée
if(isAlreadyClosed == 1) / / si la tête est déjà fermée, pourquoi le refermer ?
{
LCD.Clear() ; Clear LCD
LCD.Print ("Safe is already") ; Commencer le message que le coffre est déjà fermée lcd.setCursor(0,1) ; Déplacer le curseur à la deuxième ligne
LCD.Print("Closed.") ; Message de finition
Delay(2000) ; Retard du retard milisecondes 2000}
else / / si le coffre n’est pas déjà fermé, elle exécute
{isAlreadyOpen = 0; / / affecte à l’indicateur isAlreadyOpen sur false/low
isAlreadyClosed = 1 ; Affecte à l’indicateur isAlreadyClosed true/haut
POS = 90 ; Définit le point de vente à 90 degrés
myServo.write(pos) ; Servo d’ensembles à 90 degrés
LCD.Clear() ; Efface l’écran LCD
LCD.Print ("Safe est fermé.") ; Message que le coffre est fermé
Delay(2000) ; Millisecondes de retard 2000}
LCD.Clear() ; Clear LCD
mainLCDMenu() ; Quoi qu’il en soit, revenir au menu principal}
ElseIf (clé == « 3 ») {/ / si l’option « Set code » est sélectionnée
LCD.Clear() ; Clear LCD
LCD.Print ("entrez clé 1er:") ; Le code qui suivent est une répétition du code en option 1 lcd.setCursor(0,1) ; L’utilisateur doit entrer le mot de passe avec succès avant d’en changer
tandis que (entrée [0] == NO_KEY)
{entrée [0] = keypad.getKey();}
LCD.Print(entry[0]) ;
Delay(1000) ;
LCD.Clear() ;
LCD.Print ("entrez la touche 2nd:") ;
lcd.setCursor(0,1) ;
tandis que (entrée [1] == NO_KEY)
{entrée [1] = keypad.getKey();}
LCD.Print(entry[1]) ;
Delay(1000) ;
LCD.Clear() ;
LCD.Print ("entrez clé 3:") ;
lcd.setCursor(0,1) ;
tandis que (entrée [2] == NO_KEY)
{entrée [2] = keypad.getKey();}
LCD.Print(entry[2]) ;
Delay(1000) ;
LCD.Clear() ;
Si ((entrée [0] == password[0]) & & entrée [1] == mot de passe [1] & & entrée [2] == password[2]) / / si le mot de passe a été entré correctement, cette logique s’exécute
{mot de passe [0] = NO_KEY; / / réinitialiser la valeur de mot de passe 0 à mot de passe sans clavette [1] = NO_KEY; / / réinitialiser la valeur de mot de passe 1 mot de passe sans clavette [2] = NO_KEY; / / réinitialiser la valeur de mot de passe 2 à sans clavette
LCD.Print ("Set key 1er:") ; Première valeur clé
lcd.setCursor(0,1) ;
tandis que (mot de passe [0] == NO_KEY) / / boucles sans cesse jusqu'à ce que valide key press a reçu {mot de passe [0] = keypad.getKey(); / / définit le mot de passe [0] nouvelle valeur} lcd.print(password[0]) ; Imprime les nouvelle valeur
Delay(1000) ;
LCD.Clear() ; Clear LCD
LCD.Print ("Set touche 2nd:") ; Message pour la 2ème clé
lcd.setCursor(0,1) ; Déplacez le code
tandis que (mot de passe [1] == NO_KEY) / / boucles sans cesse jusqu'à ce que valide key press a reçu {mot de passe [1] = keypad.getKey(); / / définit le mot de passe [1] nouvelle valeur} lcd.print(password[1]) ; Imprime les nouvelle valeur
Delay(1000) ; Retard de 1000 millisecondes
LCD.Clear() ; Clear LCD
LCD.Print ("Set 3e clé:") ; Message pour troisième clé
lcd.setCursor(0,1) ; Déplacer le curseur
tandis que (mot de passe [2] == NO_KEY) / / boucles sans cesse jusqu'à ce que valide key press a reçu {mot de passe [2] = keypad.getKey(); / / définit le mot de passe [2] à la nouvelle valeur}
LCD.Print(Password[2]) ; Imprime les nouvelle valeur
Delay(1000) ; Retard de 1000 millisecondes
LCD.Clear() ; Clear LCD}
else / / cela s’exécute si l’utilisateur a entré le mauvais mot de passe pour avant vérification {/ / pour changer le mot de passe. L’utilisateur ne peut pas changer de mot de passe sans connaître le mot de passe
LCD.Clear() ; Clear LCD
LCD.Print ("code non valide.") ; Message de code non valide
Delay(1000) ; Retard de 1000 millisecondes
LCD.Clear() ; Clear LCD}
mainLCDMenu() ; Quel que soit le résultat, revenir au menu principal
} }