Avatar
CZkiniCZ
Člen
Avatar
CZkiniCZ:

Udělal jsem si jednoduchý zámek s LCD 16x2 a 5x4 keypadem.(Je to nedokončené)

#include <Password.h>
#include <Keypad.h>
#include<Wire.h>
#include <LiquidCrystal_I2C­.h>

Password password = Password("1234"); // heslo

LiquidCrystal_I2C lcd(0x27,16,2); // adresa

const byte ROWS = 5;
const byte COLS = 4;

// klavesnice
char keys[ROWS][COLS] = {
{'A','B','#','*'},
{'1','2','3','^'},
{'4','5','6','v'},
{'7','8','9','C'},
{'<','0','>','E'}
};
byte rowPins[ROWS] = {0, A3, 8, 7 ,6};
byte colPins[COLS] = {2, 3, 4, 5};

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup()
{
Serial.begin(9600);
keypad.addEven­tListener(key­padEvent);
lcd.init();
lcd.noAutoscroll();
lcd.print("PLEASE ENTER PIN");
lcd.backlight();
}

void loop()
{
keypad.getKey();
}

void keypadEvent(Ke­ypadEvent eKey)
{
switch (keypad.getState())
{
case PRESSED:
Serial.print("Pres­sed: ");
Serial.println(e­Key);
lcd.cursor();
lcd.noAutoscroll();
lcd.print(eKey);
switch (eKey){
case 'E': checkPassword(); break;
case 'C': password.reset(); break;
default:passwor­d.append(eKey);
}
}
}

void checkPassword(){
if (password.eva­luate()){
Serial.println("Suc­cess");
lcd.clear();
lcd.setCursor(1,0);
lcd.print("Suc­ces");
//zelena LED a relé
}else{
Serial.println("Wron­g");
lcd.clear();
lcd.setCursor(1,0);
lcd.print("Wrong");
//cervena LED
}
}

A tet bych do toho chtěl přidat menu, které jsem si dřive vytvořil pro jiný projekt:

#include <LiquidCrystal_I2C­.h>
#include <Keypad.h>
#include <Wire.h>

LiquidCrystal_I2C lcd(0x27,16,2);

const byte ROWS = 5;
const byte COLS = 4;

char keys[ROWS][COLS] = {
{'A','B','#','*'},
{'1','2','3','^'},
{'4','5','6','v'},
{'7','8','9','C'},
{'<','0','>','E'}
};
int switchPin = 5;
byte rowPins[ROWS] = {A2, A3, 8, 7 ,6};
byte colPins[COLS] = {2, 3, 4, 5};

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
int currentMenuItem = 0;
int lastState = 0;
void setup() {
Serial.begin(9600);
keypad.addEven­tListener(key­padEvent);
lcd.init();
lcd.backlight();
clearPrintTitle();
int switchPin = 2;
}
void loop() {
keypad.getKey();
}
void keypadEvent(Ke­ypadEvent eKey) {
int state = 0;
int x = analogRead(0);
lcd.setCursor(0,0);
switch (keypad.getState())
{
case PRESSED:
switch (eKey) {
case '>':
case '^': uparrow(); break;
case 'v': downarrow(); break;
case '<':
case 'E': execute(); break;
case 'C': returnup(); break;

}
}
//kdyz dorazim nakonec tak me to vrati na zacatek
if (currentMenuItem < 0 || currentMenuItem > 4) {
currentMenuItem = 0;
}
if (state != lastState) {
lastState = state;
}
delay(5);
}

//funkce tlacitek
void downarrow(){
currentMenuItem = currentMenuItem + 1;
displayMenu(cu­rrentMenuItem);
}
void uparrow(){
currentMenuItem = currentMenuItem - 1;
displayMenu(cu­rrentMenuItem);
}
void execute(){

selectMenu(cu­rrentMenuItem);
}
void returnup(){
displayMenu(cu­rrentMenuItem);
}
//hlavni polozky
void displayMenu(int x) {
switch (x) {
case 1:
clearPrintTitle();
lcd.print ("-> Menu 1");
break;
case 2:
clearPrintTitle();
lcd.print ("-> Menu 2");
break;
case 3:
clearPrintTitle();
lcd.print ("-> Menu 3");
break;
case 4:
clearPrintTitle();
lcd.print ("-> Menu 4");
break;
}
}

