Moduł z LCD i przyciskami dla Arduino

Taki ciekawy shield mi się trafił:

IMG_0700Moduł 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.

IMG_0694Wystarczy nałożyć go na Arduino (tutaj: UNO R3):

IMG_0698Na samej płytce znajdziecie:

  • 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:

  1. Otwórzcie Arduino IDE
  2. 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).

  3. 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() {
    }
  4. Teraz stworzymy obiekt klasy wyświetlacza (zmienna lcd) i zainicjujemy go w funkcji setup():
    #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 i digitalWrite) 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);
}

IMG_0701Źródła

Więcej na temat biblioteki LiquidCrystal znajdziecie tutaj.
Więcej o podobnym module znajdziecie na Botlandzie.

Jedna myśl w temacie “Moduł z LCD i przyciskami dla Arduino”

Dodaj komentarz