4. Elementare Dot-Funktionen
Die vier Elementaren Dot-Funktionen schalten die Flip-Dots sofort nach dem Funktionsaufruf um. Zum Betrieb der Dot-Module benötigt man eigentlich keine weiteren Funktionen. Alle Grafik- und Textfunktionen der aaFlipra.h benutzen sie intern ebenfalls.
Koordinatenursprung
Ich gestehe es hier gleich am Anfang: Ich bin "Maschinenbauer" und habe das Programmieren nur nebenbei erlernt. Aus diesen zwei Gründen beginnt meine Dotzählung nicht wie bei den Informatikern üblich bei 0, sondern bei 1!
Alle Funktionen der aaFlipra.h beziehen sich auf das Benutzerkoordinatensystem, das man in der Config vorwählen (Kapitel 2) oder durch die Systemfunktion oriSet()
(Kapitel 3) auch während des Programmablaufs jederzeit ändern kann.
Der Koordinatenursprung x=1, y=1 liegt in der linken oberen Ecke des Displays
Wertebereich für x un y
Natürlich kann man nur die vorhandenen Dots eines Dot-Moduls ansprechen. Alle Funktionen erlauben aber die Übergabe eines uint8_t, also eines vorzeichenlosen 8-Bit-Werts (0-255). Nicht darstellbare Dot-Positionen stören dabei nicht und werden ignoriert.
Schalten eines Dots
Jetzt kommen wir endlich zu den zwei wichtigsten, aber unspektakulärsten Funktionen der Libray. Diese schalten ein einzelnes Dot auf Schwarz oder auf die jeweilige Farbe. Das Dot wird dabei so lange bestromt, wie das z.B. durch die Systemfunktion setCoilFlipDuration()
(Kapitel 3) eingestellt wurde. Je kürzer die Flip-Dauer ist, um so schneller kann ein Bild auf dem Display aufgebaut werden.
Da man heutzutage meist wenig Zeit hat, wir der Flipvorgang per Timerinterrupt gestuert. Das bedeutet, die Funktion setDot()
bestromt die Spule eines Flip-Dots, startet einen Timer des Arduino und verlässt anschließend die Funktion sofort wieder. Der Programmablauf kann nach dem Einschalten des Flip-Stroms also sofort weiter ausgeführt werden - auch, um z.B. die Position des nächsten Dots zu errechnen und erneut die Funktion setDot()
aufzurufen. Ist die Funktion dabei schneller als das Dot, wird immer erst auf das Ablaufen des Timers gewartet.
// x und y abhängig vom Benutzerkoordinatensystem!
void setDot(uint8_t userPointX, uint8_t userPointY ); // Dot farbig setzen
void resetDot(uint8_t userPointX, uint8_t userPointY ); // Dot schwarz setzen
Schalten der ganzen Modulfläche
Zu Beginn eines Progamms oder zwischen zwei Grafikaufbauten kann man mit den folgenden Funktionen die ganze Dot-Fläche löschen oder komplett farbig setzen. Zur Vortäuschung eines schnelleren Aufbaus erfolgt das Setzen der Dots von der Mitte aus zu beiden Seiten hin.
Als Darstellungseffekt übergibt man der Funktion die Wartezeit flipDelayMs
zwischen 0 und 65.535 Millisekunden, welche zwischen dem Schalten der Dots abzuwarten ist (1 Millisekunde = 0,001 Sekunden).
// Wartezeit flipDelayMs zwischen 0 und 65.535 Millisekunden
void setAll(uint16_t flipDelayMs); // alle Dots farbig setzen
void resetAll(uint16_t flipDelayMs); // alle Dots schwarz setzen
Programmbeispiel
In diesem Programm werden:
- alle Systemparameter gesetzt (Kapitel 3),
- die gesamte Dotfläche gesetzt und wieder gelöscht und
- in der loop abwechselnd ein Dot gesetzt und eins gelöscht:
// **************************************************************************
// wwFlipdot-Beispiel Elementare Dot-Funktionen
// 2020-05-12
//
// c by Rainer Radow, 30171 Hannover, Germany rainer.radow.org
// **************************************************************************
#include "aaFlipra.h"
aaFlipra ww;
// ==========================================================================
void setup() {
ww.begin(); // setzt alle Parameter der Library
ww.dotPowerOn(); // schaltet die Flipspannung ein
ww.setCoilFlipDuration(500); // Flip-Dauer = 500 µs = 0,5 ms = 0,0005 s
ww.setAll(5); // ganze Dot-Fläche mit 5 ms Verzögerung setzen
ww.resetAll(0); // ganze Dot-Fläche schnell löschen
}
// ===========================================================================
void loop() {
setDot(1,1); // Dot an Position x=1, y=1 setzen
resetDot(3,1); // Dot an Position x=3, y=1 löschen
delay(500); // 0,5 Sekunden lang nichts tun
setDot(3,1);
resetDot(1,1);
delay(500);
}
Drei Schutzfunktionen
Die erste Schutzfunktion gegen das Durchbrennen der Flip-Dot Spulen ist die Verwendung des Software-Timers. Ist der Timer nach der eingestellten setCoilFlipDuration
abgelaufen, erzeugt er einen Interrupt, der jedweden Programmablauf unterbricht und den Flip-Strom augenblicklich abstellt.
Da so ein Microcontroller oder die eigene Programmierung auch mal versagen können, habe ich auf jeder wwFlip-Steuerplatine zusätzlich einen Hardwaretimer eingebaut. Erhält die wwFlip-Steuerplatine nach einer gewisesn Zeit keinen Ausschaltimpuls vom Mikrocontroller, schaltet sie den Flip-Strom selbsttätig ab.
Sind wir damit schon sicher? Nein! Wenn in einer Schleife sehr schnell hintereinander und endlos ein und das selbe Dot beschaltet wird, kann der Hardwaretimer das nicht als Fehlfunktion erkennen - es wird ja regelmäßig ein und aus geschaltet - die Spule des Dots findet das aber nicht lustig, warnt uns mit einem dezenten Geruch und spielt schließlich nicht mehr mit ;-)
Daher "merkt" sich die aaFlipra.h-Library die Koordinaten des jeweils zuletzt geflippten Dots. Erhält sie anschließend einen Schaltbefehl für die gleiche Koordinate, wartet sie die durch EMERGENCYDELAYMS eingestellt Abkühlzeit bis zum nächsten Flip. Die Wahl der Dauer von EMERGENCYDELAYMS ist immer ein Kompromiss zwischen Performance und Sicherheit - man sollte seinen Code daher immer dreimal prüfen, bevor man ihn in Dauerschleifen schickt!