Arduino mit seriellem Display

Bevor es mit den Beispielen zu DCF77 weiter geht, möchte ich hier ein Beispiel mit der Ansteuerung eines seriellen Displays einschieben. Warum? Wir wollen ja schließlich nicht ständig die Experimente mit Arduino und einem Laptop gemeinsam durchführen. Der kleine AVR soll ja auch Stand alone arbeiten können, deshalb benötigt er natürlich auch eine Ausgabeeinheit. Dazu bietet sich ein LCD an. Das serielle LCD ist sicherlich ein wenig teurer, belegt dafür aber weniger Pin’s am Arduino.

Das nachfolgend beschriebene Beispiel erzeugt auf dem zweizeiligen Display eine Laufschrift. Im Fall des Beispiel-Sketches das Rufzeichen und der DOK. Hier kann aber auch ein anderer beliebiger Text eingesetzt werden.

Der  Code basiert auf einem Beispiel-Sketch von Sparkfun. Wurde aber an einigen Stellen verändert bzw. verkürzt. Bei den Funktionen wurden die Redundanten, oder nicht benötigten Funktionen weggelassen.

Das serielle Display wird über die serielle Schnittstelle mit Steuercodes angesprochen. Zur einfacheren Handhabung wurden die Steuercodes in Funktionen hinterlegt, die dann mit aussagekräftigen Namen versehen wurden. So werden die eigenen Sketches besser lesbar und verständlicher.

Der Arduino besitzt eine eigene serielle Schnittstelle, UART. Diese benutze ich nicht. Stattdessen setze ich die Bibliothek Softserial ein. Dies hat den Vorteil, dass es beim Programmieren des Arduino nicht zu Problemen mit dem Display kommt. Zudem bleibt die UART für anderen Anwendungen frei.

Hier nun der Sketch:

/*==========================================================================================
Laufschrift auf einem 2-zeiligen seriellen Display von Sparkfun
Der hier dargestellte Code basiert auf einem Beispiel-Sketch von Sparkfun
Der code wurde verändert und an einigen Stellen verkürzt, bei den Funktionen die
Redundant sind oder meinen Beispielen nicht benötigt werden.

Die Steuercodes werden in einzelnen Funktionen abgebildet,die dann aufgerufen werden können.
Es wird nicht die im Arduino implementierte serielle Schnittstelle benutzt.
Stattdessen setze ich Softseriell ein.

Es wird eine Laufschrift mitRufzeichen und DOK erzeugt.
Andere Laufschriften können in den Entsprechenden Varialblen geändert weden

Das serielle Display wird an folgende Anschlüsse angeschlossen
Display VDD -> 5V des Arduino
Display GND -> GND des Arduino
Display RX  -> IN 7 (Softseriell TX) des Arduino

To declare a new UART using SoftwareSerial, insert this line:
SoftwareSerial NAME(x,y); // RX, TX
where Name is the name of the new UART, x is the RX pin, and y is the TX pin.

"THE BEER-WARE LICENSE von Sparkfun"
As long as you retain this notice you can do whatever you want with this stuff. 
If we meet some day, and you think this stuff is worth it, you can buy me a beer.
============================================================================================*/

#include <SoftwareSerial.h>                                    // Einbinden der Softseriel Bibliothek

SoftwareSerial LCD(4,7);                                       // Name der Schnittstelle(RX, TX)
String Rufzeichen = "DL0MES";                                  // Laufschrift in Zeile 1
String DOK = "Z92";                                            // Laufschrift in Zeile 2
int Anzahl_Zeichen = 16;                                       // Anzahl Zeichen je Zeile


void setup()
{
LCD.begin(9600);                                               // Einstellen der Baudrate auf 9600 Baud (default bei den seriellen Displays)
}


