Odeslat nové téma Odpovědět na téma  [ Příspěvků: 7 ] 
Autor Zpráva
PříspěvekNapsal: pát 15.05.2015 10:06 
Zkušený debatér
Zkušený debatér
Uživatelský avatar

Registrován: 9.2.2012
Příspěvky: 297
Bydliště: Louny
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


Nahoru
 Profil {RCalbum.cz}  
 
 
PříspěvekNapsal: pát 15.05.2015 11:25 
Protřelejší uživatel
Protřelejší uživatel
Uživatelský avatar

Registrován: 30.3.2011
Příspěvky: 176
Bydliště: Havířov
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


Nahoru
 Profil {RCalbum.cz}  
 
PříspěvekNapsal: pát 15.05.2015 14:33 
Mazák
Mazák
Uživatelský avatar

Registrován: 22.2.2010
Příspěvky: 11876
Bydliště: ČR
Obrázky: 1
Kód:
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
        //
        // ...

      }
    }
  }

}


Nahoru
 Profil Soukromé album  
 
PříspěvekNapsal: pát 15.05.2015 15:26 
Helimaniacs Brno
Helimaniacs Brno
Uživatelský avatar

Registrován: 1.4.2010
Příspěvky: 2524
Bydliště: Brno
Obrázky: 0
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


Nahoru
 Profil Soukromé album {RCalbum.cz}  
 
PříspěvekNapsal: pát 15.05.2015 16:09 
Mazák
Mazák
Uživatelský avatar

Registrován: 22.2.2010
Příspěvky: 11876
Bydliště: ČR
Obrázky: 1
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.


Nahoru
 Profil Soukromé album  
 
PříspěvekNapsal: pát 15.05.2015 16:48 
Helimaniacs Brno
Helimaniacs Brno
Uživatelský avatar

Registrován: 1.4.2010
Příspěvky: 2524
Bydliště: Brno
Obrázky: 0
nemusis se rozcilovat :D ja hold jdu cestou mensiho odporu v C nepisu.

_________________
Logo 600 + spirit


Nahoru
 Profil Soukromé album {RCalbum.cz}  
 
PříspěvekNapsal: ned 17.05.2015 19:55 
Zkušený debatér
Zkušený debatér
Uživatelský avatar

Registrován: 9.2.2012
Příspěvky: 297
Bydliště: Louny
...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


Nahoru
 Profil {RCalbum.cz}  
 
Zobrazit příspěvky za předchozí:  Seřadit podle  
Odeslat nové téma Odpovědět na téma  [ Příspěvků: 7 ] 

 


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 12 návštevníků


Nemůžete zakládat nová témata v tomto fóru
Nemůžete odpovídat v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete přikládat soubory v tomto fóru

Hledat:
Přejít na:  

 

  Powered by phpBB® Forum Software © phpBB Group  Český překlad – phpBB.cz 

 

NAVRCHOLU.cz