Ik ben me sinds kort weer eens wat meer gaan verdiepen in Arduino en aanverwante zaken. Hier kom in de toekomst nog op terug met een erg leuk nieuw project, maar daarover later meer.

De komende tijd wil ik wat kleine losse zaken laten zien hoe je deze gebruikt en aanstuurt. Ik maak hierbij gebruik van een NodeMcu ESP8266 board wat een ideaal en goedkoop board is voor allerlei toepassingen. Deze heb je al voor onder de 4 Euro op eBay.

Vandaag vertel ik hoe je hiermee een LCD scherm kunt aansturen. We hebben hiervoor nodig:

1 x Breadboard 400/a>
1 x
NodeMcu ESP8266 (CH340/CP2102)
1 x LCD1602 LCD module blue





Aansluiten

Het aansluiten is heel eenvoudig als je de pin-aansluitingen van je NodeMCU ESP8266 module weet:



Verbind de volgende pins (LCD – NodeMCU):
GND – GND
Vcc – Vin
SDA (Serial Data) – D2
SCL (Serial Clock) – D1



Programmeren

Voor het programmeren van de NodeMCU gebruiken we de Arduino IDE software die je hier kunt downloaden. Voordat we aan de slag gaan moeten we nog wat instellingen in de Arduino IDE veranderen. Vul bij ‘File > Preferences’ voor ‘Additional Boards Manager URLs’ de volgende waarde in:

http://arduino.esp8266.com/stable/package_esp8266com_index.json



Ga naar Open Boards Manager vanaf ‘Tools > Board’. Scroll naar beneden en selecteer ‘esp8266 by ESP8266 Community’. Kies nu ‘install’.



Ga verder naar ‘Sketch > Include Library > Manage Libraries…’ en installeer de ‘LiquidCrystal_i2C’ library van Frank de Brabander:



We zijn nu klaar om eindelijk te gaan programmeren. Om het LCD scherm aan te sturen kun je onderstaande code gebruiken. Lees vooral het commentaar zodat je hiermee zelf aan de slag kunt gaan.

//
// LCD - Small example code how to connect LCD screen to ESP8266
//
// by Henri Matthijssen (henri@matthijseninfo.nl)
//
// Connect your LCD display the next way to your ESP8266
// Display - ESP8266
//  GND - GND
//  Vcc - Vin (or any other Vcc pin)
//  SDA (Serial Data) - D2 (default declared as SDA)
//  SCL (Serial Clock) - D1 (default declared as SCL)

// Communication with I2C / TWI devices (built-in)
#include           

// Install 'LiquidCrystal_i2C' library from Frank de Brabander
// with Libraries Manager (Sketch > Include Library > Manage Libraries...'
#include 

// Constant for my LCD size, adjust to your LCD
#define LCDWIDTH 16
#define LCDHEIGHT 2

// Initialize LCD with address and dimensions (characters, lines)
// Use 0x27 for PC8574 by NXP
// Use 0x3F for PCF8574A by Ti
LiquidCrystal_I2C lcd( 0x27, LCDWIDTH, LCDHEIGHT); 

// Create your own symbols with tool on next location:
// https://maxpromer.github.io/LCD-Character-Creator

byte ArrowDown [] = {
  0x04,
  0x04,
  0x04,
  0x15,
  0x0E,
  0x04,
  0x00,
  0x1F
};

//
// setup
// Default setup() method called once by Arduino
//
void setup() 
{
  // Setup serial port for your Serial Monitor
  Serial.begin(115200);
  
  lcd.init();                    // Initialize LCD screen
  lcd.backlight();               // Turn on backlight
  lcd.createChar(0, ArrowDown);  // Define 'ArrowDown' on Memory Location 0
  
  lcd.clear();                   // Clear screen
  lcd.setCursor(4, 0);           // Position cursor on Line 1, Position 5
  lcd.write(0);                  // Write symbol from Memory Location 0
  lcd.print(" Henri");           // Write string

  delay(2000);
  
  String text = "Dit is een lange tekst om te controleren of deze scrollt op het LCD scherm."; 
  scroll_text( text, 1, 250);

  delay(2000);

  lcd.clear();
  lcd.print("Klaar");
}

//
// loop ()
// Here you find the main code which is run repeatedly
//
void loop() 
{
  ;                             // Do nothing....
}

//
// scroll_text
// Scroll given text on given row with given speed
//
void scroll_text( const String &text, int row, int speed ) 
{
  if ( (row > LCDHEIGHT) || (speed < 0) )
  {
    lcd.clear();
    lcd.print("Error");
  }
  else
  {
      int x = LCDWIDTH;
      int n = text.length() + x;
      int i = 0;
      int j = 0;
      while (n > 0) 
      {
        if (x > 0) 
        {
          x--;
        }
        lcd.setCursor(x, row);
        if (n > LCDWIDTH) 
        {
          j++;
          i = (j > LCDWIDTH) ? i + 1 : 0;
          lcd.print(text.substring(i, j));
        } 
        else 
        {
          i = i > 0 ? i + 1 : 0;
          if (n == text.length()) 
          {
            i++;
          }
          lcd.print(text.substring(i, j));
          lcd.setCursor(n - 1, row);
          lcd.print(' ');
        }
        n--;
        if (n > 0) 
        {
          delay(speed);
        }
      }
    }
}



Zoals je ziet kun je heel eenvoudig je LCD scherm aansturen wat allerlei mogelijkheden biedt. Laat jij in het commentaar eens weten waarvoor jij het LCD scherm allemaal gebruikt?