Klawiatura AD
Mała klawiaturka 16-to przyciskowa, której wyjściem jest poziom napięcia – odpowiedni dla wciśniętego przycisku. Rozwiązanie szczególnie atrakcyjne tam gdzie mamy do dyspozycji ograniczoną ilość portów I/O (do ewentualnej obsługi np. klawiatury matrycowej), a mamy w kontrolerze przetwornik AD, który potrafi ten poziom napięcia zmierzyć.
Klawiatura wygląda tak :
Podłączenie do mojego Arduino Uno (z Shield`em LCD) :
Zasada obsługi takiej klawiatury sprowadza się do odczytu poziomu napięcia wystawianego przez przez nią na wyjściu AD. W moim przykładzie wejściem pomiarowym jest AN0.
W warunkach, w których ją testowałem (zasilanie z płytki Arduino) poszczególne progi były następujące :
(wyrażone jako poziom przetwornika z zakresu 0-1023)
- 000 – dla przycisku K0
- 301 – dla przycisku K1
- 438 – dla przycisku K2
- 518 – dla przycisku K3
- 568 – dla przycisku K4
- 605 – dla przycisku K5
- 632 – dla przycisku K6
- 653 – dla przycisku K7
- 670 – dla przycisku K8
- 684 – dla przycisku K9
- 695 – dla przycisku K10
- 704 – dla przycisku K11
- 712 – dla przycisku K12
- 719 – dla przycisku K13
- 729 – dla przycisku K14
- 731 – dla przycisku K15
Klawiatura w stanie spoczynku wystawia poziom – 736 (żaden przycisk nie wciśnięty).
Dekodowanie – który przycisk został wciśnięty – odbywa się z pewną tolerancją w 16-tu podzakresach, tak aby obejmowały progi napięć dla poszczególnych przycisków klawiatury.
Kod programu :
#include <LiquidCrystal.h> int VKLAW = A0; // przypisanie portu analogowego 0 do odczytu // napiecia z klawiatury int KODKLAW = 20; // zmienna do przechowania kodu klawisza int VHex; // w zmiennej VHex zapisujemy adczyt napiecia // na AN0 - zapisany w HEX LiquidCrystal lcd(8, 9, 4, 5, 6, 7); void setup() { lcd.begin(16,2); } void loop() { lcd.clear(); // wyczysc LCD i ustaw kursor na 0,0 pomiarV(); // zmierz napiecie identyfikacja(); // zdekoduj ktory przycisk prezentacja(); // wyswietl na LCD delay(200); } //************************************************* void pomiarV() { VHex = analogRead(VKLAW); // odczyt napiecia } //************************************************* void identyfikacja() { if (VHex < 295) { KODKLAW = 0; } else if (VHex > 295 && VHex < 400) { KODKLAW = 1; } else if (VHex > 400 && VHex < 460) { KODKLAW = 2; } else if (VHex > 460 && VHex < 530) { KODKLAW = 3; } else if (VHex > 530 && VHex < 580) { KODKLAW = 4; } else if (VHex > 580 && VHex < 615) { KODKLAW = 5; } else if (VHex > 615 && VHex < 640) { KODKLAW = 6; } else if (VHex > 640 && VHex < 665) { KODKLAW = 7; } else if (VHex > 665 && VHex < 675) { KODKLAW = 8; } else if (VHex > 675 && VHex < 688) { KODKLAW = 9; } else if (VHex > 688 && VHex < 700) { KODKLAW = 10; } else if (VHex > 700 && VHex < 708) { KODKLAW = 11; } else if (VHex > 708 && VHex < 715) { KODKLAW = 12; } else if (VHex > 715 && VHex < 722) { KODKLAW = 13; } else if (VHex > 722 && VHex < 728) { KODKLAW = 14; } else if (VHex > 728 && VHex < 733) { KODKLAW = 15; } else { KODKLAW = 20; } } //********************************************** void prezentacja() { lcd.print(VHex, DEC); lcd.print(" "); // spacja (odstep) lcd.print(KODKLAW); }