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);
}