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

&nbsp;

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

Dodaj komentarz

Twój adres email nie zostanie opublikowany.