void loop()
{
for(int i = 0; i < Anzahl_Zeichen+1;i++)                       // Verschieben des Textes bis leistes Zeichen in der Zeile
    {  
      clearScreen();                                           // Bevor die Texte um eine Stelle nach rechts verschoben werden Display löschen
      selectLineOne();                                         // Zeile 1 des Display auswählen
      for(int j=0; j<i; j++)                                   // Entsprechend der Stelle i den Corsor positionieren
      {
      moveCursorRightOne();
      }
      LCD.print(Rufzeichen);                                   // Text für Zeile 1 ausgeben
      
      selectLineTwo();                                         // Zeile 2 des Display auswählen
      for(int j=0; j<i; j++)                                   // Entsprechend der Stelle i den Corsor positionieren
      {
      moveCursorRightOne();
      }
      LCD.print(DOK);                                          // Text für Zeile 2 ausgeben
      delay (400);                                             // Ein wenig wartenbis bis zum nächsten verschieben (das Auge soll ja mitkommen)
    }
}



/*====================================================================================================
  Subroutinen für die Steuerung des Displays
  Diese können dann vom Hauptprogramm aufgerufen werden
=====================================================================================================*/

void clearScreen()                                             // Löscht alle Zeichen im Display (Meistbenutzte Funktion :-)
{
  LCD.write(0xFE);                                              // Befehls-Flag                                
  LCD.write(0x01);                                              // 0x01
}


void selectLineOne()                                            // Setzt den Cusor an Position 1 von Zeile 1
{ 
  LCD.write(0xFE);                                              // Befehls-Flag 
  LCD.write(128);                                               // Position
}


void selectLineTwo()                                            // Setzt den Cusor an Position 1 von Zeile 2
{ 
  LCD.write(0xFE);                                              // Befahls-Flag
  LCD.write(192);                                               // Position
}
 
 
void moveCursorRightOne()                                       // Bewegt den Cusor um eine Position nach rechts
{
  LCD.write(0xFE);                                              // Befehls-Flag
  LCD.write(20);                                                // 0x14
}


void moveCursorLeftOne()                                       // Bewegt den Cusor um eine Position nach links
{
  LCD.write(0xFE);                                             // Befehls-Flag
  LCD.write(16);                                               // 0x10
}


void turnDisplayOff()                                          // Schaltet das Display aus,die Hintergrundbeleuchtung bleibt an
{
  LCD.write(0xFE);                                             // Befehls-Flag
  LCD.write(8);                                                // 0x08
}


void turnDisplayOn()                                           // schaltet das Display wieder an
{
  LCD.write(0xFE);                                             //Befehls-Flag
  LCD.write(12);                                               // 0x0C
}


void underlineCursorOn()                                       // Cursor als Unterstrich einschalten
{
  LCD.write(0xFE);                                             // Befehls-Flag
  LCD.write(14);                                               // 0x0E
}


void underlineCursorOff()                                      // Cursor als Untestrich ausschalten
{
  LCD.write(0xFE);                                             // Befehls-Flag
  LCD.write(12);                                               // 0x0C
}


void boxCursorOn()                                             // Cursor als Block einschalten
{
  LCD.write(0xFE);                                             //Befehls-Flag
  LCD.write(13);                                               // 0x0D
}


void boxCursorOff()                                            // Cursor als Block ausschalten
{
  LCD.write(0xFE);                                             // Befehls-Flag
  LCD.write(12);                                               // 0x0C
}


void toggleSplash()                                            // Begrüßungsbildschirm umschalten                                          
{                                                              // Einschalten bei "Aus" oder Ausschalten bei "Ein"
  LCD.write(0x7C);                                             // Befehls-Flag hier mal 0x7C
  LCD.write(9);                                                // 0x09
}


void backlight(int brightness)                                 // Hintergrundbeleuchtung einschalten 
{                                                              // 128 = AUS, 157 = höchster Wert 129 bis 156 sind dann die Zwischenwerte 
  LCD.write(0x7C);                                             // Befehls-Flag hier mal 0x7C
  LCD.write(brightness);                                       // Werte zwischen 128 und 157 oder 0x80 and 0x9D
}

 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.