Välj en sida

Ibland vill man kunna ge mer information till användaren av sina prylar än vad man kan göra med några lysdioder. Då är en text-LCD-skärm en mycket smidig lösning. Dessa skärmar kan visa text och enkel grafik. De finns i olika storlekar och färger men de vanligaste har 2 rader med 16 tecken, eller 4 rader med 20 tecken och är blå/vita eller grön/svarta. Vissa har även inbyggd belysning så att de går att läsa även i mörker. Dessa display har normalt väldigt många anslutningar för att styra dem, men det finns mycket billiga moduler med PCF8574-chip som löds fast baktill på displayen som ger ett I²C-gränssnitt istället så att hela displayen kan styras med enbart 2 ledningar.

Kodbibliotek

I det här exemplet använder vi oss av en 16×2-teckens display med bakgrundsbelysning och med en I²C-modul, men koden går lätt att anpassa för andra skärmar. Det enda kravet är att de använder styrkretsar som är kompatibla med den mycket populära Hitachi HD44780-kretsen. Det kod-bibliotek vi använder följer inte med Arduino-miljön, men går att installera med ett par klick. Starta Arduino-programmet, gå till menyn Skiss > Inkludera bibioktek > Hantera bibliotek… Detta öppnar upp bibliotekshanteraren och här kan du söka efter biblioteket ”LiquidCrystal_PCF8574”. När du hittat det klickar du på det och väljer installera. När biblioteket laddats ner och installeras kan du stänga bibliotekshanteraren. Detta behöver du bara göra en gång på datorn, därefter finns det tillgängligt.

Kopplingen

Koppla in displayen till Arduino-kortet enligt bilden nedan.

Arduino-projekt 006 – Visa text på LCD-skärm

Beskrivning av koden

Koden innehåller inga direkt konstigheter. Först hämtar vi in kod-bibiokteket för att styra skärmen och skapar ett objekt för skärmen som håller ordning på inställningar och tillhandahåller alla funktioner som behövs, såsom skriva text, radera och styra bakgrundsbelysning. I setup() startar vi igång skärmen och gör alla nödvändiga förberedelser, såsom att rensa skärmen, slå på bakgrundsbelysning och skriva ut en första text-rad. Huvudprogrammet består av en for-loop som skapar en variabel i som sätts till 10. Sedan kör den sin kod och efteråt minskar den i med 1 (i--) och om i fortfarande är större än noll så körs koden en gång till. Detta innebär att koden i for-loopen kommer att köras 11 gånger och räkna från 10 till 0. Koden inne i for-loopen rensar varje gång andra raden på skärmen och skriver ut räknarens värde dvs variabeln i och väntar sedan en sekund. När for-loopen är färdig så rensar vi skärmen helt och skriver ut ett nytt meddelande. Det sista som sker är att vi startar en while-loop med ett konstant sant värde och utan kod. Detta är lite av en specialkonstruktion som gör att mikrokontrollern i princip hänger sig och kommer inte att göra något mer förrän man nollställer den med reset-knappen eller bryter strömmen till den.

Koden

// Hämta in kod-biblioteket för styrning av ASCII-displayer via I2C
#include <LiquidCrystal_PCF8574.h>

// Skapa objekt för att styra displayen
// Använd I2C-adress 0x27 (standard)
LiquidCrystal_PCF8574 skarm(0x27);

void setup() {
  // Starta skärmen och ange storlek - 16 tecken i 2 rader.
  skarm.begin(16, 2);
  // Rensa skärmen från eventuell gammal text
  skarm.clear();
  // Sätt markören längst upp till vänster
  skarm.home();
  // Aktivera skärmens bakgrundsbelysning med max ljusstyrka
  skarm.setBacklight(255);
  // Skriv text på första raden
  skarm.print("Countdown...");
}

void loop() {
  for (int i = 10; i > 0; i--) {
    // Flytta markören till början av andra raden (tecken 0, rad 1)
    skarm.setCursor(0, 1);
    // Rensa raden genom att skriva 16 mellanslag
    skarm.print("                ");
    // Flytta tillbaka markören till början av raden
    skarm.setCursor(0, 1);
    // Skriv räknarvärde
    skarm.print(i);
    // Vänta en sekund
    delay(1000);
  }
  // Rensa skärmen
  skarm.clear();
  // Sätt markören en bit in på första raden (tecken 4, rad 0)
  skarm.setCursor(4, 0);
  // Skriv ut slut-text
  skarm.print("KA-BOOM!");
  // Stoppa programmet
  while (1);
}