Arduino Security panel kijelzővel és billentyűzettel

16.Projekt -- Arduino Security panel kijelzővel és billentyűzettel -- V1.0

 by Roboworld Hobbielektronika


Rövid leírás:
Ebben a rövid projektben bemutatjuk neked hogyan is működik egy jelszavas belépőkapu, amely 1602 LCD kijelzőn jelzi a helyes jelszó meglétét. A projektben a microservo motor fogja helyettesíteni a zárat, valamint két darab LED is biztosít minket arról, hogy szabad bejárás(zöld LED világít) van avagy nincs( piros LED világít).

Hardware
1db Arduino Uno
1db 16x2 LCD kijelző I2C kommunikációval
1db Tower Pro microservo SG90
1db 16 gombos SCM mátrix billentyűzet
Elektronikai alkatrész KIT
Jumper kábel


Kapcsolási rajz:

16 gombos SCM mátrix billentyűzetről

A 4x4 mátrix billentyűzet  összesen 8 pinnel rendelkezik. 4 közülük a soroknak, 4 pedig az oszlopoknak pinje. Mindegyik gomb lényegében egy nyomógombbal ér fel, amely megnyomás esetén rövidre zár egy sort és egy oszlopot egyaránt. A sor és az oszlop metszetében rövidzár alakul ki amellyel megtudjuk határozni és különböztetni, hogy melyik gomb is volt megnyomva.

Például, ha az első sornak (R1) alacsony jelet adunk és az összes oszlopra magas értéket, akkor amikor megnyomjuk például a 3-as gombot akkor a C3-as oszlopban a magas jel alacsonyra vált. Az R1 és a C3 találkozásánál pedig a 3-as nyomógomb található. Minden ehhez hasonló esetben regisztrálni tudjuk, hogy melyik gomb volt megnyomva.

1602 LCD kijelző I2C kommunikációval.
Korábban már esett szó az ilyen típusú LCD kijelzők programozásáról. Erről bővebb információt az alábbi projektben találsz.

https://hobbielektronikabolt.blogspot.de/2017/08/2-projekt-1602-lcd-vezerles-i2c.html


Programozás, mintakód
#include <Servo.h>                         // Servo library használata 
#include <Wire.h>        
#include <LiquidCrystal_I2C.h>             // I2C kijelzőhöz a library 
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); 
#include <Keypad.h>                        //Keypad library-je. Letölthető  innen: http://playground.arduino.cc/Code/Keypad 
Servo myservo; 
#define redLED 10                          //LED pinek definiálása a D10 és D11-es pinhez 
#define greenLED 11 

char* password ="4321";          //Ide kell beírni a kiválasztott jelszót 
int pozisyon = 0;                //Keypad mátrix pozíciója. Volt e már valami megnyomva. 
int pos = 0;                     //Szervomotor alaphelyzet 
const byte rows = 4;             //A keypad mátrix oszlopainak és sorainak száma 
const byte cols = 4; 

char keyMap [rows] [cols] = {    //A szimbólumok definiálása a billentyűzet nyomógombjaihoz 

{'1', '2', '3', 'A'}, 
{'4', '5', '6', 'B'}, 
{'7', '8', '9', 'C'}, 
{'*', '0', '#', 'D'} 
}; 

byte rowPins [rows] = {1, 2, 3, 4};      //Keypad pinjei az Arduinohoz 
byte colPins [cols] = {5, 6, 7, 8}; 

Keypad myKeypad = Keypad( makeKeymap(keyMap), rowPins, colPins, rows, cols); 


void setup(){ 

lcd.begin(16, 2);                 //16 karakter 2 sorban. kijelző képernyőjének definiálása 
pinMode(redLED, OUTPUT);          //LED kimenetként beállítva 
pinMode(greenLED, OUTPUT); 
setLocked (true);                 //Zárás alaphelyezete igaz. 
myservo.attach(9);                //Servo a D9-es pinhez definiálva 
} 

