Last Updated on 15. Oktober 2026 by sfambachLink-Status: OK
Ich bin immer wieder verwundert, dass es doch ein paar Leser hier im Blog gibt. Neulich schrieb mich Siegfried an und meinte, er möchte ein paar Balken auf einem Crystal-LCD-Display darstellen, ob ich das schon mal gemacht habe. Die Antwort war Nein, das sollte sich aber bald ändern.
Fakten
Teileliste
Arduino UnoLink-Status: OK
Arduino LCD ShieldLink-Status: OK
Anwendungsbereiche
- Darstellung von Messwerten in Abhängigkeit der Zeit
- Equalizer-Visualisierung
Ansichten
Gibts am Ende 😉
Analyse
So ein LCD Display besteht aus mehreren Zeilen und Spalten. In eine Spalten- und Zeilenkombination passt immer genau ein Zeichen.

Die Pixel eines Zeichens können nicht einzeln angesprochen werden, es ist aber möglich, eigene Zeichen zu erstellen.

Somit habe ich für jeden Füllstand ein Zeichen erstellt. Das leere Zeichen habe ich weggelassen, weil bei meinem Display das gleiche wie bei C8 angezeigt wurde und da ich vorher das Display lösche, macht es keinen Unterschied.

Um beide Zeilen nutzen zu können, müssen die jeweiligen Ergebnisse zweigeteilt (für mehr Zeilen sind mehr Teilungen nötig) werden, ist die untere Zeile voll (also C8), geht es weiter mit der oberen.

Die Werte für jeden Balken halten wir in einem Array vor. Das Array wird dann direkt in die Balken umgewandelt.
Programmierung
Bibliotheken
Die Bibliothek zum Display ist bereits in der Arduino GUI enthalten.
#include <LiquidCrystal.h>
Testprogramm
Quellcode LcdBarChart.ino (GitHubLink-Status: OK)
/**
Display a bar chart on an lcd displa 2 Lines 16 Cols
GPLv3
Visit https://fambach.net if you want
*/
/******************************************************************/
// global data
#define BAR_COUNT 16 // how many bars should we display
int values[BAR_COUNT];
#define ROWS 2 // rows of display
#define COLS 16 // columns of display
#define UPPER 1000 // upper value of measurement eg 1065 hpa
#define LOWER 100 // lower value of measurement eg 650 hpa
#define CHAR_LINES 8 // lines in a character
/******************************************************************/
// LCD init
#include <LiquidCrystal.h>
#include "CustomChars.h"
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
void initDisplay() {
lcd.begin(COLS, ROWS); // start the library
lcd.setCursor(0, 0); // set the cursor to the upper left corner
lcd.print("Bar Chart"); // print a simple message
initCustomChars(lcd); // add the own chracters
digitalWrite(6, LOW); // only for my board to switch the buzzer off
delay(2000); // wait some seconds to show the text
}
void displayBars() {
lcd.clear();
// determine which is smaller the screen or the array, take the smaller one
int end = min(COLS , BAR_COUNT);
// loop over the array with values
for (int col = 0; col < end ; col ++) {
// map the measurement values to pixel lines
uint8_t value = map(values[col], LOWER, UPPER, 0, 16);
// loop over the rows of the display and set the right character
for (int row = ROWS - 1; row >= 0 ; row--) {
lcd.setCursor(col, row);
if (value == 0) {
break;
}
if ( (value - CHAR_LINES) > 0 ) {
lcd.write((byte) CHAR_LINES);
} else {
lcd.write((byte)value);
break;
}
value -= CHAR_LINES;
}
}
digitalWrite(6, LOW); // only for my board to switch the buzzer off
}
/******************************************************************/
// array functions
void initArray(boolean randValues) {
for (int i = 0; i < BAR_COUNT; i++) {
if (randValues) {
values[i] = random(LOWER, UPPER);
} else {
values[i] = LOWER;
}
}
}
void shiftArrayToTheRight() {
for (int i = BAR_COUNT - 1 ; i > 0 ; i--) {
values[i] = values[i - 1];
}
values[0] = 0;
}
/******************************************************************/
void setup() {
initArray(false);
initDisplay();
}
void loop() {
// shift array to the right
shiftArrayToTheRight();
// add new value at left
values[0] = random(LOWER, UPPER);
displayBars();
delay(4000);
}
Das Testprogramm generiert alle 4 Sekunden einen neuen zufälligen Wert. Mit jedem neuen Wert werden die Ergebnisse im Array um eins nach rechts geschoben. Ist das Array voll, wird der letzte Wert verworfen.
Und so sieht’s aus:
Probleme
Komische Fragmente in den benutzerdefinierten Zeichen
Wenn ich die Reihenfolge im Setup ändere, also die benutzerdefinierten Zeichen hinzufüge, bevor ich etwas auf dem Display ausgegeben habe, bekomme ich diese Fragmente. Ich nehme an, das Display-Init hat in der Bibliothek noch einen Fehler und erst mit der ersten Ausgabe ist es richtig initialisiert.
Sonstiges
nix …
Fazit
Nachdem die Funktion des Displays erst einmal klar war und ich wusste, dass ich über die benutzerdefinierten Zeichen gehen muss, war es fast ein Kinderspiel. Die Daten in einem Array zu organisieren, bietet eine gute Möglichkeit, sie später zu manipulieren und in Schleifen abzuarbeiten. Ich hoffe, es gefällt euch, vielen Dank an Siegfried für die Idee, solltet ihr noch Erweiterungswünsche oder Fragen haben, lasst einen Kommentar da.
Verwandte Beiträge
- Preview – Rundes1,28 zoll TFT LCD DisplayLink-Status: OK
- TFT_eSPI Display BibliothekLink-Status: OK
Quellen
https://www.arduino.cc/en/Reference/LiquidCrystalLink-Status: OK
https://de.wikipedia.org/wiki/Fl%C3%BCssigkristallanzeigeLink-Status: OK
https://maxpromer.github.io/LCD-Character-Creator/Link-Status: OK
https://www.hackster.io/jacoslabbert99/arduino-lcd-icons-custom-characters-548f38Link-Status: OK
| Datum | Änderung | Autor |
|---|---|---|
| 15.10.2026 | Beispielcode als Code-Block eingefügt (Einbettung über gist-it.appspot.com funktionierte nicht mehr) | sfambach |
| 03.10.2026 | Rechtschreibung korrigiert: Tippfehler, Kommas, Groß-/Kleinschreibung, Formulierungen Log-Liste eingefügt | sfambach |
| 25.02.2022 | Beitrag erstellt | sfambach |