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)
Kód: Vybrat vše
floor(log(vysledneCislo) / log(10) + 1)
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)kiRRow píše: ↑31 led 2020, 16:04Já 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 } }
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
	}
}
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();
}
Já právě potřebuji, aby zadání 01 byla ta 1, tedy jedna minuta
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.
Jo, to mne někdy dost "sere", ale naštěstí se to dozvíme zde.
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 1 host