Taki ciekawy shield mi się trafił:
Moduł wyposażono w podświetlany na niebiesko wyświetlacz 2×16 znaków oraz zestaw klawiszy.
Jego instalacja nie powinna przysporzyć Wam żadnych kłopotów.
Wystarczy nałożyć go na Arduino (tutaj: UNO R3):
- Wyświetlacz 16×2 z niebieskim podświetleniem; do regulacji kontrastu służy niebieski potencjometr w lewym-górnym rogu płytki;
- Zestaw 5 przycisków, które możecie wykorzystać np. do nawigacji po menu aplikacji (left-right, up-down, select);
- Kilka dodatkowych wyprowadzeń:
- Przycisk Reset (restart Arduino),
- Wyprowadzenia sekcji zasilania – Vin, 3V3, 5V, GND – piny trzeba wlutować samodzielnie,
- Wyprowadzenia wejść analogowych A1-A5 (A0 nie jest dostępne),
- Wyprowadzenia D13, D12, D11, D3, D2, D1, D0 – w górnym-prawym rogu (nie używane przez shielda),
- Wyprowadzenia ICSP – do programowania.
Pinologia
Do komunikacji z Arduino, shield wykorzystuje kilka pinów:
Pin Arduino | Znaczenie |
---|---|
D8 | (RESET) Pin resetu LCD |
D9 | (ENABLE) Pin uruchamiający LCD |
D4, D5, D6, D7 | Piny danych |
D10 | Włączanie (stan wysoki) lub wyłączanie (stan niski) podświetlenia wyświetlacza |
A0 | Do analogowego wejścia A0 podłączono klawisze |
Powyższe piny są zarezerwowane dla tego rozszerzenia i nie możecie ich powtórnie wykorzystać w swoich programach.
Programowanie
Zaprogramowanie tego układu nie powinno przysporzyć Wam problemów:
- Otwórzcie Arduino IDE
- Do nowego projektu dodajcie bibliotekę: LiquidCrystal (Sketch>Include Library>LiquidCrystal). W kodzie pojawi się dodatkowa instrukcja:
#include <LiquidCrystal.h> void setup() { Serial.begin(9600); } void loop(){ }
Przy okazji komendą
Serial.begin(9600);
zainicjowaliśmy transmisję szeregową z modułu (wciśnijcie kombinację klawiszy [CTRL]+[Shit]+[M] żeby zobaczyć monitor portu szeregowego). - Piny reset, enable i podświetlenia warto zadeklarować jako define:
#include <LiquidCrystal.h> //Reset pin of LCD #define RS_PIN 8 //Enable pin of LCD #define ENABLE_PIN 9 //Backlight pin #define BACKLIGHT_PIN 10 void setup() { Serial.begin(9600); } void loop() { }
- Teraz stworzymy obiekt klasy wyświetlacza (zmienna
lcd
) i zainicjujemy go w funkcjisetup()
:#include <LiquidCrystal.h> //Reset pin of LCD #define RS_PIN 8 //Enable pin of LCD #define ENABLE_PIN 9 //Backlight pin #define BACKLIGHT_PIN 10 LiquidCrystal lcd( RS_PIN, ENABLE_PIN, 4, 5, 6, 7); void setup() { Serial.begin(9600); //initialize lcd- 16 columns and 2 rows lcd.begin(16,2); //clenup display lcd.clear(); //say something lcd.print("hello, world!"); //set BACKLIGHT_PIN as output pinMode(BACKLIGHT_PIN, OUTPUT); //switch backlight on digitalWrite(BACKLIGHT_PIN, true); } void loop(){ }
Przy okazji:
lcd.begin(16,2);
: zainicjowaliśmy wyświetlacz określając, że ma 16 kolumn w dwóch rzędach,lcd.clear();
: wyczyść wyświetlacz,lcd.print("hello, world!");
: wypisz 'hello, world!’ na ekranie;
Ostatnie 2 linie funkcji
setup()
(pinMode
idigitalWrite
) ustawiają pin podświetlenia jako wyjściowy i zapalają go – co skutkuje włączeniem podświetlenia. Oczywiście linijka:
digitalWrite(BACKLIGHT_PIN, false);
wyłącza podświetlenie.
Obsługa klawiszy
Wszystkie klawisze (oprócz oczywiście Reset) podpięte są do wejścia analogowego A0. Odczytanie, który został wciśnięty, polega na sprawdzeniu poziomu sygnału na tym pinie. Każdy klawisz generuje inny poziom. Przykładowy kod, który realizuje rozpoznawanie klawiszy, może wyglądać tak:
//... void loop() { int i_key = analogRead(0); switch(i_key){ case 720: Serial.println("SELECT pressed"); break; case 479: case 480: Serial.println("LEFT pressed"); break; case 0: Serial.println("RIGHT pressed"); break; case 131: Serial.println("UP pressed"); break; case 307: Serial.println("DOWN pressed"); break; } delay(100); }
Na moim shieldzie, klawisz LEFT generował raz wartość 479 a innym razem 480 – stąd podwójny case.
A oto kompletny listing przykładowej aplikacji:
#include <LiquidCrystal.h> //Reset pin of LCD #define RS_PIN 8 //Enable pin of LCD #define ENABLE_PIN 9 //Backlight pin #define BACKLIGHT_PIN 10 LiquidCrystal lcd( RS_PIN, ENABLE_PIN, 4, 5, 6, 7); bool b_backlightOn = false; void setup() { Serial.begin(9600); Serial.println("---------------"); //initialize lcd - 16 columns and 2 rows lcd.begin(16,2); //clenup display lcd.clear(); //say something lcd.print("hello, world!"); //set BACKLIGHT_PIN as output pinMode(BACKLIGHT_PIN, OUTPUT); //switch backlight on digitalWrite(BACKLIGHT_PIN, true); } void loop() { int i_key = analogRead(0); switch(i_key){ case 720: Serial.println("SELECT pressed"); break; case 479: case 480: Serial.println("LEFT pressed"); break; case 0: Serial.println("RIGHT pressed"); break; case 131: Serial.println("UP pressed"); break; case 307: Serial.println("DOWN pressed"); break; } delay(100); }
Źródła
Więcej na temat biblioteki LiquidCrystal znajdziecie tutaj.
Więcej o podobnym module znajdziecie na Botlandzie.
……..
if (i_key< 100){
//Right
} else if (i_key < 200){
//Up
} else if (i_key< 400){
//Down
} else if (i_key < 600){
//Left}
} else if (I_key < 800){
//Select
}
….
Tak nie będzie loterii