Stránka 1 z 1

Arduino vstup z klávesnice a uložení hodnoty

Napsal: pát 15.05.2015 10:06
od vlkodlak
Zdravím a obracím se s prosbou o pomoc.
Pro jeden testovací projekt potřebuji uživatelsky z maticové klávesnice zadat číselnou hodnotu pro poměnnou, tu uložit a následně s ní pracovat dál. Pěkně se v tom motám, nevím kudy ven. Předpokládám, že bude zadávaná hodnota čtyř místná, potvrzení některou z nenumeriských kláves (* nebo #).
Příkládám kód, (jen část pro klávesnici) který mi aktuelně běží.

#include <Keypad.h>

// definice klavesnice
const byte ROWS = 4; // 4 řádky
const byte COLS = 3; // 4 sloupce


// klávesnice vypadá takhle

char hexaKeys[ROWS][COLS] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}
};
byte rowPins[ROWS] = {30, 32, 34, 36}; //čísla pinů s řadkem 1 2 3
byte colPins[COLS] = {24, 22, 26}; //čísla pinu se sloupcem 1 4 7 *

//inicializuje objekt klávesnice s názvem Klavesnice
Keypad Klavesnice = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);

void setup(){
Serial.begin(9600);
}

void loop(){
// přečte znak z klávesnice
char customKey = Klavesnice.getKey();

// když není customKey null tak poslat znak na Serial port
if (customKey){
Serial.println(customKey);
}

}

Klávesy zatím jen čtu, znaky si posílám na seriový port. Má někdo nějaký nápad ?

Re: Arduino vstup z klávesnice a uložení hodnoty

Napsal: pát 15.05.2015 11:25
od Aragor
vlkodlak píše:Předpokládám, že bude zadávaná hodnota čtyř místná, potvrzení některou z nenumeriských kláves (* nebo #).


Tak jako první si udělej 4 místné pole a do něho ulož postupně zmáčknutá čísla. Po zmáčknutí potvrzujícího znaku převedeš to pole na číslo do proměnné. pole[0] - jednotky, pole[1] - desítky, ...

Re: Arduino vstup z klávesnice a uložení hodnoty

Napsal: pát 15.05.2015 14:33
od Drondys

Kód: Vybrat vše

int  Idx = 0;
char Bafr[4];
int  Cislo = 0;

void loop()
{

  // precte znak z klavesnice
  char customKey = Klavesnice.getKey();

  if (customKey) {
    // je to nejaky znak

    if (customKey >= '0' && customKey <= '9') {
      // je to numericky znak

      if (Idx < 4) {
        // znaky postupne ukladame do Bafru
        Bafr[Idx++] = customKey;
      } else {
        // posledni pozici v Bafru jen prepisujeme
        Bafr[3] = customKey;
      }

    } else {
      // neni to numericky znak

      if (Idx > 0 && customKey == '#') {
        // je to potvrzeni a uz byl nacten alespon
        // jeden numericky znak

        // nyni nejprve z textoveho bafru prevedeme prevod
        // na binarni ciselnou hodnotu do promenne Cislo

        int Krat = 1;
        Cislo = 0;
        for (Idx--; Idx >= 0; Idx--) {
          Cislo += Krat * (int)(Bafr[Idx] - '0');
          Krat *= 10;
        }
        // Promenna Cislo nyni obsahuje binarni ciselnou hodnotu
        // prevedenou z textoveho bafru

        // nyni nastavime promennou Idx na 0
        // takze dalsi plneni bafru zacina zase od pocatku
        Idx = 0;

        // Nyni muzeme dale pracovat s promennou Cislo,
        // ve ktere mame hodnotu vlozeneho cisla
        //
        // ...

      }
    }
  }

}

Re: Arduino vstup z klávesnice a uložení hodnoty

Napsal: pát 15.05.2015 15:26
od error414
Dá se pro převod char[4] na číslo použít sloučení char na String. A pak má třída String metodu toInt. To by nešlo použít? Btw: to nulováni Idx je zbytečné, pokud to ale nemá jako školní projekt tak je to jedno.

Re: Arduino vstup z klávesnice a uložení hodnoty

Napsal: pát 15.05.2015 16:09
od Drondys
error414 píše:Dá se pro převod char[4] na číslo použít sloučení char na String. A pak má třída String metodu toInt. To by nešlo použít?

Použít by to samozřejmě šlo. String zabírá zbytečně víc místa z hlediska spotřeby paměti je za tím pak ukryto v reálu víc místa než co spotřebuje ten kód převodu. Dle mého názoru tam kvůli tomu jednomu případu převodu není potřeba zbytečně cpát String. Snažil jsem se to napsat tak, aby se to obešlo i bez Stringu.

error414 píše:Btw: to nulováni Idx je zbytečné

Pokud tím máš na mysli to nulování Idx po převodu na číslo tak to by se pak samozřejmě muselo napsat trochu jinak, protože tak jak je to napsané to tam potřeba je jelikož v cyklu for při převodu čísla se využívá právě Idx a na konci zůstane Idx nastaven na hodnotu -1. Pokud by se to nevynulovalo na 0 tak by to pak následně při zápisu do brafu na řádku "Bafr[Idx++] = customKey;" hráblo do paměti mimo bafr a mohlo by to mít následně neočekávané následky. Samozřejmě, že by to šlo napsat i jinak, ale to je věc jak to kdo napíše a je tedy celkem zbytečné se tady dohadovat o maličkostech. V C/C++ píšu profesionálně přes 20 let a jsem holt zvyklý používat určité způsoby a techniky psaní. To co jsem použil jsem i otestoval a je to pro daný účel postačující a funkční.

error414 píše:pokud to ale nemá jako školní projekt tak je to jedno.

I u školního projektu by kantor dle mého názoru preferoval vlastní řešení převodu čísla před použitím Stringu.

Re: Arduino vstup z klávesnice a uložení hodnoty

Napsal: pát 15.05.2015 16:48
od error414
nemusis se rozcilovat :D ja hold jdu cestou mensiho odporu v C nepisu.

Re: Arduino vstup z klávesnice a uložení hodnoty

Napsal: ned 17.05.2015 19:55
od vlkodlak
...děkuji, kód (Drondys) jsem opravdu nečekal. Jdu testovat a hrát si dál.