Matrix key 4x4, dlouhé řetězce

Nedaří se vám s projektem a nenašli jste vhodné místo, kde se zeptat? Napište sem.
Pravidla fóra
Tohle subfórum je určeno pro konzultaci ucelených nápadů, popřípadě řešení komplexnějších projektů, které opravdu není možné rozdělit na menší části.
Většinu problémů jde rozdělit na menší a ptát se na ně v konkrétních subfórech.
Axamith
Příspěvky: 533
Registrován: 09 srp 2017, 08:17
Reputation: 0
Kontaktovat uživatele:

Matrix key 4x4, dlouhé řetězce

Příspěvek od Axamith » 28 led 2020, 18:33

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); 
  }
}

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: Matrix key 4x4, dlouhé řetězce

Příspěvek od pavel1tu » 28 led 2020, 19:12

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
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

Axamith
Příspěvky: 533
Registrován: 09 srp 2017, 08:17
Reputation: 0
Kontaktovat uživatele:

Re: Matrix key 4x4, dlouhé řetězce

Příspěvek od Axamith » 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".

Uživatelský avatar
kiRRow
Příspěvky: 1169
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Matrix key 4x4, dlouhé řetězce

Příspěvek od kiRRow » 28 led 2020, 19:30

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

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: Matrix key 4x4, dlouhé řetězce

Příspěvek od pavel1tu » 28 led 2020, 20:10

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....

UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

Axamith
Příspěvky: 533
Registrován: 09 srp 2017, 08:17
Reputation: 0
Kontaktovat uživatele:

Re: Matrix key 4x4, dlouhé řetězce

Příspěvek od Axamith » 29 led 2020, 06:20

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 :-)

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: Matrix key 4x4, dlouhé řetězce

Příspěvek od pavel1tu » 29 led 2020, 07:06

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 ;)
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

Axamith
Příspěvky: 533
Registrován: 09 srp 2017, 08:17
Reputation: 0
Kontaktovat uživatele:

Re: Matrix key 4x4, dlouhé řetězce

Příspěvek od Axamith » 30 led 2020, 19:36

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();

}



Matrix_key.jpg

KamilV
Příspěvky: 479
Registrován: 03 dub 2018, 15:27
Reputation: 0
Bydliště: Olomouc

Re: Matrix key 4x4, dlouhé řetězce

Příspěvek od KamilV » 30 led 2020, 21:43

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š

Kód: Vybrat vše

byte Num = 5;
char znakyKey[Num];
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);
 }
}

Uživatelský avatar
kiRRow
Příspěvky: 1169
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Matrix key 4x4, dlouhé řetězce

Příspěvek od kiRRow » 31 led 2020, 16:04

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

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 9 hostů