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.
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).
W drugim rozwiązaniu stosowanych jest n rezystorów o takiej samej wartości rezystancji (Fig. 3).
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).
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:
#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); }