Bardzo śliczny przykład Ryśka chytrze poprzekręcam (mając w tym paskudny cel)
Kod:
//Wyobraźmy sobie, że "licznik" to "millis"
// specjalnie używamy "char" bo się szybko "przekręca" - liczy tylko do 255 :-)
//pamiętajmy, że używamy "unsigned char" - bo zwraca nam liczby od 0-255
//w odróżnieniu od "char", które zwróci nam znaki ascii
unsigned char licznik = 0;
void setup(){
Serial.begin(9600);
delay(500);
}
void loop(){
Serial.println(licznik);
licznik++;
delay(50);
}
Zamiana "int" na "unsigned char" ma swój ukryty cel - ale o tym w następnym odcinku
MAc
// *****************
No to następny kawałek :-)
Dla wyjaśnienia - "charami" posługujemy się wyłącznie dlatego, że są jednobajtowe, czyli dziesiętnie przyjmują wartość od 0 do 255, co pozwala nam kilkakrotnie "przewinąć licznik" w sensownym czasie.
Jeżeli dla eksperymentu do tego co mieliśmy wcześniej dołączymy wywołanie i funkcję smetra, to serialmonitor pokaże nam co się dzieje z działaniem funkcji po przewinięciu licznika.
Otóż licznik już po pierwszym przekroczeniu 255 zaczyna głupieć.
Tyle tylko, że w naszym przypadku nie ma to większego znaczenia - od czasu do czasy sprawdzi smeter trochę "gęściej" i tyle. Niewykluczone nawet, że tego nie zrobi, bo sama funkcja smetra zajmuje trochę czasu, co spowoduje "przeskoczenie" licznika millis().
Tego się nie da niestety zasymulować (chyba, że ktoś wymyśli jak) - prosty "delay()" nie pomaga, bo wstrzymuje też funkcję symulującą millis()
Podsumowując - wygląda na to, że trzeba zostawić złomka na półtora miesiąca i zobaczyć :-)
Kod:
//Wyobraźmy sobie, że "counter" to "millis"
// specjalnie używamy "char" bo się szybko "przekręca"
unsigned char licznik = 0;
unsigned char s_metr_update_time = 0;
unsigned char currentlicznik = 0;
unsigned char s_metr_update_interval=50;
void setup() {
Serial.begin(9600);
delay(500);
Serial.println("Zaczynamy...");
}
void loop() {
for (int x=0; x<1000; x++) { // parę razy przekręcić unsigned char od 0 do 255
// ******* to counter udaje millis()
licznik++; // powiększa się()
Serial.println(licznik);
// ******
show_smetr();
}
Serial.println("koniec!");
while(1); // koniec wysylania na serialport
}
void show_smetr(){
if(licznik >= s_metr_update_time){ // czy już wyświetlić?
Serial.println("Update smeter"); //albo cokolwiek innego zaleznego od czasu
s_metr_update_time = licznik + s_metr_update_interval;
}
}
Idąc dalej.
Teraz nam to nie przeszkadza, ale może się zdarzyć, że (oczywiście edukacyjnie) będzie to miało znaczenie.
Co nam zatem zostaje?
Zastanowić się jak uniknąć nieuniknionego.
Oszukać przeznaczenie. (1, 2, 3)
A może to wcale nie licznik nam się przewija?
Może sami coś przewijamy korzystając z licznika?
Miłej zabawy
MAc
mrn