//prvni radek - nadpis
void clearPrintTitle() {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Menu");
lcd.setCursor(0,1);
}

//polozky
void selectMenu(int x) {
switch (x) {
case 1:
clearPrintTitle();
lcd.print ("polozka 1");
//nastaveni 1
break;
case 2:
clearPrintTitle();
lcd.print ("polozka 2");
//nastaveni 2
break;
case 3:
clearPrintTitle();
lcd.print ("polozka 3");
//nastaveni 3

break;
case 4:
clearPrintTitle();
lcd.print ("Polozka 4");
//nastaveni 4
break;
}
}
Mělo by to fungovat tak že kdyz zadám pin tak se mi odemknou dveře. Když před zadáním pinu stisknu klávesu F1 tak se dostaku do menu, zadám pin a změním nastavení. Po zadání pinu se stiskne ent stejně jako pro uložení nastavení. Nemůžu to ale nájak dát dohromady.

Odpovědět 3.6.2015 21:15
Age of the geek.
Avatar
Adam Ježek
Tým ITnetwork
Avatar
Adam Ježek:

V obouch kódech máš jinak piny, víš o tom? Jinak napadá mě spojit setup, všechny funkce dát do jednoho souboru a loop obou spojit rozdělením přes if, deklarovat si někde boolean menu, něco jako

