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

Dneska se procesory objevují všude, pokud máte nějaký nápad, či udělát, tak se neváhejte pochlubit.
Odpovědět
Zpráva
Autor
Uživatelský avatar
vlkodlak
Příspěvky: 293
Registrován: čtv 09.02.2012 13:37
Bydliště: Louny
Kontaktovat uživatele:

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

#1 Příspěvek 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 ?
RadiomasterTX16S, V 911, V 939, V912, Eachine E160
Uživatelský avatar
Aragor
Příspěvky: 176
Registrován: stř 30.03.2011 0:00
Bydliště: Havířov
Kontaktovat uživatele:

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

#2 Příspěvek 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, ...
Taranis SE, Optic 6 Assan, Toro900, MAXI SWIFT, FW-190, PZ BF-109
Uživatelský avatar
Drondys
Příspěvky: 11876
Registrován: pon 22.02.2010 0:00
Bydliště: ČR

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

#3 Příspěvek 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
        //
        // ...

      }
    }
  }

}
Uživatelský avatar
error414
Příspěvky: 2522
Registrován: čtv 01.04.2010 0:00
Bydliště: Brno
Kontaktovat uživatele:

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

#4 Příspěvek 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.
Logo 600 + spirit
Uživatelský avatar
Drondys
Příspěvky: 11876
Registrován: pon 22.02.2010 0:00
Bydliště: ČR

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

#5 Příspěvek 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.
Uživatelský avatar
error414
Příspěvky: 2522
Registrován: čtv 01.04.2010 0:00
Bydliště: Brno
Kontaktovat uživatele:

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

#6 Příspěvek od error414 »

nemusis se rozcilovat :D ja hold jdu cestou mensiho odporu v C nepisu.
Logo 600 + spirit
Uživatelský avatar
vlkodlak
Příspěvky: 293
Registrován: čtv 09.02.2012 13:37
Bydliště: Louny
Kontaktovat uživatele:

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

#7 Příspěvek od vlkodlak »

...děkuji, kód (Drondys) jsem opravdu nečekal. Jdu testovat a hrát si dál.
RadiomasterTX16S, V 911, V 939, V912, Eachine E160
Odpovědět

Zpět na „Procesory a jiné vychytávky“