Čtení hesla z
Úvodní stránka › Fórum › Vaše projekty › Arduino › Čtení hesla z
- Toto téma obsahuje celkem 12 odpovědí. Do diskuze (2 diskutující) se naposledy zapojil uživatel Zbyšek Voda a poslední změna proběhla před 7 roky a 10 měsíci.
-
AutorPříspěvky
-
31.1.2017 v 14:12 #10292radesÚčastník
Zdravím, mám takový problém. Chci si načíst heslo z klávesnice, ale opravdu nevím jak. Konktétně když zadávám heslo, tak po zadání prvního znaku mi to už stále jen v seriovce zobrazuje hodnotu 1.
#include <Key.h>
#include <Keypad.h>int admpw[5];
int zadani1[5];
int zadani2[5];const byte ROWS = 4;
const byte COLS = 3;
char keys[ROWS][COLS] = {
{‚1′,’2′,’3‘,},
{‚4′,’5′,’6‘,},
{‚7′,’8′,’9‘,},
{‚*‘,’0′,’#‘,}
};byte rowPins[ROWS] = { 5, 4, 3, 2 };
byte colPins[COLS] = { 9, 8, 7};Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
void setup()
{
keypad.addEventListener(keypadEvent);
Serial.begin(9600);
}void loop()
{
keypad.getKey();
}void keypadEvent(KeypadEvent eKey)
{
for (int i =0; i = 5; i++)
{
admpw[i] = keypad.getState();
Serial.println(admpw[i]);
}
}31.1.2017 v 15:15 #10294Zbyšek VodaÚčastníkDobrý den, ve funkci keypadEvent máte podivnou ukončovací podmínku cyklu for.
Máte tam:for (int i =0; i = 5; i++)
Tedy cyklus probíhá, dokudi = 5
. V každém průchodu se tedy do i přiřadí hodnota 5, je vyhodnocena jako true a cyklus opakuje znova – tedy se zacyklí.Asi je to překlep a chtěl jste napsat
i < 5
🙂Pokud byste chtěl testovat rovnost, tak musíte použít operátor
==
,=
je přiřazení hodnoty do proměnné.31.1.2017 v 16:03 #10299radesÚčastníkJežiši Kriste! Já jsem fakt debil…
31.1.2017 v 16:05 #10300radesÚčastníkKaždopádně stisk jakékoliv klávesy mi nyní vypíše
1
1
1
1
1
3
3
3
3
3
0
0
0
0
0
=> Opět jsem bezradný31.1.2017 v 16:06 #10301radesÚčastníkTedy, jak zařídit, aby program čekal na stisknutí klávesy a přečetl tak pětimístné heslo?
31.1.2017 v 16:30 #10302Zbyšek VodaÚčastníkPojďme tedy pokračovat dál 🙂 Koukám na dokumentaci, tak snad ji dobře chápu. (http://playground.arduino.cc/Code/Keypad)
Prozkoumejme pořádně funkci keypadEvent.
void keypadEvent(KeypadEvent eKey){ for (int i =0; i = 5; i++){ admpw[i] = keypad.getState(); Serial.println(admpw[i]); } }
Ta je zavolána kdykoliv, když dojde ke změně stavu klávesy (uvolnění, stisknutí).
Funkce getState() vrací hodnotu podle toho, co se s keypadem děje – vrací hodnoty
IDLE, PRESSED, RELEASED a HOLD. Vy tedy budete ve funkci keypadEvent testovat, jestli je getState() rovna PRESSED a poté zapisovat hodnotu stisknuté klávesy do pole admpw[] na patřičné místo (další v pořadí).Takže bych postupoval následovně: vytvořte si na začátku programu proměnnou
int pos = 0;
, která bude udávat pozici načteného znaku. Při stisknutí tlačítka dojde k uložení stisknutého tlačítka do pole admpw na index pos a navýšení proměnné pos o 1. Musíte si také pohlídat, aby pos měla hodnoty 0 – 4. To se dá zařídit operátorem modulo – %.void keypadEvent(KeypadEvent eKey){ if(keyboard.getState == PRESSED){ admpw[pos] = keyboard.getKey(); pos = (pos + 1) % 5; } }
Takhle by to podle mě mohlo jít 🙂
31.1.2017 v 16:55 #10303radesÚčastníkAno, funguje, ale stál mi jakákoliv klávesa píše 0 :/
31.1.2017 v 22:21 #10325Zbyšek VodaÚčastníkPošlete kód 🙂
1.2.2017 v 18:24 #10343radesÚčastníkTak jsem to nakonec vyřešil takto, ale stále uvažuji, jak vyřešit to, aby program čekal na zadání dalšího znaku..
1.2.2017 v 18:26 #10344radesÚčastníkvoid setup() {
Serial.begin(9600);}
void loop() {
String zadano;
char znak;
char menu;while(Serial.available()) {
znak = Serial.read();
zadano.concat(znak);
}if (zadano != „“) {
Serial.println(zadano);
}
if (zadano == „HELP“)
menu = ‚H‘;
else
menu = ‚0‘;
switch (menu)
{
case ‚H‘: Serial.println(“ //================================================\\“);
Serial.println(“ ||================================================||“);
Serial.println(“ ||Vypis prikazu ||“);
Serial.println(“ ||================================================||“);
Serial.println(“ ||COSI popis instrukce jshfjashfjsah ||“);
Serial.println(“ ||================================================||“);
Serial.println(“ \\================================================//“);
default: delay(5);
}}
`1.2.2017 v 19:43 #10347Zbyšek VodaÚčastníkDobrý den, můžete si udělat třeba nějaké počitadlo.
Kód by pak mohl vypadat například takto (předpokládám, že chcete získat 5 znaků).
int poc = 0; String zadano; char znak; char menu; void setup() { Serial.begin(9600); } void loop() { while (Serial.available()) { znak = Serial.read(); if (znak < 32 || znak > 126) continue; //přeskočí znaky mimo rozumný rozsah (konec řádku...) zadano.concat(znak); poc++; Serial.println(zadano); } if (poc >= 5) { if (zadano == "HELP") menu = 'H'; else menu = '0'; switch (menu) { case 'H': Serial.println(" //================================================\\"); Serial.println(" ||================================================||"); Serial.println(" ||Vypis prikazu ||"); Serial.println(" ||================================================||"); Serial.println(" ||COSI popis instrukce jshfjashfjsah ||"); Serial.println(" ||================================================||"); Serial.println(" \\================================================//"); default: delay(5); } poc = 0; zadano = ""; } }
1.2.2017 v 21:20 #10351radesÚčastníkDěkuji moc, jsem Vám zavázán. Opravdu tak pohotové lidi aby pohledal.
1.2.2017 v 22:50 #10353Zbyšek VodaÚčastníkNení zač, mějte se 🙂
-
AutorPříspěvky
- Pro reakci na toto téma se musíte přihlásit.