Stránka 1 z 3
Matrix key 4x4, dlouhé řetězce
Napsal: 28 led 2020, 18:33
od Axamith
Používám membránovou klávesnici 4x4 znaky.
Následující kód mi vrací podle definice pole znaky klávesnice a číslo znaku dle ASCII.
Nepodařilo se mi uložit do proměnné řetězec o více znacích. např. číslo 459. Vím, že bych to měl řešit přes pole, ale nenašel jsem žádný funkční ukázkový kód a vlastním kódováním jsem se nikam neposunul. Má někdo zkušenost nebo nápad?
Kód: Vybrat vše
#include <Keypad.h
byte Dec;
const byte ROWS = 4; //řádky
const byte COLS = 4; // sloupce
char hexaKeys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {12, 11, 10, 9}; //řádky
byte colPins[COLS] = {8, 7, 6, 5}; // sloupce
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
void setup(){
Serial.begin(9600);
}
void loop(){
char customKey = customKeypad.getKey();
if (customKey){
byte Dec = (customKey);
Serial.print("Dec: ");
Serial.print(Dec);
Serial.print(" ");
Serial.print("Char: ");
Serial.println(customKey);
}
}
Re: Matrix key 4x4, dlouhé řetězce
Napsal: 28 led 2020, 19:12
od pavel1tu
Nevím na co to máš, pokud na heslo - koukni na knihovnu password.h - je super
Pokud chceš jen snímat znaky a zapisovat do pole
snímal bych znak po znaku
posouval bych to v poli po stisknutá klávesy
char customKey = customKeypad.getKey(); // sejme znak
if (customKey) {
novyznak = customKey; // tady máš znak v "customKey" + bych se v poli posunul o jednu v poli a zapsal to tam
můžeš detekovat "*" a "#" - jeden může být reset, druhý enter, jako že je konec zadávání
nemám jak vyzkoušet, škoda
Re: Matrix key 4x4, dlouhé řetězce
Napsal: 28 led 2020, 19:20
od Axamith
Díky Pavle za nakopnutí, zkusím. Mám to zadávání teplot a časů do "míchačky s ohřevem".
Re: Matrix key 4x4, dlouhé řetězce
Napsal: 28 led 2020, 19:30
od kiRRow
nad tímhle jsem uvažoval nedávno .... 4x4 klávesnicí chci zadávat hodnotu a pak ji uložit po stisku # ... ještě jsem to nerealizoval ... ale myšlenka byla taková, že si vymezím int=0 na ukladání čísla ... příjde první znak (1), uložím si ho a zaznamenám si, že přijímám data a nejsem ještě hotov .... příjde druhý znak (3) ... uloženou hodnotu prvního znaku vynasobím x10 a k výsledku přičtu druhý znak a uložím (1*10+3 = 13)... příjde třetí znak (9) ... uložené první dva znaky vynásobím x10 a přičtu znak (13*10+9 = 139)...... a buď vymezím počet znaků, který očekávám, nebo si nechám potvrdit řetězec znaků třeba křížkem ..... a pak zpracuji
Re: Matrix key 4x4, dlouhé řetězce
Napsal: 28 led 2020, 20:10
od pavel1tu
Axamith píše: ↑28 led 2020, 19:20
Díky Pavle za nakopnutí, zkusím. Mám to zadávání teplot a časů do "míchačky s ohřevem".
No, já to lámal u vstupního modulu na alarm,
ale když jsem přidal možnost změnu hesla, padlo to na tom, že každý chtěl jinou délku.
Tak jsem použil tu knihovmu password.h, bohužel původní kod se neuchoval.
ale něco uvízlo ?
Kód: Vybrat vše
int zadanateplota[8];
char customKey = customKeypad.getKey();;
if (customKeypad)
{
Serial.print(customKeypad);
count++;
zadanateplota[count] = customKeypad;
musiš pak ještě ošetřit konec zadávání (já měl #), start zadávání , max. počet znaků atd.
na rozhodování mám
Kód: Vybrat vše
if (customKeypad)
{
Serial.print(customKeypad);
switch (customKeypad)
{
case '#': ............. break;
case '*': ............... break;
default:
count++;
zadanateplota[count] = customKeypad;
break;
atd....
Re: Matrix key 4x4, dlouhé řetězce
Napsal: 29 led 2020, 06:20
od Axamith
Vyzkouším to asi až v pátek, dnes budu na cestách.
U mě bude nejspíše pevně daný počet znaků, samozřejmě s chybovou logikou. Takže teplota bude na 2 čísla, od 50°c do 65°C.
U času je potřeba ošetřit, aby vstupní hodnota nebyla 12 hod. 92 minut

Re: Matrix key 4x4, dlouhé řetězce
Napsal: 29 led 2020, 07:06
od pavel1tu
No, já bych šel stylem "digitálky" - 4 tlačítka z toho 2 na +/-, jedno ENTER a jedno CANCEL
Ale záleží jak často se to přenastavuje - klávesnice je profesionálnější a rychlejší
Pokud se ti to podaří dát do funkcí, mám zájem - abych okoukal nějaký kod zase

Re: Matrix key 4x4, dlouhé řetězce
Napsal: 30 led 2020, 19:36
od Axamith
Tak jsem na chvíli sedl a zarazil jsem se na plnění dat do pole. Přiznám se, s polem moc zkušeností nemám a co jsem načetl mi nedalo odpověď.
Příkaz:
Kód: Vybrat vše
char znakyKey[count] = {(customKey)};
by měl (?) do pole plnit data.
cout je počet znaků v poli. Zatím jsem v kódu neřešil omezení počtu znaků a konec zadávání.
customKey vkládá proměnné načtené z klávesnice. Ale vloží pouze aktuální stisknutou klávesu, a následně přepíše znakem dalšího stisku. Takže stisky 1 a 2 dají samostatně čísla 1 a 2.
Přikládám surový kód a náhled výsledků.
Kód: Vybrat vše
#include <Keypad.h>
char key; // uložení dat z klávesnice
byte Num = 5; // počet cislic v poli znakyKey
int count; //pocitani cycklu
const byte ROWS = 4; //řádky
const byte COLS = 4; // sloupce
char hexaKeys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {12, 11, 10, 9}; //řádky
byte colPins[COLS] = {8, 7, 6, 5}; // sloupce
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
void setup(){
Serial.begin(9600);
count = 1; // nastavení počítání
char znakyKey[Num];
}
void Keypad(){ //čtení z klávesnice
char customKey = customKeypad.getKey();
if (customKey){
Serial.print("customKey: ");
Serial.print(customKey);
Serial.print(" ");
count++;
char znakyKey[count] = {(customKey)};
Serial.print("znakyKey: ");
Serial.println(znakyKey);
}
}
void loop(){
Keypad();
}
Re: Matrix key 4x4, dlouhé řetězce
Napsal: 30 led 2020, 21:43
od KamilV
Ty si nějak divoce posouváš "ukazatel" count.
Předně je potřeba mít na paměti, jak je pole indexováno. Pokud deklaruješ
vytvoří se tě pole o kapacitě pěti "slotů", kam si můžeš char uložit. Ale indexy budou 0 až 4.
Takže první znak budeš ukládat do znakyKey[0], druhý do znakyKey[1] a poslední do znakyKey[4].
Proto je zvláštní, že v setup() si nastavuješ count = 1; tím úplně zahodíš první "slot" pole.
Následně v Keypad() ještě než do pole zapíšeš, inkrementuješ count++, takže Tvůj první zápis jde do znakyKey[2].
Zkus si dát:
Kód: Vybrat vše
void setup(){
Serial.begin(9600);
count = 0; // nastavení počítání
char znakyKey[Num];
}
void Keypad(){ //čtení z klávesnice
char customKey = customKeypad.getKey();
if (customKey){
Serial.print("customKey: ");
Serial.print(customKey);
Serial.print(" ");
char znakyKey[count] = {(customKey)};
count++;
if (count > 4) {
count = 0;
}
Serial.print("znakyKey: ");
Serial.println(znakyKey);
}
}
Re: Matrix key 4x4, dlouhé řetězce
Napsal: 31 led 2020, 16:04
od kiRRow
Já bych asi šel metodou přičítání do proměnné.Ale já jsem hodně omezený dostupnou operační pamětí v projektu, kde tu klávesnici mám. Zamapatuji si kolikátý znak přichází. První znak bude s číslem 0. Jen tak nastřelím princip ...
Kód: Vybrat vše
int prichoziZnak;
int pocetZnaku;
int vysledneCislo;
if(prichaziNovyZnak){ // přichází nový znak z klávesnice
if(pocetZnaku == 0){ // jedná se o první znak ??
vysledneCislo = prichoziZnak; // je to první znak, vynuluji vysledneCislo tím, že do něj uložím ten znak
} else {
vysledneCislo = (vysledneCislo * 10) + prichoziZnak; // je to následující znak, předchozí číslo vynásobím 10ti (tím se posune celé do leva) a přičtu znak
}
}
Zmáčkneš 2,5,6,7
Nejprve se uloží 2 a tím se i vyprázdní to co tam bylo minule
2 * 10 + 5 = 25
25 * 10 + 6 = 256
256 * 10 + 7 = 2567