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.
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
Ezt a hibaüzenetet kapom teszteléskor miért?:
VálaszTörlésArduino: 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.
Kedves Zsolt!
TörlésBocsá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.
Hiába minden!
VálaszTörlésUez a kiirás!
Kedves Mátyás!
TörlésAhogy 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. :)
Jo napot.en is probalom elinditani (NANO es UNO )de mindig a " exit status 1
VálaszTörlés'POSITIVE' was not declared in this scope "problemat adja be.Miert?Probaltam minden variaciot,(kitoroltem a masik Lcd i2c varienst ami volt,toroltem a positive szot,)es nem akarja tovabb engedni.Koszonom elore is a valaszt.
Ezt a megjegyzést eltávolította a szerző.
VálaszTörlésEzt a megjegyzést eltávolította a szerző.
VálaszTörlésEzt a megjegyzést eltávolította a szerző.
VálaszTörlésHelyetesiteni kell a LICHIDCRISTAL I2C vel.akkor mukodik. Nekem pl.bejott.
VálaszTörlés