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 }