Ten post chciałbym poświęcić na przygotowanie programu obsługującego klawiaturę membranową w formacie 4x4, która posiada 16 klawiszy. Jej wygląd przedstawiłem poniżej na rysunku 1.
Rys. 1. Klawiatura matrycowa [elektroda.pl]
Poniżej przedstawię programy, które zostały oparte o bibliotekę Keypad.
Jeśli chodzi o podłączenie to wiersze są podpięte do pinów 2, 3, 4, 5 natomiast kolumny do pinów 6, 7, 8, 9.
Sama obsługa jest w zasadzie dosyć prosta, skanuje się kolumny bądź linie w poszukiwaniu stanu wysokiego. Gdy zostanie on znaleziony, przeszukiwane są znowu kolumny lub wiersze, w zależności co było pierwsze. Gdy zostanie wykryty stan wysoki to wciśnięty jest przycisk na przecięciu obu linii.
Program biblioteka Keypad
Na samym początku należy zdeklarować ilość wierszy oraz kolumn:
- #include <Keypad.h>
- const byte Wiersze = 4;
- const byte Kolumny = 4;
- byte Piny_Wiersze[Wiersze] = {2, 3, 4, 5};
- byte Piny_Kolumny[Kolumny] = {6, 7, 8, 9};
Kolejnym etapem jest odpowiednie zmapowanie klawiszy, dla przesyłania ich prze UART;
- char keys[Wiersze][Kolumny] = { {'1','2','3','A'},
- {'4','5','6','B'},
- {'7','8','9','C'},
- {'*','0','#','D'} };
Teraz kolejnym elementem jest włączenie biblioteki poprzez odpowiednie zainicjalizowanie zmiennej strukturalnej przygotowanymi danymi:
Keypad Membran_Klaw = Keypad( makeKeymap(keys), Piny_Wiersze, Piny_Kolumny, Wiersze, Kolumny );
Dalsza część programu zależy głównie od naszej wyobraźni i tego co finalnie chcemy przekazać. Ja przygotuje dwa różne programy jeden z nich będzie wyświetlał to co aktualnie zostało kliknięte. Drugi natomiast będzie oczekiwał na serię znaków zakończonych #. Jeśli będzie ona poprawna to nastąpi "odblokowanie" zamka. Czyli prosty zamek z szyfrem:
Pierwszy program jak już wspomniałem wcześniej będzie miał za zadanie wyświetlanie znaków oraz zliczania ilości wciśniętych klawiszy:
- uint16_t Licznik_Wcis = 0;
- void setup()
- {
- Serial.begin(9600); //Transmisja po uarcie
- }
- void loop()
- {
- char jaki_klawisz = Membran_Klaw.getKey();
- if (jaki_klawisz)
- {
- Licznik_Wcis++;
- Serial.println("Klawisz: ");
- Serial.println(jaki_klawisz);
- Serial.print("Wcisniecie numer: ");
- Serial.println(Licznik_Wcis);
- }
- }
Do tego programu można jeszcze dołożyć buzzer, sterowany albo bezpośrednio z nogi, lub z tranzystora. Ja podłączyłem buzzer pod pin 10, który jest sterowany sygnałem PWM. Po kliknięciu wywoływany jest na nim dźwięk. Co pozwala na dużo łatwiejszą identyfikacje czy dany klawisz został rzeczywiście wciśnięty.
- #include <Keypad.h>
- const byte Wiersze = 4;
- const byte Kolumny = 4;
- byte Piny_Wiersze[Wiersze] = {2, 3, 4, 5};
- byte Piny_Kolumny[Kolumny] = {6, 7, 8, 9};
- char keys[Wiersze][Kolumny] = { {'1','2','3','A'},
- {'4','5','6','B'},
- {'7','8','9','C'},
- {'*','0','#','D'} };
- Keypad Membran_Klaw = Keypad( makeKeymap(keys), Piny_Wiersze, Piny_Kolumny, Wiersze, Kolumny );
- uint16_t Licznik_Wcis = 0;
- void setup()
- {
- Serial.begin(9600); //Transmisja po uarcie
- pinMode(10, OUTPUT); //10 jako wyjście do generowania PWM
- }
- void loop()
- {
- char jaki_klawisz = Membran_Klaw.getKey();
- if (jaki_klawisz)
- {
- analogWrite(10, 184);
- delay(200);
- analogWrite(10, 0);
- Licznik_Wcis++;
- Serial.print(jaki_klawisz);
- Serial.print(" ");
- Serial.print("Wcisniecie numer: ");
- Serial.println(Licznik_Wcis);
- }
- }
Program numer dwa ma część główną niezmienną, Poniżej przedstawię część z funkcją setup oraz pętlą loop wraz z odpowiednio przygotowaną funkcją sprawdzającą wynik:
W tym programie wpisywanie należy rozpocząć od przyciśnięcia klawisza #. Następnie podawany jest kod składający się z czterech cyfr pomieszanych ze znakami (kod: 83C1). Po jego wpisaniu odpowiednio zdefiniowana akcja zostaje wywołana. W moim przypadku będzie to wyświetlanie napisu Otwarte oraz pojedyncze pipnięcie buzzera.
- #include <Keypad.h>
- const byte Wiersze = 4;
- const byte Kolumny = 4;
- byte Piny_Wiersze[Wiersze] = {2, 3, 4, 5};
- byte Piny_Kolumny[Kolumny] = {6, 7, 8, 9};
- char keys[Wiersze][Kolumny] = { {'1','2','3','A'},
- {'4','5','6','B'},
- {'7','8','9','C'},
- {'*','0','#','D'} };
- Keypad Membran_Klaw = Keypad( makeKeymap(keys), Piny_Wiersze, Piny_Kolumny, Wiersze, Kolumny );
- uint16_t Licznik_Wcis = 0;
- uint8_t Licznik_do_kodu = 0;
- uint8_t Zle_Wcisniecia = 0;
- const char Pin1 = '8';
- const char Pin2 = '3';
- const char Pin3 = 'C';
- const char Pin4 = '1';
- void setup()
- {
- Serial.begin(9600); //Transmisja po uarcie
- pinMode(10, OUTPUT); //10 jako wyjście do generowania PWM
- }
- void loop()
- {
- char jaki_klawisz = Membran_Klaw.getKey();
- if (jaki_klawisz)
- {
- if(Licznik_do_kodu == 0 && jaki_klawisz == '#')
- {
- Serial.println(Licznik_do_kodu);
- Licznik_do_kodu++;
- }
- else if(Licznik_do_kodu == 1 && jaki_klawisz == Pin1)
- {
- Serial.println(Licznik_do_kodu);
- Licznik_do_kodu++;
- }
- else if(Licznik_do_kodu == 2 && jaki_klawisz == Pin2)
- {
- Serial.println(Licznik_do_kodu);
- Licznik_do_kodu++;
- }
- else if(Licznik_do_kodu == 3 && jaki_klawisz == Pin3)
- {
- Serial.println(Licznik_do_kodu);
- Licznik_do_kodu++;
- }
- else if(Licznik_do_kodu == 4 && jaki_klawisz == Pin4)
- {
- Serial.println(Licznik_do_kodu);
- Licznik_do_kodu++;
- if(Licznik_do_kodu == 5)
- {
- Serial.println("Kod Poprawny");
- analogWrite(10, 150);
- delay(200);
- analogWrite(10, 0);
- }
- }
- else
- {
- Licznik_do_kodu = 0;
- Zle_Wcisniecia++;
- analogWrite(10, 200);
- delay(200);
- analogWrite(10, 0);
- if(Zle_Wcisniecia == 2)
- {
- Serial.println("Zly kod ALARM!");
- analogWrite(10, 100);
- delay(5000);
- analogWrite(10, 0);
- }
- }
- }
- }