switch (keypad.getState())
{
case PRESSED:
Serial.print("Pressed: ");
Serial.println(eKey);
if(eKey = '*') {//nebo čím lezeš do menu
    if(menu)
      menu = false;
    else
       menu = true;
}
if(menu) {
// pokud má být menu, vykonávat loop v kódu pro menu
switch (keypad.getState())
{
switch (keypad.getState())
{
case PRESSED:
switch (eKey) {
case '>':
case '^': uparrow(); break;
case 'v': downarrow(); break;
case '<':
....atd
} else {
//jinak vykonávat loop pro heslo
switch (keypad.getState())
{
case PRESSED:
switch (eKey){
case 'E': checkPassword(); break;
case 'C': password.reset(); break;
default:password.append(eKey);
....atd

jinak na zdroják tu máme tlačítko

Nahoru Odpovědět 3.6.2015 21:31
Programátor dělá co může. Počítač co chce. | Pokud mi dáš mínus, tak prosim, napiš proč!
Avatar
CZkiniCZ
Člen
Avatar
Odpovídá na Adam Ježek
CZkiniCZ:

Zkusil jsem to ale pořát to nefunguje. Použil jsem kod, který jste navrhl a přestalo to fungovat úplně

#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <Wire.h>


//inicia o display e seleciona as entradas e saidas
LiquidCrystal_I2C lcd(0x27,16,2);

const byte ROWS = 5; // 5 řádků
const byte COLS = 4; // 4 sloupce

// zde si napíšete jak Vaše
// membránová klávesnice vypadá (některé znaky nahrazeny)
char keys[ROWS][COLS] = {
  {'A','B','#','*'},
  {'1','2','3','^'},
  {'4','5','6','v'},
  {'7','8','9','C'},
  {'<','0','>','E'}
};
int switchPin = 5;
byte rowPins[ROWS] = {A2, A3, 8, 7 ,6}; //čísla pinů s řadkem 1 2 3 4 5
byte colPins[COLS] = {2, 3, 4, 5}; //čísla pinu se sloupcem 1 2 3 4

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

//States for the menu.
int currentMenuItem = 0;
int lastState = 0;
int testt = 9;
boolean menu = false;
void setup() {
 Serial.begin(9600);
 keypad.addEventListener(keypadEvent);

lcd.init();
 lcd.backlight();
   clearPrintTitle();


}

void loop() {
keypad.getKey();
Serial.println(menu);
}

  void keypadEvent(KeypadEvent eKey) {
  //State = 0 every loop cycle.
  int state = 0;
  //Refresh the button pressed.
  int x = analogRead(0);
  //Set the Row 0, Col 0 position.
  lcd.setCursor(0,0);





switch (keypad.getState())
{
case PRESSED:
Serial.print("Pressed: ");
Serial.println(eKey);
if(eKey = '*') {//nebo čím lezeš do menu
    if(menu)
      menu = false;
    else
       menu = true;
}
if(menu) {
// pokud má být menu, vykonávat loop v kódu pro menu
switch (keypad.getState())
{
switch (keypad.getState())
{
case PRESSED:
switch (eKey) {
  menu = !menu;
case '>':
case '^': uparrow(); break;
case 'v': downarrow(); break;
case '<': break;
}}}
} else {
//jinak vykonávat loop pro heslo
switch (keypad.getState())
{
case PRESSED:
switch (eKey){
case 'E': break;
case 'C': break;

}
}
}
}





  //If we are out of bounds on th menu then reset it.
  if (currentMenuItem < 0 || currentMenuItem > 4) {
   currentMenuItem = 0;
  }
       //If we have changed Index, saves re-draws.
   if (state != lastState) {

      //Save the last State to compare.
      lastState = state;
   }
   //Small delay
  delay(5);
}


 void downarrow(){
   currentMenuItem = currentMenuItem + 1;
          displayMenu(currentMenuItem);
   }
    void uparrow(){
   currentMenuItem = currentMenuItem - 1;
          displayMenu(currentMenuItem);
   }
    void execute(){

          selectMenu(currentMenuItem);
   }
   void returnup(){
     displayMenu(currentMenuItem);
     }
     void testik(){
       lcd.print("aaa");
       Serial.print("bbb");
       }
//Display Menu Option based on Index.
void displayMenu(int x) {
     switch (x) {
      case 1:
        clearPrintTitle();
        lcd.print ("-> Menu Option 1");
        break;
      case 2:
        clearPrintTitle();
        lcd.print ("-> Menu Option 2");
        break;
       case 3:
        clearPrintTitle();
        lcd.print ("-> Menu Option 3");
        break;
      case 4:
        clearPrintTitle();
        lcd.print ("-> Menu Option 4");
        break;
    }
}

//Print a basic header on Row 1.
void clearPrintTitle() {
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Menu");
  lcd.setCursor(0,1);
}

//Show the selection on Screen.
void selectMenu(int x) {
   switch (x) {
      case 1:
        clearPrintTitle();
        lcd.print ("Selected Opt 1");
        //Call the function that belongs to Option 1
        break;
      case 2:
        clearPrintTitle();
        lcd.print ("Selected Opt 2");
        //Call the function that belongs to Option 2
        break;
       case 3:
        clearPrintTitle();
        lcd.print ("Selected Opt 3");
        //Call the function that belongs to Option 3

        break;
      case 4:
        clearPrintTitle();
        lcd.print ("Selected Opt 4");
        //Call the function that belongs to Option 4
        break;
    }
}
Nahoru Odpovědět 4.6.2015 11:43
Age of the geek.
Avatar
CZkiniCZ
Člen
Avatar
Odpovídá na CZkiniCZ
CZkiniCZ:

Tak jsem to nakonec vyřešil a boolean jsem ani nepotřeboval.

Nahoru Odpovědět 4.6.2015 15:02
Age of the geek.
Avatar
Adam Ježek
Tým ITnetwork
Avatar
Odpovídá na CZkiniCZ
Adam Ježek:

no vidiš :) ale k mému nápadu, jednak jsem psal "něco jako" a ne abys to opsal, už sem nebyl moc při smyslech, o tom svědčí i ta část

switch (keypad.getState())
{
switch (keypad.getState())
{

která pohřbila poslední zbytky funkčnosti :D

Nahoru Odpovědět 4.6.2015 22:06
Programátor dělá co může. Počítač co chce. | Pokud mi dáš mínus, tak prosim, napiš proč!
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.