Close

Čtení hesla z

Úvodní stránka Fórum Vaše projekty Arduino Čtení hesla z

Aktuálně je na stránce zobrazeno 13 příspěvků - 1. až 13. (celkem z 13)
  • Autor
    Příspěvky
  • #10292
    rades
    Úč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]);
    }
    }

    #10294
    Zbyšek Voda
    Správce

    Dobrý 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á, dokud i = 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é.

    #10299
    rades
    Účastník

    Ježiši Kriste! Já jsem fakt debil…

    #10300
    rades
    Účastník

    Kaž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ý

    #10301
    rades
    Účastník

    Tedy, jak zařídit, aby program čekal na stisknutí klávesy a přečetl tak pětimístné heslo?

    #10302
    Zbyšek Voda
    Správce

    Pojď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 🙂

    #10303
    rades
    Účastník

    Ano, funguje, ale stál mi jakákoliv klávesa píše 0 :/

    #10325
    Zbyšek Voda
    Správce

    Pošlete kód 🙂

    #10343
    rades
    Účastník

    Tak 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..

    #10344
    rades
    Účastník

    void 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);
    }

    }
    `

    #10347
    Zbyšek Voda
    Správce

    Dobrý 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 = "";
      }
    }
    #10351
    rades
    Účastník

    Děkuji moc, jsem Vám zavázán. Opravdu tak pohotové lidi aby pohledal.

    #10353
    Zbyšek Voda
    Správce

    Není zač, mějte se 🙂

Aktuálně je na stránce zobrazeno 13 příspěvků - 1. až 13. (celkem z 13)
  • Pro reakci na toto téma se musíte přihlásit.