Autorzy: Marek Dądrowski, Marek Sawicki (fizyka profil ogólnooakademici)
Zaawansowanie: działa, jeszcze rozbudowywany (drobne zmiany)
Cel: nauka Arduino, nauka programowania i pracy w grupie (dwie osoby to już grupa!)
Zastosowanie: w kolejnych, większych projektach
WIELOKLIK?
A coż to takiego? Otóż studenci zafascynowani modułem przyciski oraz 3-ma LEDami postawnowili zrealizować wielostopnione sterowanie przyciskiem. Chodzi o to, aby przy użyciu tylko jednego przycisku można było wybrać różne opcje – zdecydowano, że będzie ich siedem. Czyli nie potrzebujemy aż siedmiu różnych przycisków (modułów), ale tylko ten jeden – a mimo to wybieramy jedną z siedmiu opcji. To bardzo ciekawe zagadnienie i niesamowicie użyteczne – chyba we wszystkich gadgetach elektronicznych dąży się do zmniejszenia przycisków nimi sterującymi (to ze względu na wszechobecną miniaturyzycję -weźmy taki smartwatch – ma on z 1000 różnych funkcji, ale przycisk tylko jeden albo dwa!).
Cóż to są za opcje do wyboru w naszym przypadku? Na razie to „tylko” zaświecenie konkretnymi ledami – ale w systemie binarnym, dlatego zamiast 8-LEDów mamy ich tylko 3. Ktoś tu jest fascynatem zer i jedynek
Wieloklik działa na zasadzie liczenia czasu od ostatniego kliknięcia – jeśli kliknięcie wydarzyło się niedawno (zmienna czas_klikania, np. 800 ms) to takie klikniecie zaliczamy do kontynuowania i zwiększamy jakiś licznik, będący numerem wybranej opcji (zmienna licznik). Poniżej schemat blokowy algorytmu (wykonany w programie https://www.draw.io/)
W powyższym schemacie T1 i T2 są kluczowymi zmiennymi: przechowują czas kliknięcia i ostatniego kliknięcia przycisku. Akcja DEBOUNCING to programowe wykluczenie drgania styków na przycisku, polegające na zatrzymaniu programu na chwilę (zmienna czekanie poniżej). Akcja LEDy to zaświecenie trzema ledami w kodzie binarnym zgodnie z LICZNIKIEM. Funkcja czas_ms to funkcja odczytująca aktualny czas, w Arduino to millis(). Poniżej kod relizujący ten schemat.
Kod w wersji 0.7, ciągle w rozbudowie choć działa 😉
#define przycisk 7 #define diodanr1 5 #define diodanr2 4 #define diodanr3 3 unsigned long aktualnyczas = 0; unsigned long roznicaczasu = 0; unsigned long zapamietanyczas = 0; #define czekanie 200 #define czasklikanie 800 int licznik = 0; void setup() { pinMode(przycisk, INPUT);//modul przycisku, hardware pull down pinMode(diodanr1, OUTPUT); pinMode(diodanr2, OUTPUT); pinMode(diodanr3, OUTPUT); Serial.begin(9600); bity(0); //LED-y wygaszone } void loop() { aktualnyczas = millis(); roznicaczasu = aktualnyczas - zapamietanyczas; if (digitalRead(przycisk) == HIGH) { delay(czekanie); //drgania stykow, software debouncing if (roznicaczasu < czasklikanie ) { licznik++; if (licznik >= 7) licznik = 0; Serial.println(licznik); bity(licznik); } else //za duzo czasu minelo, liczenie od zera licznik = 0; zapamietanyczas = aktualnyczas; }//czy przycisk wcisniety } //wyswietalnie "x"-a w kodzie binarnym na trzech LED-ach void bity (int x) { switch (x) { case 0 :digitalWrite(diodanr3,LOW);digitalWrite(diodanr2,LOW); digitalWrite(diodanr1,LOW); break; case 1 : digitalWrite(diodanr3, HIGH); digitalWrite(diodanr2, LOW); digitalWrite(diodanr1, LOW); break; case 2 : digitalWrite(diodanr2, HIGH); digitalWrite(diodanr3, LOW); digitalWrite(diodanr1, LOW); break; case 3 : digitalWrite(diodanr3, HIGH); digitalWrite(diodanr2, HIGH); digitalWrite(diodanr1, LOW); break; case 4 : digitalWrite(diodanr1, HIGH); digitalWrite(diodanr2, LOW); digitalWrite(diodanr3, LOW); break; case 5 : digitalWrite(diodanr1, HIGH); digitalWrite(diodanr3, HIGH); digitalWrite(diodanr2, LOW); break; case 6 : digitalWrite(diodanr1, HIGH); digitalWrite(diodanr2, HIGH); digitalWrite(diodanr3, LOW); break; case 7 : digitalWrite(diodanr1, HIGH); digitalWrite(diodanr2, HIGH); digitalWrite(diodanr3, HIGH); break; default : break; } }
Dwukliki, trzykliki itd
Rozbudowa projektu o zliczanie podwójnych kliknięć, oraz potrójnych (a skoro to wyszło, to już droga otwarta do kolejnych wiloklików). Sposób postępowania podobny jak poprzednio, choć trochę się to komplikuje… Ale udało się – filmik poniżej przedstawia działający układ, który wykrywa pojedyncze, podwójne oraz potrójne kliknięcie – wykrywa i przełącza (zapala lub gasi) odpowiednio pierwszego, drugiego lub trzeciego LED-a.