Analog Anzeige auf dem TFT 1.8" zeichnen
Eine Analog Anzeige ist schon etwas Nostalgisch und haben eigentlich
wegen ihrer ungenauen Ablesbarkeit keinen nutzen mehr. Aber das sollte
kein Hindernis sein, dennoch solche Analogen Display auf einem Arduino zu
Zeichnen. Das man dazu nicht viel machen muss, zeige ich in diesen Post
mit einem Code Schnipsel.
- Arduino UNO / Duemilanove
- TFT Display 128x160
- Ggf. TFT Display Shield
Die Bibliothek für TFT hat fast alle Methoden, um das Zeichnen einer
Analogen Anzeige zu ermöglich. Damit man nicht zu sehr in Grafik
Experimente verfällt, ist es hilfreich sich vorher eine Skizze zu machen.
Mit den Rechtecken und Kreisen und einer richtigen Reihenfolge, kann die
Grundlage der Analoganzeige gezeichnet werden. Jedoch der Interessante
Teil ist, das Animieren der Anzeigenadel.
Anzeigenadel
Der Aufbau der Anzeigenadel ist sehr überschaubar und kommt mit einfacher
Schulmathematik aus. Für das Beispiel wird allerdings nur eine Linie
gezeichnet. Eine Pfeilspitze würde beim Zeichnen mehr Zeit aufwenden und
eine flüssige Darstellung wäre ggf. nicht möglich. Zumindest nicht mit der
Bibliothek, da das Pixelzeichnen nicht in ein Backbuffer des TFT
geschrieben werden kann.
Später beim Zeichnen eines Wertzustandes, muss der vorige Stand zurück
gesetzt werden. Hierbei reicht es die Anzeigenadel mit dem vorigen Wert
nochmal mit der Hintergrundfarbe zu Zeichnen.
Code Schnipsel
Der folgende Programmcode Zeichnet nur die Anzeigenadel. Als Eingabewert
wird der Pin A0 mit 'analogRead' ausgelesen. Die vollständige
Analoganzeige findet ihr wieder auf meinem Github Repository.
#include <SPI.h>
#include <TFT.h>
#include <Wire.h>
#define CS 10
#define DC 9
#define RST 8
TFT mScreen = TFT(CS, DC, RST);
float mValuePointer = 0.0;
float mValuePointerLast = 0.0;
void setup() {
Wire.begin();
mScreen.begin();
mScreen.background(0, 0, 0);
pinMode(A0, INPUT);
}
void loop() {
mValuePointer = ((float)analogRead(A0) / 1023.0) * 100.0;
mScreen.stroke(0, 0, 0);
renderValuePointer(40, 40, 25, mValuePointerLast);
mScreen.stroke(35, 200, 140);
renderValuePointer(40, 40, 25, mValuePointer);
mValuePointerLast = mValuePointer;
delay(10);
}
void renderValuePointer(int locationX, int locationY, float diffRadius, float val) {
float section = 2.0 * 3.14 / 100.0;
float sectionStart = section * 5;
float center = diffRadius / 2.0;
val = val + 50.0;
float x = diffRadius * cos(section * val) + diffRadius;
float y = diffRadius * sin(section * val) + diffRadius;
mScreen.line(locationX + diffRadius, locationY + diffRadius, locationX + x , locationY + y );
}
Wenn ihr das auf eure Umgebung hoch lädt, dann sollte eine Line auf dem
Bildschirm zu sehen sein. Das Zappeln ist praktisch gesehen ein Rauschen,
wenn kein Pull-Up oder Pull-Down Widerstand gesetzt wurde auf Pin A0.
Kurzes
Wie ihr seht, steckt da nicht viel dahinter und schon schafft man etwas
mehr Optik.
Kommentare