In questa nuova lezione su Arduino vedremo come poter utilizzare il KeyPad per inserire un codice, che verrà verificato attraverso una connessione ad un DB MySQL.
Abbiamo già visto nella lezione 8, come utilizzare il KeyPad (sia quello 4×3 che 4×4) con Arduino, per leggere e verificare un codice che viene immesso attraverso tale dispositivo. Tuttavia non si è sfruttato le potenzialità che Internet mette a disposizione; infatti il codice di verifica era immesso direttamente nel codice di Arduino e per tanto qualsiasi modifica al codice, richieda un intervento diretto al micro-controllore. Con questo piccolo progetto, sarà possibile caricare tutti i codici a 6 cifre che si vogliono nel nostro DB MySQL e Arduino verificherà se il codice inserito è corretto. Semplice no ?
Progetto KeyPad + MySQL
Requisiti Hardware
- Arduino Uno/Arduino Mega
- Ethernet Shield
- KeyPad 4×4
- Un PC/Raspberry/DB
Requisiti Software
- MySQL Workbench
- Libreria MySQL-Arduino
- Libreria KeyPad
Il meccanismo di funzionamento è il seguente; l’utente inserisce il codice alfanumerico attraverso il KeyPad. Una volta che ha completato di inserire le 6 cifre, preme il tasto * e rimane in attesa della verifica. Una volta completa tale operazioni, Arduino comunicherà attraverso il seriale se il codice inserito è corretto oppure no e accenderà il LED 13. Il codice può anche essere di lunghezza superiore, ma deve essere modificato nel codice sorgente.
Prima di tutto è necessario crearsi una Schema all’interno del DB MySQL. Nel mio caso l’ho chiamato Auth.
C’è solamente una table di nome Codes, che ha come attributi un solo elemento che è Code, un elemento di tipo varchar(10), che è chiave primaria e deve non deve essere nulla.
Per fare queste operazioni si può usare tranquillamente il MySQL Workbench, che è un programma davvero semplice da usare.
Per maggiori informazioni riguardo a MySQL, vi consiglio di leggere questo articolo.
Ed ecco il codice del programma per Arduino Uno/Arduino Mega che permette di verificare la correttezza di un codice inserito con KeyPad, relativamente a quelli presenti nel DB MySQL:
/* Questo programma permette di collegarsi ad un DB MySQL per verificare se il codice inserito è corretto Autore Giacomo Bellazzi Versione 1.0 */ #include "SPI.h" #include "Ethernet.h" #include "sha1.h" #include "mysql.h" #include "Keypad.h" #define LED 13 const byte ROWS = 4; //quattro righe const byte COLS = 4; //quattro colonne char keyInsert[7]; char Keys[ROWS][COLS]= //creo la matrice dei tasti della tastiera. { {'1','2','3','A'} , {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} }; byte colPins[4] = {5,4,3,2}; // Pin a cui sono connesse le colonne byte rowPins[4] = {9,8,7,6}; // Pin a cui sono connesse le righe int i = 0; int j = 0; Keypad keypad = Keypad( makeKeymap(Keys), rowPins, colPins, ROWS, COLS); byte mac_addr[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; IPAddress server_addr(10, 0, 0, 16); Connector my_conn; char user[] = "username"; char password[] = "password"; char QUERY_POP[50] = "Select * From Auth.Codes as AK Where AK.Code='%s'"; char query[60]; void setup() { Ethernet.begin(mac_addr); Serial.begin(9600); pinMode(13,OUTPUT); while (!Serial); delay(1000); Serial.println("Connecting..."); if (my_conn.mysql_connect(server_addr, 3306, user, password)){ Serial.println("Connected!"); } else { Serial.println("Connection failed."); } } void loop() { char key = keypad.getKey(); if (i==0){ Serial.println("Insert code to verify..."); i++; } if (key != NO_KEY && j<6){ Serial.print("*"); //Serial.println(key); keyInsert[j]=key; j++; } if(key == '*') { Serial.println(); Serial.println("Verifyng the code..."); if(isAuthorized(keyInsert)){ Serial.println("The code is correct"); digitalWrite(LED,HIGH); //TODO possibili ulteriori implementazioni }else{ Serial.println("The code is incorrect, please retry"); delay(2000); } i=0; j=0; delay(2000); digitalWrite(LED,LOW); } if(key == '#'){ //può essere utile } } // Controlla se un codice è autorizzato boolean isAuthorized(char code[]){ sprintf(query, QUERY_POP,code); my_conn.cmd_query(query); my_conn.get_columns(); row_values *row = NULL; int number = 0; while (row = my_conn.get_next_row()) { number++; my_conn.free_row_buffer(); } my_conn.free_columns_buffer(); if(number==0){ return false; }else{ return true; } }
La verifica della correttezza del codice inserita viene fatta dalla funzione isAuthorized(char code[]); tale funzione verifica se il numero di righe che ritornano dalla query al DB è maggiore di 0. La query è:
Select * From Codes Where Code = 'A47DCB'
Per poter mandare il esecuzione il programma, è necessario inserire username a password del vostro DB MySQL. Poi è necessario inserire i codici che sono validi. Per farlo si può usare questa query:
INSERT INTO Codes(Code) VALUES ('A47DCD')
Ecco l’output del risultato sulla console di Arduino:
Il programma funziona bene su Arduino Mega, mentre su Arduino Uno ci possono essere dei problemi legati alla memoria, in quanto le librerie usate e le variabili sono pesanti.
2 commenti
hey jackbell16 ,thanks for share the code
but i got a problem with error: ‘class Connector’ has no member named ‘get_columns’
i dont know why the error come, i;m using arduino 1.6.5 and mysql librarry version 1.0.4-ga
Did you try to run the code with Arduino 1.0.6 ? Bye the way, is the library MySQL installed correctly in the Arduino libraries ?