|
Stránka 1 z 1
|
[ Příspěvků: 7 ] |
|
Autor |
Zpráva |
vlkodlak
|
Napsal: pát 15.05.2015 10:06 |
|
Zkušený debatér
|
|
|
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 |
|
|
|
|
|
Aragor
|
Napsal: pát 15.05.2015 11:25 |
|
Protřelejší uživatel
|
|
|
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 |
|
|
Drondys
|
Napsal: pát 15.05.2015 14:33 |
|
Mazák
|
|
|
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 |
|
|
error414
|
Napsal: pát 15.05.2015 15:26 |
|
Helimaniacs Brno
|
|
|
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 |
|
|
Drondys
|
Napsal: pát 15.05.2015 16:09 |
|
Mazák
|
|
|
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 |
|
|
error414
|
Napsal: pát 15.05.2015 16:48 |
|
Helimaniacs Brno
|
|
|
Registrován: 1.4.2010 Příspěvky: 2524 Bydliště: Brno Obrázky: 0
|
nemusis se rozcilovat ja hold jdu cestou mensiho odporu v C nepisu.
_________________ Logo 600 + spirit
|
|
Nahoru |
|
|
vlkodlak
|
Napsal: ned 17.05.2015 19:55 |
|
Zkušený debatér
|
|
|
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 |
|
|
|
Stránka 1 z 1
|
[ 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
|
|
|