Diskuze: Arduino keypad zámek s menu.
Člen
Adam Ježek:3.6.2015 21:31
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
Odpovídá na Adam Ježek
CZkiniCZ:4.6.2015 11:43
CZkiniCZ:4.6.2015 11:43
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;
}
}
Odpovídá na CZkiniCZ
CZkiniCZ:4.6.2015 15:02
CZkiniCZ:4.6.2015 15:02
Tak jsem to nakonec vyřešil a boolean jsem ani nepotřeboval.
Odpovídá na CZkiniCZ
Adam Ježek:4.6.2015 22:06
Adam Ježek:4.6.2015 22:06
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ě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.