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 ?
Arduino vstup z klávesnice a uložení hodnoty
Arduino vstup z klávesnice a uložení hodnoty
RadiomasterTX16S, V 911, V 939, V912, Eachine E160
Re: Arduino vstup z klávesnice a uložení hodnoty
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
Re: Arduino vstup z klávesnice a uložení hodnoty
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
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
Re: Arduino vstup z klávesnice a uložení hodnoty
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
nemusis se rozcilovat
ja hold jdu cestou mensiho odporu v C nepisu.
Logo 600 + spirit
Re: Arduino vstup z klávesnice a uložení hodnoty
...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