/*
GND (1) - GND
VCC (2) - 5V
RESET (3) - D9
D/C (4) - D8
CARD-CS (5) -
TFT-CS (6) - D10
MOSI (7) - D11
SCK (8) - D13
MISO (9) -
LITE (10) - 5V
*/
#include "Adafruit_GFX.h"
#include "Adafruit_ST7735.h"
#include "SPI.h"
#define TFT_CS 10
#define TFT_RST 9
#define TFT_DC 8
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
/*
Farben als hexadezimal definiert
alternativ:
int SCHWARZ = 0;
int BLAU = 15;
. . .
*/
#define SCHWARZ 0x0000 // dezimal 0
#define BLAU 0x000F // dezimal 15
#define ROT 0xF800 // dezimal 63488
#define GRUEN 0x0E81 // dezimal 3713
#define CYAN 0x07FF // dezimal 2047
#define MAGENTA 0xF81F // dezimal 63519
#define GELB 0xAFE5 // dezimal 65504
#define WEISS 0xFFFF // dezimal 65535
#define BRAUN 0xFC00 // dezimal 64512
#define GRAU 0xF7F0 // dezimal 63472
#define GRUENGELB 0xAFE5 // dezimal 45029
#define DUNKELCYAN 0x03EF // dezimal 1007
#define ORANGE 0xFD20 // dezimal 64800
#define PINK 0xFC18 // dezimal 64536
// Farbe der Blöcke
#define FARBE GRUEN
// Farbe des Kreises
#define KREISFARBE GELB
// Farbe der Schrift
#define SCHRIFTFARBE WEISS
// Joystick analoge Pins
int XAchse = A0;
int YAchse = A1;
// Button/Knopf
int JoystickButton = 7;
// Zustand des Buttons
int ButtonLesen;
// Spiel starten wenn * gedrückt wurde
bool SpielStart = false;
// Radius des kreises
const int Radius = 10;
// Abstand zu den Rändern
const int Abstand = Radius * 2;
// je höher, dest langsamer
const int Geschwindigkeit = 100;
// Bewegung des Kreises in Pixeln
const int Bewegung = 5;
// Startposition des Kreises
int CursorX = Radius;
int CursorY = tft.height() / 2 - Abstand;
// Variablen für die Auswertung der Bewegung des Joysticks
int PositionX;
int PositionY;
// Variable für die Zeitmessung
long Start;
void setup()
{
// Startbildschirm
// schwarzes Farbschema vertikale Ausrichtung (nicht drehen)
// Cursor setzen, Schriftgröße und -farbe definieren
tft.initR(INITR_BLACKTAB);
tft.setRotation(0);
tft.fillScreen(SCHWARZ);
// Startbildschirm
tft.setTextSize(2);
tft.setCursor(1, 10);
tft.setTextColor(SCHRIFTFARBE);
tft.println("Start:");
tft.print("-> Button");
pinMode(JoystickButton, INPUT_PULLUP);
}
void loop()
{
// Button/Knopf auswerten
ButtonLesen = digitalRead(JoystickButton);
if (ButtonLesen == LOW)
{
// Spiel wird gestartet
SpielStart = true;
// Parcours bauen
ParcoursBauen();
// Zeitmessung starten
Start = millis();
}
// wenn der Button gedrückt wurde -> SpielStart -> true
if (SpielStart)
{
// Bewegung der X-Achse lesen
PositionX = analogRead(XAchse);
// Bewegung X-Achse nach oben
if (PositionX > 600)
{
// Kreis an der aktuellen Position "löschen"
tft.fillCircle(CursorX, CursorY, Radius, SCHWARZ);
// wenn der Bildschirmrand oben noch nicht erreicht wurde
// rückwärts -> Richtung x = 1 bewegen
if (CursorY > Radius) CursorY -= Bewegung;
// Kreis an der neuen Position zeichnen
tft.fillCircle(CursorX, CursorY, Radius, KREISFARBE);
delay(Geschwindigkeit);
}
// Bewegung X-Achse nach unten
if (PositionX < 300)
{
// Kreis an der aktuellen Position "löschen"
tft.fillCircle(CursorX, CursorY, Radius, SCHWARZ);
// wenn der Bildschirmrand rechts noch nicht erreicht wurde
// vorwärts -> Richtung tft.height() bewegen
if (CursorY < tft.height() - Radius) CursorY += Bewegung;
// Kreis an der neuen Position zeichnen
tft.fillCircle(CursorX, CursorY, Radius, KREISFARBE);
delay(Geschwindigkeit);
}
// Bewegung Y-Achse nach links
if (PositionY < 300)
{
// Kreis an der aktuellen Position "löschen"
tft.fillCircle(CursorX, CursorY, Radius, SCHWARZ);
// wenn der Bildschirmrand links noch nicht erreicht wurde
// rückwärts -> Richtung linken Bildschirmrand bewegen
if (CursorX > Radius) CursorX -= Bewegung;
// Kreis an der neuen Position zeichnen
tft.fillCircle(CursorX, CursorY, Radius, KREISFARBE);
delay(Geschwindigkeit);
}
// Bewegung Y-Achse nach rechts
PositionY = analogRead(YAchse);
if (PositionY > 600)
{
// Kreis an der aktuellen Position "löschen"
tft.fillCircle(CursorX, CursorY, Radius, SCHWARZ);
// Abfrage, ob der rechte Rand erreicht wurde, nicht nötig
// wird in der nächsten Bedingung abgefragt
CursorX += Bewegung;
// Kreis an der neuen Position zeichnen
tft.fillCircle(CursorX, CursorY, Radius, KREISFARBE);
delay(Geschwindigkeit);
}
// rechter Bildschirmrand erreicht -> Spielende
if (CursorX > tft.height() - Radius)
{
ErgebnisZeigen();
}
}
}
void ErgebnisZeigen()
{
// Zeit berechnen
int Sekunden;
long VerstricheneZeit = millis() - Start;
Sekunden = int(VerstricheneZeit / 1000);
// Zeit anzeigen
tft.fillScreen(SCHWARZ);
tft.setTextColor(SCHRIFTFARBE);
tft.setTextSize(2);
tft.setCursor(1, 10);
tft.println("Zeit:");
tft.println(String(Sekunden) + " s");
tft.setCursor(1, 40);
tft.println();
tft.println("Neustart:");
tft.println("-> Taste");
SpielStart = false;
}
void ParcoursBauen()
{
CursorX = Radius;
CursorY = tft.height() / 2 - Abstand;
tft.fillScreen(SCHWARZ);
// Kreis anzeigen
tft.fillCircle(CursorX, CursorY, Radius, KREISFARBE);
// Parcours "bauen"
tft.fillRect(65, 35, 5, 45, FARBE);
tft.fillRect(1, 1, 35, 35, FARBE);
tft.fillRect(1, 80, 70, 80, FARBE);
tft.fillRect(110, 1, 70, 95, FARBE);
tft.fillRect(110, 130, 140, 160, FARBE);
}
Letzte Aktualisierung: