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.
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 » 31 led 2020, 16:19

Ale on tam má i A,B,C,D
Samozřejmě by to mohl počítat třeba v HEX, to už záleží na kontextu a následného využití.

A teoreticky by ani nemusel uchovávat int pocetZnaku; a mohl si ho spočítat jako:

Kód: Vybrat vše

floor(log(vysledneCislo) / log(10) + 1)
:lol: Ale asi to nijakou úsporu nepřinese, jen mě to tak napadlo...

Uživatelský avatar
kiRRow
Příspěvky: 1164
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:20

Tyhle znaky bych použil jako řídící ...

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 » 31 led 2020, 16:46

V podstatě potřebuji ukládat do proměnné pouze číselné hodnoty, předem budu znát, kolik znaků která proměnná bude mít. Pro ostatní nastavení (potvrzení, výběr ...) použiji nečíselná tlačítka. Takže navržený příklad se jeví jako dobrý způsob.

Uživatelský avatar
gilhad
Příspěvky: 786
Registrován: 07 bře 2018, 11:22
Reputation: 0

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

Příspěvek od gilhad » 01 úno 2020, 00:57

kiRRow píše:
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
	}
}
Ja bych volil spis neco jako (ono je to to same, ale nejak se mi to esteticky libi vic, ze nemusim tolik osetrovat zvlastni pripady)

Kód: Vybrat vše

int prichoziZnak;
int pocetZnaku;
int vysledneCislo; // na zacatku je to nula

if(prichaziNovyZnak){ // přichází nový znak z klávesnice

	if (novyZnak == HASH ) { // nevim, co vraci #, ale presne to
		// TADY nejak zpracuju vstup - navic vim, jak je dlouhe a kolika nulama tedy zacinalo 
		//	(pokud me to tedy zajima - pouhe 7 neni agent 007 )
		vysledneCislo=0; // uz jsem to cislo pouzil, tak ho nepotrebuju
		pocetZnaku=0;
	};
	
	if ( (novyZnak >= 0) && (novyZnak <= 9) ) { //je to cislo
		pocetZnaku++;
		if (pocetZnaku >4) { 	// CHYBA, moc dlouhe, vypisu error a zacnu znovu
			vysledneCislo=0; // zrusim nactenou hodnotu
			pocetZnaku=1; // zacinam se zadanou cifrou
		}
		vysledneCislo = (vysledneCislo * 10) + prichoziZnak; // pridam dalsi cifru
	}

}
zacinam s nulou.
zmacknu 2,5, ...
0*10 + 2 = 2
2*10 + 5 = 25
...

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 » 01 úno 2020, 08:37

Tak řekl bych, že mám ošetřené čtení jednotlivých číselných hodnot a řazení do složených čísel.
Nechal jsem se nakopnout příspěvkem https://www.arduino-forum.cz/viewtopic. ... 063#p10355. Trochu mě trápil fakt, že knihovna Keypad.h pracuje s řetězci a vrací znaky v Char, já potřebují číslo, abych s ním mohl dále pracovat. Takže jsem výsledek ukládal do proměnné typu Int, ale tím jsem nezískal zadaváné číslo z klávesnice, ale hodnotu v Dec. To znamená, že číslo 0 má hodnotu 48 až po číslo 9, které má hodnotu 57 viz. http://asciiset.com/. Toto jsem obešel konstantou (48), kterou jsem odečetl od příchozího čísla v Dec.
Vše funguje do chvíle, než zadám nulu. Takže jsem "očůral" změnou konstanty na hodnotu 47 a po zpracování jsem chybějící jedničku odečetl. Asi to není úplně košer, ale funguje to i s nulou. Pokud zadávám číslo o třech znacích a první je nula, tak zapíše následné dva znaky, což mi vyhovuje.

Kód: Vybrat vše


#include <Keypad.h>
byte Num = 3; // počet cislic v poli znakyKey
int count = 0;  //pocitani cycklu
int cisloKey; // vysledne cislo
int NewKey; // prichozi znak z klavesnice
byte konst = 47; // konstanta pro vypocet cisla z Char znaku

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 Keypad(){ //čtení z klávesnice
char customKey = customKeypad.getKey(); 
 if (customKey){
NewKey = (customKey - konst) ; //vypocet cisla z Char (0-9)

if(NewKey){ // přichází nový znak z klávesnice
  if(count ==0){ // jedná se o první znak ??
    cisloKey = NewKey - 1; // je to první znak, vynuluji vysledneCislo tím, že do něj uložím ten znak
     count++;} 
      else if (count < (Num)){
       cisloKey = ((cisloKey * 10) + NewKey)-1; // 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
        count++;} 
         else if (count = Num){ 
           cisloKey = cisloKey; // je-li dosazeno poctu pozadovanych znaku, neprovadim zadny vypocet
 } 
}

  
      Serial.print("Vysledne cislo: "); 
       Serial.println(cisloKey);   
 }
}
   
void loop(){
Keypad();
}




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

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

Příspěvek od kiRRow » 01 úno 2020, 09:11

No abych se přiznal na nulu jsem docela zapoměl :oops: ... když bych takhle zadával např minuty, tak 01 a 1 je furt jedna minuta. Ale být to třeba kód alarmu ... oops :D

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 » 01 úno 2020, 09:40

Axamith píše:
01 úno 2020, 08:37
[...] tím jsem nezískal zadaváné číslo z klávesnice, ale hodnotu v Dec. To znamená, že číslo 0 má hodnotu 48 [...]
atoi() ?

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 » 01 úno 2020, 10:25

kiRRow píše:
01 úno 2020, 09:11
No abych se přiznal na nulu jsem docela zapoměl :oops: ... když bych takhle zadával např minuty, tak 01 a 1 je furt jedna minuta. Ale být to třeba kód alarmu ... oops :D
Já právě potřebuji, aby zadání 01 byla ta 1, tedy jedna minuta :-) Nula dokáže zamotat hlavu :-)

KamilV píše:
01 úno 2020, 09:40
Axamith píše:
01 úno 2020, 08:37
[...] tím jsem nezískal zadaváné číslo z klávesnice, ale hodnotu v Dec. To znamená, že číslo 0 má hodnotu 48 [...]
atoi() ?
Příkaz atoi() jsem doposud neznal, jak jsem vyčetl, je to klasický příkaz C++. V oficiální podpoře na arduino.cc jsem nic nenašel, ale mrknu na to.

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 » 01 úno 2020, 14:42

Wiring vychází z C++ a spousta funkcí v něm funguje i když nejsou v dokumentaci :(

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 » 01 úno 2020, 15:20

KamilV píše:
01 úno 2020, 14:42
Wiring vychází z C++ a spousta funkcí v něm funguje i když nejsou v dokumentaci :(
Jo, to mne někdy dost "sere", ale naštěstí se to dozvíme zde.
Pro mne také novinka, děkuji ....
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

Odpovědět

Kdo je online

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