// erst einmal die Treiber für den Bildchirm und den Touchscreen einbinden und initialisieren
//#include <lvgl.h> wird (noch) nicht gebraucht
#include <TFT_eSPI.h>
#include <XPT2046_Touchscreen.h>
TFT_eSPI tft = TFT_eSPI();
// Touchscreen pins
#define XPT2046_IRQ 36 // T_IRQ
#define XPT2046_MOSI 32 // T_DIN
#define XPT2046_MISO 39 // T_OUT
#define XPT2046_CLK 25 // T_CLK
#define XPT2046_CS 33 // T_CS
SPIClass touchscreenSPI = SPIClass(VSPI);
XPT2046_Touchscreen touchscreen(XPT2046_CS, XPT2046_IRQ);
#define SCREEN_WIDTH 320
#define SCREEN_HEIGHT 240
#define FONT_SIZE 2
//Start des unteren Bereiches (Position der Trennlinie und verschieben der Einstellregler - relativ)
#define vonoben 90
char numberArray[20];
// jetzt noch ein paar Einstellungen/Vorgaben für die Knöpfe
//Temperatur
// Zieltemperatur - Button Position und Buttongröße
#define Frame_TS_X 10 //Position vom linken Rand
#define Frame_TS_Y vonoben+30 //Position vom oberen Rand
#define Frame_TS_W 60 //Breite
#define Frame_TS_H 40 //Höhe
// Temperatur Hysterese - Button Position und Buttongröße
#define Frame_HST_X (Frame_TS_X+175) //Position vom linken Rand
#define Frame_HST_Y (Frame_TS_Y) //Position vom oberen Rand
#define Frame_HST_W (Frame_TS_W) //Breite
#define Frame_HST_H (Frame_TS_H) //Höhe
// Zieltemperatur Setzen - Temperatur kleiner/geringer - Größe des Teilbuttons
#define TS_decr_Button_X Frame_TS_X
#define TS_decr_Button_Y Frame_TS_Y
#define TS_decr_Button_W (Frame_TS_W / 2)
#define TS_decr_Button_H Frame_TS_H
// Zieltemperatur Setzen - Temperatur-höher/größer - Größe des Teilbuttons
#define TS_incr_Button_X (TS_decr_Button_X + TS_decr_Button_W)
#define TS_incr_Button_Y Frame_TS_Y
#define TS_incr_Button_W (Frame_TS_W / 2)
#define TS_incr_Button_H Frame_TS_H
// Zieltemperatur Hysterese-Setzen - HS-kleiner/geringer - Größe des Teilbuttons
#define HST_decr_Button_X Frame_HST_X
#define HST_decr_Button_Y Frame_HST_Y
#define HST_decr_Button_W (Frame_HST_W / 2)
#define HST_decr_Button_H Frame_HST_H
// Zieltemperatur Hysterese-Setzen - HS-höher/größer - Größe des Teilbuttons
#define HST_incr_Button_X (HST_decr_Button_X + HST_decr_Button_W)
#define HST_incr_Button_Y Frame_HST_Y
#define HST_incr_Button_W (Frame_HST_W / 2)
#define HST_incr_Button_H Frame_HST_H
//Die Variablen für Temperatur, T-Hysterese etc.
//(bewusst als Ganzzahl, da die Sensoren im Zehntelbereich nur eine Scheingenauigkeit haben)
float TM=12;
float FM=98;
float TS=10;
float TH=5;
float FS=90;
float FH=10;
// die LED Pins
#define LED_RED 4
#define LED_GREEN 16
#define LED_BLUE 17
// Touchscreen coordinates: (x, y) and pressure (z)
int x, y, z;
// Stores current button state
bool buttonState = false;
// Die Touchscreen info über die Position X, Y und Z Druck auf dem Serial Monitor ausgeben
void printTouchToSerial(int touchX, int touchY, int touchZ) {
Serial.print("X = ");
Serial.print(touchX);
Serial.print(" | Y = ");
Serial.print(touchY);
Serial.print(" | Pressure = ");
Serial.print(touchZ);
Serial.println();
}
// Draw button frame
void drawFrame() {
// tft.drawRect(Frame_TS_X, Frame_TS_Y, Frame_TS_W, Frame_TS_H, TFT_BLACK);
}
// Drtaw separation line (zwischen Temperatur und Feuchte), tft.drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color)
void drawline() {
tft.drawLine(0,vonoben,SCREEN_WIDTH,vonoben,TFT_BLACK);
}
// Draw a decrease button Temperatur-Set
void drawTS_decr_Button() {
tft.fillRect(TS_decr_Button_X, TS_decr_Button_Y, TS_decr_Button_W, TS_decr_Button_H, TFT_LIGHTGREY);
tft.fillRect(TS_incr_Button_X, TS_incr_Button_Y, TS_incr_Button_W, TS_incr_Button_H, TFT_WHITE);
tft.fillRect(TS_incr_Button_X, TS_incr_Button_Y, TS_incr_Button_W, TS_incr_Button_H, TFT_RED);
tft.fillRect(TS_decr_Button_X, TS_decr_Button_Y, TS_decr_Button_W, TS_decr_Button_H, TFT_WHITE);
drawFrame();
tft.setTextColor(TFT_BLACK);
tft.setTextSize(FONT_SIZE);
tft.setTextDatum(MC_DATUM);
tft.drawString("+", TS_incr_Button_X + (TS_incr_Button_W / 2), TS_incr_Button_Y + (TS_incr_Button_H / 2));
tft.drawString("-", TS_decr_Button_X + (TS_decr_Button_W / 2) + 1, TS_decr_Button_Y + (TS_decr_Button_H / 2));
tft.setTextColor(TFT_BLUE); //Textfarbe Blau (Blau auf Blauem Grund)
itoa(TS,numberArray,10); //Die Soll-Temp in einen String umwandeln
tft.drawString(numberArray,90,vonoben+42,1); // Die Soll Temperatur "löschen"
tft.setTextColor(TFT_BLACK);//Die Schrift wieder Schwarz
TS = TS-1; // Die Soll Temperatur reduzieren
buttonState = false;
}
// Draw a increase button Temperatur-Set
void drawTS_incr_Button() {
tft.fillRect(TS_incr_Button_X, TS_incr_Button_Y, TS_incr_Button_W, TS_incr_Button_H, TFT_RED);
tft.fillRect(TS_decr_Button_X, TS_decr_Button_Y, TS_decr_Button_W, TS_decr_Button_H, TFT_WHITE);
drawFrame();
tft.setTextColor(TFT_BLACK);
tft.setTextSize(FONT_SIZE);
tft.setTextDatum(MC_DATUM);
tft.drawString("+", TS_incr_Button_X + (TS_incr_Button_W / 2), TS_incr_Button_Y + (TS_incr_Button_H / 2));
tft.drawString("-", TS_decr_Button_X + (TS_decr_Button_W / 2) + 1, TS_decr_Button_Y + (TS_decr_Button_H / 2));
tft.setTextColor(TFT_BLUE); //Textfarbe Blau (Blau auf Blauem Grund)
itoa(TS,numberArray,10); //Die Soll-Temp in einen String umwandeln
tft.drawString(numberArray,90,vonoben+42,1); // Die Soll Temperatur "löschen"
tft.setTextColor(TFT_BLACK);//Die Schrift wieder Schwarz
TS=TS+1;
buttonState = true;
}
// Draw a decrease button Temperatur-Hysterese
void drawHST_decr_Button() {
tft.fillRect(HST_decr_Button_X, HST_decr_Button_Y, HST_decr_Button_W, HST_decr_Button_H, TFT_RED);
tft.fillRect(HST_incr_Button_X, HST_incr_Button_Y, HST_incr_Button_W, HST_incr_Button_H, TFT_WHITE);
drawFrame();
tft.setTextColor(TFT_BLACK);
tft.setTextSize(FONT_SIZE);
tft.setTextDatum(MC_DATUM);
tft.drawString("+", HST_incr_Button_X + (HST_incr_Button_W / 2), HST_incr_Button_Y + (HST_incr_Button_H / 2));
tft.drawString("-", HST_decr_Button_X + (HST_decr_Button_W / 2), HST_decr_Button_Y + (HST_decr_Button_H / 2));
buttonState = false;
}
// Draw a increase button Temperatur-Hysterese
void drawHST_incr_Button() {
tft.fillRect(HST_incr_Button_X, HST_incr_Button_Y, HST_incr_Button_W, HST_incr_Button_H, TFT_GREEN);
tft.fillRect(HST_decr_Button_X, HST_decr_Button_Y, HST_decr_Button_W, HST_decr_Button_H, TFT_WHITE);
drawFrame();
tft.setTextColor(TFT_BLACK);
tft.setTextSize(FONT_SIZE);
tft.setTextDatum(MC_DATUM);
tft.drawString("+", HST_incr_Button_X + (HST_incr_Button_W / 2), HST_incr_Button_Y + (HST_incr_Button_H / 2));
tft.drawString("-", HST_decr_Button_X + (HST_decr_Button_W / 2) + 1, HST_decr_Button_Y + (HST_decr_Button_H / 2));
buttonState = true;
}
void setup() {
Serial.begin(115200);
pinMode(LED_GREEN, OUTPUT);
pinMode(LED_BLUE, OUTPUT);
pinMode(LED_RED, OUTPUT);
// Start the SPI for the touchscreen and init the touchscreen
touchscreenSPI.begin(XPT2046_CLK, XPT2046_MISO, XPT2046_MOSI, XPT2046_CS);
touchscreen.begin(touchscreenSPI);
// Set the Touchscreen rotation in landscape mode
// Note: in some displays, the touchscreen might be upside down, so you might need to set the rotation to 3: touchscreen.setRotation(3);
touchscreen.setRotation(1);
// Start the tft display
tft.init();
// Set the TFT display rotation in landscape mode
tft.setRotation(1);
// Clear the screen before writing to it
tft.fillScreen(TFT_BLUE);
// Draw the Separation Line
drawline();
// Draw Temperatur Set Button
drawTS_incr_Button();
// Draw Temperatur Hysterese Button
drawHST_incr_Button();
digitalWrite(LED_GREEN, 1);
digitalWrite(LED_BLUE, 1);
digitalWrite(LED_RED, 1);
// die Anzeigen
tft.setTextDatum(TL_DATUM);
tft.drawString("Akt. Temperatur / Feuchte ",10,3,1);
tft.drawString("Soll-Temp. Hysterese",10,vonoben+8,1);
tft.drawString("Soll-Feuchte Hysterese",10,vonoben+85,1);
tft.fillRect(40,25,100,40, TFT_WHITE); //Die Boxen für Temperatur
tft.fillRect(180,25,100,40, TFT_WHITE); //und Feuchte
}
void loop() {
tft.setTextDatum(TL_DATUM);
itoa(TM,numberArray,10);
tft.drawString(numberArray,60,30,2); // Der T-Messwert
tft.drawString("'C",105,30,2); // Die T-Einheit
itoa(FM,numberArray,10);
tft.drawString(numberArray,200,30,2); // Der F-Messwert
tft.drawString("%",245,30,2); // Die F-Einheit
itoa(TS,numberArray,10);
tft.drawString(numberArray,90,vonoben+42,1); // Die Soll Temperatur
tft.drawString("'C",120,vonoben+42,1); // Die T-Einheit
itoa(TH,numberArray,10);
tft.drawString("+",255,vonoben+40,1); // Das Hysterese-± Symbol
tft.drawString("-",255,vonoben+47,1); // Das Hysterese-± Symbol
tft.drawString(numberArray,270,vonoben+42,1); // Die Soll-Hysterese
tft.drawString("'C",285,vonoben+42,1); // Die Hysterese-Einheit
// Checks if Touchscreen was touched, and fills Var X, Y and Z (pressure)
if (touchscreen.tirqTouched() && touchscreen.touched()) {
// Get Touchscreen points
TS_Point p = touchscreen.getPoint();
// Calibrate Touchscreen points with map function to the correct width and height
x = map(p.x, 200, 3700, 1, SCREEN_WIDTH);
y = map(p.y, 240, 3800, 1, SCREEN_HEIGHT);
z = p.z;
printTouchToSerial(x, y, z); //prints X, Y and Pressure (Z) info to the Serial Monitor
if (buttonState) {
Serial.println("increase");
if ((x > TS_decr_Button_X) && (x < (TS_decr_Button_X + TS_decr_Button_W))) {
if ((y > (TS_decr_Button_Y)) && (y <= (TS_decr_Button_Y + TS_decr_Button_H))) {
Serial.println("Red button pressed");
drawTS_decr_Button();
digitalWrite(LED_BLUE, 0);
delay(300);
digitalWrite(LED_BLUE, 1);
}
}
}
else {
Serial.println("decrease");
if ((x > (TS_incr_Button_X)) && (x < (TS_incr_Button_X + TS_incr_Button_W))) {
if ((y > (TS_incr_Button_Y)) && (y <= (TS_incr_Button_Y + TS_incr_Button_H))) {
Serial.println("Green button pressed");
drawTS_incr_Button();
digitalWrite(LED_RED, 0);
delay(300);
digitalWrite(LED_RED, 1);
}
}
}
}
}