Displays
Serielles LCD-Display (Sparkfun)
- Details
- Hauptkategorie: Arduino
- Zuletzt aktualisiert am Freitag, 15. Juni 2012 08:07
Hardware
Sparkfun bietet ein seriell ansteuerbares LCD-Display an (16x2 und 20x4). Das ist bei Projekten sinnvoll, bei denen man wenig Arduino-Ports zur Verfügung hat. Im Prinzip wird nur der TxD-Pin des Arduino benötigt. Sollte die serielle Schnittstelle bereits belegt sein, kann man einen beliebigen Port verwenden, wenn man die NewSoftSerial Library verwendet.
Ich bin nach meinen Tests nicht restlos vom Display überzeugt. Positiv fällt auf:
- Platine mit geringer Bauhöhe, passt auch in kleine Gehäuse
- Nur ein Daten-Pin des Arduino benötigt, es bleiben viele Ports frei
- Preisgünstig
Negativ fiel auf:
- Die Helligkeit ist nicht sehr hoch und kann nicht eingestellt werden. Der Kontrast ist einstellbar und ausreichen.
- Das Display hängt sich beim Laden eines Sketches manchmal auf und muss kurz von der Stromversorgung getrennt werden.
- Zwei Character sind nicht nutzbar, weil sie als Steuerzeichen benötigt werden
- Ich fand keinen Befehl, wie ich mir eigene Character in den Controller laden kann
- Es gibt keine Buttons auf dem Display, man kann also nur anzeigen
Wünschenswert wäre ein Display, dass diese Nachteile aufhebt. Ich werde als eines meiner nächsten Projekte einen Arduino für die Displaysteuerung opfern und eine kleine Zusatzplatine entwerfen.
![]() |
Dies ist das neue Display der Version 2.5, bei welcher der Microcontroller bereits auf der LCD-Platine integriert ist. Der große Vorteil ist, dass man nur einen Digital Port des Arduino belegt (TxD). Nachteil: Sparkfuns Display hat keine Taster zur Bedienung des Programms, wie es z.B. DFRobot's LCD Shield aufweist. |
![]() |
Auf der Lötseite ist der Microcontroller mit Quarz zu erkennen. Ein dreipoliger Stecker (Gnd, +5V, RxD) dient zum Anschluß an den Arduino. Das Display kann also nur programmiert und nicht abgefragt werden. Die Standardeinstellung ist 9600Bd, 8 Bit, No Parity. Die Schnittstelle kann auf höhere Geschwindigkeiten umprogrammiert werden. Neben dem Controller ist ein Miniaturtrimmer zu erkennen, mit dem der Kontrats des LCD nachgestellt werden kann. Die Helligkeit der Hintergrundbeleuchtung ist leider nicht besonders hoch. Man kann sie auch nicht höher einstellen. Die programmierbaren Helligkeitsstufen schaffen auch keine Abhilfe. |
Dieses Display ist für 17-20 € bei chinesischen Händlern im Internet erhältlich (Ebay).
Libraries
In den Foren finden sich Hinweise darauf, dass es zu Fehlfunktionen des seriellen LCD beim Booten bei Verwendung der Hardware-Schnittstelle des UNO kommt. Der Bootloader sendet anscheinend Zeichen über das serielle Hardware-Interface, welche vom Sparkfun LCD falsch interpretiert werden. Ausweg: Man schließt das LCD an einen beliebigen Port an und verwendet die Library NewSoftSerial (Link) von Mikal Hart. Des weiteren benötigt man die Library SerLCD von Steven Cogswell (Link). Auf dessen Website finden sich auch Hinweise zur Implementierung.
![]() |
Steven Cogswells Beispielprogramm zu seiner Library lief zuerst anscheinend nicht. Nach dem Hochladen des Sketches auf den Arduino waren oft nur ein paar wirre Zeichen zu sehen. Reset am UNO half nicht, man musste das LCD von der Stromversorgung trennen. Das passiert nur beim Laden, nicht im Normalbetrieb mit Ein- und Ausschalten. |
- Ein weiteres Beispiel für die serielle Hardware-Schnittsttelle: http://www.arduino.cc/playground/Learning/SparkFunSerLCD
- Anleitung von Sparkfun: http://www.sparkfun.com/tutorials/246
- Bedienhinweise und Zeichensatz: http://physicalcomputingaustria.blogspot.com/2011/02/serielles-16x2-lcd-display.html
- HD44780 Übersicht und Zeichensatz: http://de.wikipedia.org/wiki/HD44780
- HD44780-Datenblatt Sparkfun: http://www.sparkfun.com/datasheets/LCD/HD44780.pdf
![]() |
Beim Kommando theLCD.setPosition(1,12); ist der erste Parameter die Zeile (1...2 bzw. 1...4), der zweite Parameter die Spalte (0...15 bzw. 0...19). Etwas verwirrend, weil die Nummerierung einmal bei Null und andererseits bei Eins beginnt. |
![]() |
Beim Kommando SerLCD theLCD(NSS, 16, 2); wird die Instanz aus der Lib erzeugt. Parameter 1 ist der Instanzname der seriellen Schnittstelle, Parameter 2 ist die Zeichenanzahl einer Zeile, Parameter 3 die Zeilenanzahl. |
Character Map

Die rot markierten Character können nicht verwendet werden, weil Sparkfun sie zur Einleitung von Steuersequenzen vewendet:
- 124 (0x7C)
- 254 (0xFE)
![]() |
Mit dem Character Map Sketch wird der Zeichenwert in Hex ausgegeben und darunter der zugehörige Character angezeigt, im Beispiel die ASCII-Zahl Zwei. |
Sketch
Es gibt mehrere Sketche zum SparkFun-LCD:
- SerLCD_Demo.pde Demonstriert die Möglichkeiten des Displays
- SerLCD_CharSet.pde Gibt auf dem Display alle Characters aus
Mit SerLCD_CharSet kann man die Character Map des LCD prüfen. Jeder Character wird für zwei Sekunden angezeigt. Die beiden Steuerzeichen (0x7C und 0xFE) sind davon ausgenommen:
#include <NewSoftSerial.h> #include <SerLCD.h> /***************************************************************************** * Sketch: SerLCD_CharSet.pde * Author: Andreas Kriwanek * Version: 1.00 02.04.2011/21:00 * * Hardware: * Arduino UNO * Sparkfun serial LCD Display 16x2 * Use Digital Pin 11 for serial interface * * *****************************************************************************/ // RTC values: // NewSoftSerial Object on pin 11 NewSoftSerial softSER(0,11); // SerLCD object using that softSER; initializing for 16x2 LCD: SerLCD serLCD(softSER, 16, 2); char LCDChar[2]=""; //---------------------------------------------------------------------------------------------------------- // Setup and Main: void setup(void) { // Remember to start the NewSoftSerial port // before doing things with the SerLCD softSER.begin(9600); Serial.begin(9600); // This will attempt to initialize the display to // blank with the backlight on: serLCD.begin(); // Display some massively important informative text serLCD.setPosition(1,0); serLCD.print("SparkFun serLCD"); serLCD.setPosition(2,0); serLCD.print("<Character Set>"); delay(1000); } void loop(void){ // Some text at positions serLCD.clear(); for(int i=0; i<=255; i++){ if (i!=124 && i!=254){ serLCD.setPosition(1,0); serLCD.print("Value="); sprintf(LCDChar, "0x%02X", i); serLCD.print(LCDChar); serLCD.setPosition(2,0); serLCD.print("Character:"); serLCD.print(char(i)); delay(2000); } } }













