Obsługa przycisków za pomocą wejścia analogowego


Tomasz Bartuś



2016-09-22
Obsługa przycisków za pomocą wejścia analogowego

Wstęp

Na podstawie tutoriala Johna Boxall'a p.t.: "Using analog input for multiple buttons".

Idea podłączenia większej liczby przycisków z Arduino za pomocą pinu wejścia analogowego wynika z chęci oszczędzenia wejść cyfrowych, które mogą zostać wykorzystane w układach w bardziej produktywny sposób. W rozwiązaniu, które zostanie przedstawoione, wiele przycisków może być podłączonych do jednego pinu analogowego. Rozpoznanie, z jakim rodzajem akcji mamy w danej chwili do czynienia odbywa się w oparciu o interpretację wartości napięcia przekazywanego w momencie naciśnięcia przycisku z dzielników napięcia.

Układ obsługi przycisków za pomocą wejścia analogowego
Fig. 1. Układ obsługi przycisków za pomocą wejścia analogowego

Istnieją dwa rozwiązania tematu sterowania przyciskami układów. Oba wykorzystują ideę pomiarów spadków napięć powstających w dzielnikach napięcia utworzonych na tzw. "drabinkach rezystorowych". W pierwszym rozwiązaniu, dla sterowania n przyciskami wykorzystuje się n rezystorów o różnych wartościach rezystancji (Fig. 2).

Moduł prezycisków wykorzystujący drabinkę rezystorów o różnych wartościach rezystancji
Fig. 2. Moduł prezycisków wykorzystujący drabinkę rezystorów o różnych wartościach rezystancji

W drugim rozwiązaniu stosowanych jest n rezystorów o takiej samej wartości rezystancji (Fig. 3).

Moduł prezycisków wykorzystujący drabinkę rezystorów o identycznych wartościach rezystancji
Fig. 3. Moduł prezycisków wykorzystujący drabinkę rezystorów o identycznych wartościach rezystancji

Działanie układów, w obu przypadkach opiera się o wykorzystanie funkcji analogRead() i interpretację wyników za pomocą jakiejś instrukcji warunkowej. W układzie z Fig. 1. zastosowano rozwiązanie oparte o jednakowej rezystory o rezystancji 100 Ω (Fig. 3).

Lista części

  1. platforma prototypowa Arduino (tu Leonardo),
  2. Konwerter I2C LCM1602,
  3. przyciski montażowe (5 szt.),
  4. rezystory 100 Ω (5 szt.),
  5. dioda LED,
  6. rezystor 150-200 Ω (1 szt.),
  7. płytka prototypowa,
  8. mostki/przewody

Dodatkowo w układzie zaimplementowano funkcje: sygnalizacji naciśnięcia przycisku poprzez zaświecenie diody LED oraz wyłączania podświetlenia LCD po upływie czasu 2500ms od momentu naciśnięcia dowolnego przycisku.

Zastosowanie w drabince rezystorów oporników o rezystancji 100Ω powoduje, że na wejściu analogowym (w tym przypadku A5) rejestrowane są następujące wartości napięcia:

  1. 1-szy rezystor - ok. 90,
  2. 2-gi rezystor - ok. 530,
  3. 3-ci rezystor - ok. 690,
  4. 4-ty rezystor - ok. 770,
  5. 5-ty rezystor - ok. 820.

Kod:

#include <Wire.h>                // Dołączenie biblioteki Wire
#include <LiquidCrystal_I2C.h>   // Dołączenie biblioteki I2C dla LCD
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Ustawienie adresu ukladu na 0x27

int a = 0;
unsigned long czas;              // Zmienna mierząca czas po naciśnięciu przycisku

void setup()  
{
  lcd.begin(16, 2);              // Inicjalizacja LCD 2x16
  pinMode(A5, INPUT_PULLUP);     // Pin analogowy przycisków
  lcd.noBacklight();             // Wyłączenie podświetlenia LCD
  pinMode(8, OUTPUT);            // Pin cyfrowy LED sygnalzujący naciśnięcie przycisku
  digitalWrite(8, LOW); 
}

void loop() 
{
  a = analogRead(5);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("analogRead()");
  lcd.setCursor(0,1);
  lcd.print("wartosc: ");
  lcd.print(a);

  if (a < 900){                  // Zdarzenie polegające na naciśnięciu dowolnego przycisku
    digitalWrite(8, HIGH);
    czas = millis();             // zaczynamy zliczać czas
  } else{
    digitalWrite(8, LOW);
  }
  
  if (millis() - czas <= 2500){  // zapalenie podświetlenia LCD
    lcd.backlight();
  }
  else                           // zgaszenie podświetlenia LCD
  {    
    lcd.noBacklight();           // wyłącz podświetlenie LCD
  }
    delay(250);
}

 
 

Doktorat

Spis treści
Rozdzialy
Abstrakt [pl]
Abstract [eng]