void loop(){ 

char whichKey = myKeypad.getKey();      //melyik gomb "kulcs" volt megnyomva? 
lcd.setCursor(0, 0); 
lcd.print("    Udvozlom!");             // kijelzőre kiírja hogy Udvozlom 
lcd.setCursor(0, 1); 
lcd.print(" Kerem a jelszot");          // kijelzőre kiírja hogy Kerem a jelszot 

if(whichKey == '*' || whichKey == '#' || whichKey == 'A' ||    //Helytelen karakterek definiálása 
whichKey == 'B' || whichKey == 'C' || whichKey == 'D'){ 

//Ha megonyomunk a helytelen karakterek közül //valamelyik a pozisyon értéke 0 lesz. 

pozisyon=0;                    //memória bitként szolgál, hogy tudjuk  volt //megnyomás. 
setLocked (true);              //Zárás aktív 
lcd.clear();                   //Törli a kijelző tartalmát 
lcd.setCursor(0, 0); 
lcd.print("Helytelen gomb!"); 
delay(1000); 
lcd.clear(); 
} 

if(whichKey == password [pozisyon]){     //ha a megadott karakterek a megfelelő sorrendben helyesek 
pozisyon ++;                             //akkor pozisyon értéke minden helyes megnyomásnál megnő eggyel. 
} 

if(pozisyon == 4){                       // Mivel a jelszavunk 4 karakterből áll, 4 helyes karakter esetén a pozisyon //értéke megegyezik 4-el. 
setLocked (false);                       // Zárás inaktív. Ekkor LED állapota változik (Pirosról- zöldre) 
lcd.clear();                             // Törli a kijelző tartalmát 
lcd.setCursor(0, 0); 
lcd.print("** Jelszo OK **");            // Kiírja hogy jelszó OK 
servo();                                 // Servo szubrutinra ugrik. lejjebb található 
delay(100);                              // vár 100ms-ot 
lcd.clear();                             // Törli a kijelző tartalmát 
lcd.setCursor(0, 0); 
lcd.print("   Roboworld ");              // Kiírja az első sorba hogy Roboworld 
lcd.setCursor(0, 1);          
lcd.print("Hobbielektronika");           // Kiírja a második sorba hogy Hobbielektronika 
delay(100);                              // vár 100ms-ot 
lcd.clear();                             // Törli a kijelző tartalmát 

digitalWrite(greenLED, LOW);             // ZöldLED alacsony jelet kap 
digitalWrite(redLED, HIGH);              // PirosLED magas jelet kap 
pozisyon=0;                              // pozisyon értéke alaphelyetbe állítása 
return; 
} 
delay(100);                              // vár 100ms-ot 
} 

void setLocked(int locked){ 

if(locked){ 
digitalWrite(redLED, HIGH);              // Ha zárva van akkor piros LED magas jelet kap 
digitalWrite(greenLED, LOW); 
} 
else{ 
digitalWrite(redLED, LOW); 
digitalWrite(greenLED, HIGH);            // Ha nyitva van akkor zöld LED magas jelet kap 
} 
} 
void servo() { 
for (pos = 0; pos <= 180; pos += 1) {    // 0 foktól 180 fokig elfordul 
// 1 lépés 1 fok. 
myservo.write(pos);                      // Servo a "pos" változó aktuális értékére megy 
delay(15);                               // 15ms vár, hogy a szervo elérje a pozíciót 
} 
delay(5000);                             // vár 5 mp-et 
for (pos = 180; pos >= 0; pos -= 1)      // 180 foktól 0 fokig elfordul 
myservo.write(pos);                      // Servo a "pos" változó aktuális értékére megy 
delay(15);                               // 15ms vár, hogy a szervo elérje a pozíciót 
} 
} 

Megvalósítás



Letöltés

A leírás PDF-ben itt található
Mintakódot innen tudod letölteni
A keypad library-t innen tudod letölteni

Megjegyzések

  1. Ezt a hibaüzenetet kapom teszteléskor miért?:
    Arduino: 1.8.5 (Windows 7), Alaplap:"Arduino/Genuino Uno"

    _16_Security_panel_servo:9: error: 'POSITIVE' was not declared in this scope

    LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

    ^

    C:\Users\Zsolt\Desktop\Arduino\Arduino projektek\keyboard\_16_Security_panel_servo\_16_Security_panel_servo.ino:16:17: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

    char* password ="4321"; //Ide kell beírni a kiválasztott jelszót

    ^

    exit status 1
    'POSITIVE' was not declared in this scope

    Ennek a jelentésnek több információja lehetne
    a "Bővebb kimenet mutatása fordításkor"
    opció engedélyezésével a Fájl -> Beállítások-ban.

    VálaszTörlés
    Válaszok
    1. Kedves Zsolt!
      Bocsánat a kései válaszért. Úgy gondolom, hogy a te könyvtárad valamiért rossz helyre mutat fordításkor. Elképzelhető hogy az Arduino/library könyvtáradban két azonos elnevezésű liquidcrystal library helyezkedik el és nem tudja, hogy melyikre hivatkozzon fordításkor. Azért is furcsállom,hogy nem működik, mivel a feltöltött programokat magam tesztelem. Megpróbálom reprodukálni a hibádat, hogy további segítséget tudjak nyújtani.

      Törlés
  2. Válaszok
    1. Kedves Mátyás!
      Ahogy előző kommentemben is írtam Zsoltnak, úgy fordulhat elő hasonló eset ha az Arduino librarydben két azonos nevű könyvtár van, így fordításkor az IDE nem tudja eldönteni, hogy melyik könyvtárat vegye alapul. Megpróbálom én is reprodukálni a hibát. Hamarosan jelentkezem a témában. :)

      Törlés

Megjegyzés küldése