Bewegter Punkt (Arduino und TFT, Part 1)


Eigentlich sollte das Display für die Wiedergabe der Messwerte meiner Wetterstation wieder geben. Aber zu diesen Zeitpunkt war nicht klar, welche Möglichkeiten eigentlich mit dem TFT und vor allem mit dem ATMega328 mit den 16MHz machbar sind. Nur blanke Werte sind für meine Anforderung zu wenig und daher galt zunächst herauszufinden, wie schnell sich die Inhalte auf dem Display aktualisiert werden können.

Punkt bewegen
Das einfachste ist, man lässt einen Punkt von A nach B bewegen. Aber besser ist, wenn man die Bewegungsrichtung des Punktes selbst zur Laufzeit bestimmen kann. Daher wurden auf dem Breadboard, noch vier Taster an den Arduino Angeschlossen.












Das sieht etwas wirr aus und was vielleicht nicht gleich zu erkennen ist, dass an den Button jeweils ein 4,7 Kilo Ohm Pull-Down Widerstand gesetzt sind. Das ist erforderlich, damit die Kontakte an dem Arduino keinen Zufälligen Zustand einnehmen. Denn selbst hohe Luftfeuchtigkeit, kann zu unerwünschten Effekten führen.













Neben dem Initialisieren des Bildschirms, müssen auch die Eingänge definiert werden, die später die Steuerknöpfe abbilden. Pro Loop durchlauf, wird der Zustand eingelesen und die Bedingungen für die Bewegung abgefragt.


#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>

// Verkabelung / Pins
// SCLK => D13
// MOSI/DIN => D11
// CS => D10
// DC => D9
// RST => D8

// instanz anlegen zu dem verwendeten Bildschirm.
Adafruit_ST7735 tft = Adafruit_ST7735(10, 9, 8);

// Pins festlegen
// ruft die Pin Nummer ab, um die Helligkeit des Displays anzusteuern.
const int pinBrightness = 5;
// ruft die Pin Nummer ab, um den Status des linken Buttons abzufragen
const int pinButtonLeft = 6;
// ruft die Pin Nummer ab, um den Status des rechten Buttons abzufragen
const int pinButtonRight = 3;
// ruft die Pin Nummer ab, um den Status des oberen Buttons abzufragen
const int pinButtonUp = 2;
// ruft die Pin Nummer ab, um den Status des unteren Buttons abzufragen
const int pinButtonDown = 7;

// ruft die letzte Position X ab. (Pixel Position)
int lastPosX = 5;
// ruft die letzte Position Y ab. (Pixel Position)
int lastPosY = 5;

void setup() {

  // initialisiere Display
  tft.initR(INITR_BLACKTAB);

  // pin Eingänge festlegen
  pinMode(pinButtonLeft, INPUT);
  pinMode(pinButtonRight, INPUT);
  pinMode(pinButtonUp, INPUT);
  pinMode(pinButtonDown, INPUT);

  // pin für tft Helligkeit festlegen
  pinMode(pinBrightness, OUTPUT);
  // helligkeit auf maximal einstellen
  analogWrite(pinBrightness, 255);

  // Bildschirm Schwarzausfüllen und um 90 Grad drehen.
  tft.fillScreen(ST7735_BLACK);
  tft.setRotation(1);
}

void loop() {

  // Eingaenge einlesen
  boolean buttonLeft = digitalRead(pinButtonLeft);
  boolean buttonRight = digitalRead(pinButtonRight);
  boolean buttonUp = digitalRead(pinButtonUp);
  boolean buttonDown = digitalRead(pinButtonDown);

  // Temporaer letzte Position merken
  int lastPosXtemp = lastPosX;
  int lastPosYtemp = lastPosY;

  // Abfragen zu den gedrückten Buttons
  // Es kann nur in eine Richtung die Bedingung erfüllt werden.

  // Wenn nach links oder rechts gedrückt wird.
  if(buttonLeft && !buttonRight && lastPosX > 0) {
    // nach links und letzte Position Y ist groesser als '0'.
    lastPosX--;
  }
  else if(!buttonLeft && buttonRight && lastPosX < tft.width()) {
    // nach rechts und letzte Position X ist kleiner als die TFT Pixel Breite.
    lastPosX++;
  }

  // wenn nach oben oder unten gedrückt wird.
  if(buttonUp && !buttonDown && lastPosY > 0) {
    // nach oben und letzte Position Y ist groesser als '0'.
    lastPosY--;
  }
  else if(!buttonUp && buttonDown && lastPosY < tft.height()) {
    // nach unten und letzte Position X ist kleiner als die TFT Pixel Hoehe.
    lastPosY++;
  }

  // Wenn sich X oder Y Position unterscheiden, dann den zu bewegenden Punkt neu zeichnen.
  if(lastPosX != lastPosXtemp || lastPosY != lastPosYtemp) {
    // vorigen punkt entfernen mit den Temporaeren Positionen.
    drawPoint(lastPosXtemp, lastPosYtemp, false);
    // neuen punkt zeichnen mit der neuen Position.
    drawPoint(lastPosX, lastPosY, true);
  }
}

// Einfachen Punkt Zeichnen, der nicht ausgefuellt ist.
void drawPoint(int x, int y, boolean setColor) {

  int setupColor = ST7735_BLACK;
  // farbe festlegen
  if(setColor) {
    setupColor = ST7735_CYAN;
  }
  tft.drawCircle(x, y, 2, setupColor);
  delay(2);
}

Damit wäre der erste Schritt getan und ihr könnt nun auf dem Bildschirm einen Punkte bewegen. Das ist zwar nicht sonderlich spektakulär, aber dafür gibt es ein wenig nostalgisches Gefühl mit der grafischen Darstellung.

Wie bereits oben der Titel verrät, kommen mehre Zusammenhängende Posts. Hierbei werden die Anliegen und Anforderungen Möglichst einfach gelöst und sind nicht nach einer Ziel Architektur ausgelegt.

Nächster Post: Umzug auf passende Plattform (Arduino Esplora, Part 2)

Github - BlogPost_01_MovingPoint

Kommentare

Beliebte Posts aus diesem Blog

Arduino Control (Teil 5) - PWM Signal einlesen

Angular auf dem Raspberry Pi

RC Fahrtenregler für Lego Kettenfahrzeug