Das Programm

Auf dieser Seite möchte ich den groben Aufbau des Quellcodes der RGB-LED-Matrix beschreiben.

main.cpp

Die Hauptdatei enthält nur die notwendigen Includes und direkt alle Democodes, die durch ein switch-Statement ausgewählt werden. Außerdem kümmert sich die main-Funktion darum die aktuelle Demonummer im EEPROM des ATMega16 bei jedem Start um eins zu erhöhen und bei Erreichen von Sechs wieder auf Null zurück zu setzen. Das sieht dann so aus:

 WS2803.cpp und WS2803.h

Damit ihr seht, was das Interface für den WS2803 alles intern schon leistet, seht ihr hier mal die (fast) komplette Header-Datei. Ordentliches OOP ist das nicht, aber es wurde halt einfach drauf los programmiert. Normalerweise abstrahiert man das ganze auf verschiedene Layer:

  1. Ansteuerung des WS2803 auf Bitebene.
  2. Abstrahierung auf die Subpixel (Rot, Grün und Blau)
  3. Abstrahierung auf einzelne RGB-Pixel.
  4. Sonstige höheren Zeichenfunktionen (Kreise, Linien, Schrift)

Hier findet sich aber alles in einer Klasse. Lediglich das Auslesen der Buchstaben findet sich wiederum in einer weiteren Datei. Dazu aber später mehr.

 font.cpp und font.h

Hier befinden sich nur große Arrays, die die einzelnen Buchstaben gut gepackt im EEPROM abspeichern, wenn man den ATMega beschreibt. Außerdem gehören dazu natürlich noch zwei Helferfunktionen, die einem die 5×8-Pixel großen Buchstaben anhand ihres ASCII-Codes zurück geben. Also eigentlich keine große Hexerei.

Bluetooth.cpp und Bluetooth.h

Momentan wird diese Klasse zwar nicht benutzt, aber ich möchte sie euch natürlich nicht vorenthalten. Im Grunde funktioniert sie ganz einfach. Es wird eine asynchrone serielle Verbindung zwischen ATMega16 und dem Bluetooth-Modul hergestellt. Ab dann kann man nochmal die Baudrate oder den Gerätenamen für das Bluetooth-Gerät ändern, solange noch keine Verbindung zu einem anderen Bluetooth-Gerät aufgebaut wurde.

Steht die Verbindung ein mal, kann man einzelne Zeichen oder ganze Strings senden und empfangen. Beim Empfangen werden so lange Zeichen in den Empfangspuffer geschrieben bis ein Null-Byte kommt.

CommandReceiver.cpp und CommandReceiver.h

Diese Klasse implementiert ein einfaches Protokoll zur Kommunikation über Bluetooth. Mit einzelnen Zeichen und Ziffern kann man so entweder einzelne Pixel, Linien oder Kreise zeichnen. Außerdem besteht die Möglichkeit ein komplettes Bild auf einmal und unkomprimiert zu übertragen.

Da das Bild in  WS2803 doppelt gepuffert wird, kann es nicht passieren, dass erst ein Teil des Bildes übertragen und gleichzeitig angezeigt wird. Der Sender kann bestimmen, wann das übertragene Bild endgültig dargestellt werden soll.

Der Vorteil der Objektorientierung ist hier wieder, dass diese Klasse lediglich ein Objekt des Typs  WS2803 und  Bluetooth benötigt und dann fast autonom läuft. Die Updatemethode muss trotzdem noch extern getriggert werden. Optimal wäre es hier natürlich einen internen Interrupthandler zu nutzen.

GameOfLife.cpp und GameOfLife.h

Die Klasse  GameOfLife kann das Game of Life simulieren. Man kann das Leben einzelner Zellen manuell bestimmen oder mit der Methode void GameOfLife::step() einfach den nächsten Schritt simulieren. Dann ist es möglich den Zustand jeder Zelle wieder abzufragen, auszuwerten und zu zeichnen. Hier wird also nicht direkt auf das Interface von  WS2803  zugegriffen, sondern das muss man noch manuell machen.

Ende

Auf Wunsch erkläre ich euch einzelne Klassen oder Techniken auch gerne noch einmal zusätzlich. Schreibt dann einfach einen entsprechenden Kommentar und ich kümmere mich zeitnah darum.

Schreibe einen Kommentar

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

*