Bouw Boeiende LCD Animaties & Games met Arduino UNO
Onderdelen en Benodigdheden
| Onderdeel | Aantal |
|---|---|
| Arduino UNO | 1 |
| Alfanumeriek LCD 16x2 | 1 |
Apps en Online Services
- Arduino IDE
Over dit Project
Deze tutorial richt zich op de basisprincipes van animatie met Arduino en een 16x2 LCD. De technieken zijn toepasbaar op LCD's van andere afmetingen.
LCD Aansluitschema

Pinout (4-bit modus)
| LCD Pin | Functie | Arduino / Breadboard |
|---|---|---|
| 1: VSS | Ground | Negatieve rail (Arduino GND) |
| 2: VDD | Voeding +5V | Positieve rail (Arduino 5V) |
| 3: VO | Contrast | Wiper potentiometer (uitersten aan +/- rails) |
| 4: RS | Register Select | Arduino Pin 12 |
| 5: R/W | Read/Write | Ground (alleen schrijven) |
| 6: E | Enable | Arduino Pin 11 |
| 11: D4 | Data 4 | Arduino Pin 4 |
| 12: D5 | Data 5 | Arduino Pin 5 |
| 13: D6 | Data 6 | Arduino Pin 6 |
| 14: D7 | Data 7 | Arduino Pin 7 |
| 15: A | Backlight Anode | Positieve rail via 220Ω weerstand |
| 16: K | Backlight Cathode | Negatieve rail |
Test: Na aansluiten voeding (zonder datapins) – onderste rij moet oplichten. Zo niet: controleer soldeerwerk, bedrading, of LCD defect.
Eerste Testcode
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 4, 5, 6, 7); // rs, e, d4, d5, d6, d7
void setup() {
lcd.begin(16, 2);
lcd.setCursor(0, 1);
lcd.print("Working");
}
void loop() {}
Werkt niet? Controleer contrast (potentiometer), soldeerwerk datapins (geen kortsluitingen), en pin-nummers in code.
Code Uitleg
LiquidCrystal lcd(12,11,4,5,6,7);– Maakt LCD-object aan met interface-pinnen.lcd.begin(16,2);– Definieert schermformaat (kolommen, rijen).lcd.setCursor(0,1);– Zet cursor op kolom 0, rij 1 (tellen begint op 0).lcd.print("Tekst");– Print tekst vanaf cursorpositie.
Scrollende Tekst
Simuleert een lopende tekstband van rechts naar links:
void setup() { lcd.begin(16,2); }
void loop() {
int n = 15;
char message[] = "scrolling text!";
char* ptr = message;
while(n != -14) {
lcd.clear();
lcd.setCursor(n, 1);
if(n < 0) ptr++;
lcd.print(ptr);
n--;
delay(250);
}
}
Pointer-arithmetiek zorgt dat tekst die links verdwijnt niet meer getoond wordt. Pas delay() aan voor snelheid.
Aangepaste Karakters (Custom Characters)
LCD's kunnen 8 zelfgedefinieerde 5x8 pixel karakters opslaan:
byte dino[] = {
B01110, B01110, B01100, B01111,
B11101, B01010, B01010, B01010
};
void setup() {
lcd.createChar(0, dino); // Karakter 0 = dino
lcd.begin(16,2);
lcd.setCursor(0,1);
lcd.write(byte(0)); // Toon karakater 0
}
Karakters ontwerpen: LCD Character Creator
Animatie: Vliegende Pijlen
Drie custom karakters (punt, staart, staart) gecombineerd voor een bewegende pijl:
byte arrowhead[] = { B00001, B00011, B00111, B01111, B00111, B00011, B00001, B00000 };
byte arrowbody[] = { B00000, B00000, B00000, B11111, B11111, B00000, B00000, B00000 };
byte arrowtail[] = { B00011, B00111, B01111, B11111, B11111, B00111, B00011, B00000 };
void setup() {
lcd.createChar(0, arrowhead);
lcd.createChar(1, arrowbody);
lcd.createChar(2, arrowtail);
lcd.begin(16,2);
}
void loop() {
int n = 15;
while(n != -1) {
lcd.clear();
lcd.setCursor(0,1);
lcd.write(byte(0)); lcd.write(byte(1)); lcd.write(byte(2));
lcd.setCursor(n,1);
lcd.write(byte(0)); lcd.write(byte(1)); lcd.write(byte(2));
n--; delay(50);
}
}
LCD Game: Ontwijk de Pijlen
Doel: Een held (karakter op rij 1) ontwijkt pijlen die van rechts naar links vliegen. Druk op knop (pin 2, interrupt) om naar rij 0 te springen. Score = aantal frames uitgeleefd.
Complete Game Code
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 4, 5, 6, 7);
int level = 1; // 0 = bovenste rij, 1 = onderste rij
int score = 0;
byte arrowhead[] = { B00001, B00011, B00111, B01111, B00111, B00011, B00001, B00000 };
byte arrowbody[] = { B00000, B00000, B00000, B11111, B11111, B00000, B00000, B00000 };
byte arrowtail[] = { B00011, B00111, B01111, B11111, B11111, B00111, B00011, B00000 };
byte man[] = { B01110, B01110, B00100, B01110, B10101, B00100, B01010, B10001 };
void setup() {
lcd.createChar(0, arrowhead);
lcd.createChar(1, arrowbody);
lcd.createChar(2, arrowtail);
lcd.createChar(3, man);
lcd.begin(16, 2);
attachInterrupt(0, buttonin, CHANGE); // Pin 2 = Interrupt 0
randomSeed(analogRead(A0)); // Echte randomness via ruis op A0
}
void loop() {
int n = 15;
int rnd = random(15, 25);
while(n != -1) {
lcd.clear(); delay(10);
drawman();
lcd.setCursor(n, 1);
if(n == 1 && level == 1) { stopgame(); continue; }
lcd.write(byte(0)); lcd.write(byte(1)); lcd.write(byte(2));
lcd.setCursor(10, 0); lcd.print(score);
delay(100 - rnd);
n--; score++; if(level == 0) score--;
}
}
void drawman() { lcd.setCursor(1, level); lcd.write(byte(3)); }
void buttonin() {
if(digitalRead(2) == LOW) level = 0; else level = 1;
}
void stopgame() {
lcd.clear();
lcd.setCursor(0,0); lcd.print("Game over");
lcd.setCursor(10,0); lcd.print(score);
level = 1; score = 0; delay(3000);
}
Belangrijke Concepten
- Interrupts:
attachInterrupt(0, buttonin, CHANGE)– reageert direct op knopdruk, ongeacht waar de code is. - Echte Randomness:
randomSeed(analogRead(A0))gebruikt kwantumruis op een onverbonden analoog pin. - Game Loop: Combines animatie, collision detection, scoring en input handling.
Code Bestanden
- Animatie code: Basis animatie framework
- Game code: Complete speelbare game
Schema

Productieproces
- Bouw een Handheld Gaming Console met de Arduboy Clone
- Een slimme voltmeter bouwen met Arduino en smartphone – Eenvoudig DIY-project
- Arduino temperatuur- en vochtigheidslogger met DHT11 en Ethernet Shield
- Python 3 naar Arduino UNO: Eenvoudige Commando Besturing en LED Demo
- Bouw Real-Time Cellulaire Automaten op Arduino met 128x64 OLED Display
- Bouw een compacte FM-radio met Arduino Nano en RDA5807M
- Bouw een betrouwbare Arduino-weerstation met DHT-sensoren
- Bouw een Klassieke Arduino LCD Arcade Game met Buzzer en Joystick
- MKR1000 met DHT22: Realtime temperatuur‑ en vochtigheidsmonitoring naar Azure
- Bouw een Raspberry Pi 3 & Arduino Laptop: Stap-voor-Stap Handleiding
- Arduino Sensoren: Typen, Toepassingen en Real-World Projecten