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.