In questo articolo vedremo come sfruttare un keypad 4×4 e un display LCD per permettere a l’utente di inserire parametri come dati o password.
Utilizzeremo questo metodo per attivare un servo dopo l’inserimento di una password dalla tastiera
INGREDIENTI:
-1x Arduino UNO
-1x Bredboard
-1x Display LCD
-1x Potenziometro da 10 kΩ (opzionale)
-1x Keypad 4×4
-1x Servo
-Cavetti vari
lo schema da realizzare:

lo scketch per arduino:
//Creato da Mohamed Fadiga momodesine@hotmail.it
#include //include la libreria per la gestione del display LCD
#include //include la libreria per la gestione del keypad
#include //include la libreria per la gestione del servo
LiquidCrystal lcd(10, 11, A0, A1, A2, A3); //Imposta i pin di Arduino a quali sono collegati in pin del display (Rs,E,DB4,DB5,DB6,DB7)
byte colPins[4] = {5, 4, 3, 2};
byte rowPins[4] = {9, 8, 7, 6};
char Keys[4][4] = //creo la matrice dei tasti della tastiera.
{
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
Keypad keyp = Keypad(makeKeymap(Keys), rowPins, colPins, 4, 4);
Servo myservo;
char key = '\0';
int lum_pin = 12;
long inst_time;
char risp[16];
byte close_val = 0;
byte open_val = 180;
void setup()
{
pinMode(lum_pin, OUTPUT);
analogWrite(lum_pin, 0);
lcd.begin(16, 2);
Serial.begin(9600);
myservo.attach(A4);
myservo.write(close_val);
}
void loop()
{
lcd.clear();
lcd.print("Premi '*'");
key = keyp.getKey();
while (key != '*')key = keyp.getKey();
analogWrite(lum_pin, 255);
int ans = get_param("Ins. Password", "0123456789", risp, true);
if (ans == 1)
{
lcd.print("Apertura...");
myservo.write(open_val);
delay(5000);
lcd.clear();
lcd.print("Chiusura...");
myservo.write(close_val);
}
else if (ans == 2)
{
lcd.print("Pass errata!");
delay(2000);
}
analogWrite(lum_pin, 0);
}
boolean get_param(char* question, char* answer, char* param, boolean isPassword )
{
byte j = 0;
lcd.clear();
lcd.print(question);
lcd.setCursor(j, 1);
lcd.blink();
inst_time = millis();
do
{
lcd.setCursor(j, 1);
key = keyp.getKey();
jump_key:
if (key)inst_time = millis();
if ((key == '*') || (key == '#'))break;
else if (key == 'C' && j > 0)
{
param[j] = '\0';
j--;
lcd.setCursor(j, 1);
lcd.write(" ");
}
else if (key == 'B' || key == 'D' || key == 'A');
else if (key)
{
param[j] = key;
j++;
lcd.print(key);
if (isPassword)
{
long pass_wait = millis();
do key = keyp.getKey();
while (((millis() - pass_wait) < 1000) && (!key));
lcd.setCursor(j - 1, 1);
lcd.write('*');
if (key)goto jump_key;
}
}
}
while ((millis() - inst_time) < 10000 && j < 17);
param[j] = '\0';
lcd.clear();
if (key == '*')
{
Serial.println(param);
if (!strcmp(param, answer))return 1;
else return 2;
}
else return 0;
}