207 lines
5.3 KiB
C++
207 lines
5.3 KiB
C++
// Example of drawing a graphical "switch" and using
|
|
// the touch screen to change it's state.
|
|
|
|
// This sketch does not use the libraries button drawing
|
|
// and handling functions.
|
|
|
|
// Based on Adafruit_GFX library onoffbutton example.
|
|
|
|
// Touch handling for XPT2046 based screens is handled by
|
|
// the TFT_eSPI library.
|
|
|
|
// Calibration data is stored in SPIFFS so we need to include it
|
|
#include "FS.h"
|
|
|
|
#include <SPI.h>
|
|
|
|
#include <TFT_eSPI.h> // Hardware-specific library
|
|
|
|
TFT_eSPI tft = TFT_eSPI(); // Invoke custom library
|
|
|
|
// This is the file name used to store the touch coordinate
|
|
// calibration data. Change the name to start a new calibration.
|
|
#define CALIBRATION_FILE "/TouchCalData3"
|
|
|
|
// Set REPEAT_CAL to true instead of false to run calibration
|
|
// again, otherwise it will only be done once.
|
|
// Repeat calibration if you change the screen rotation.
|
|
#define REPEAT_CAL false
|
|
|
|
bool SwitchOn = false;
|
|
|
|
// Comment out to stop drawing black spots
|
|
#define BLACK_SPOT
|
|
|
|
// Switch position and size
|
|
#define FRAME_X 100
|
|
#define FRAME_Y 64
|
|
#define FRAME_W 120
|
|
#define FRAME_H 50
|
|
|
|
// Red zone size
|
|
#define REDBUTTON_X FRAME_X
|
|
#define REDBUTTON_Y FRAME_Y
|
|
#define REDBUTTON_W (FRAME_W/2)
|
|
#define REDBUTTON_H FRAME_H
|
|
|
|
// Green zone size
|
|
#define GREENBUTTON_X (REDBUTTON_X + REDBUTTON_W)
|
|
#define GREENBUTTON_Y FRAME_Y
|
|
#define GREENBUTTON_W (FRAME_W/2)
|
|
#define GREENBUTTON_H FRAME_H
|
|
|
|
//------------------------------------------------------------------------------------------
|
|
//------------------------------------------------------------------------------------------
|
|
void setup(void)
|
|
{
|
|
Serial.begin(9600);
|
|
tft.init();
|
|
|
|
// Set the rotation before we calibrate
|
|
tft.setRotation(1);
|
|
|
|
// call screen calibration
|
|
touch_calibrate();
|
|
|
|
// clear screen
|
|
tft.fillScreen(TFT_BLUE);
|
|
|
|
// Draw button (this example does not use library Button class)
|
|
redBtn();
|
|
}
|
|
//------------------------------------------------------------------------------------------
|
|
//------------------------------------------------------------------------------------------
|
|
void loop()
|
|
{
|
|
uint16_t x, y;
|
|
|
|
// See if there's any touch data for us
|
|
if (tft.getTouch(&x, &y))
|
|
{
|
|
// Draw a block spot to show where touch was calculated to be
|
|
#ifdef BLACK_SPOT
|
|
tft.fillCircle(x, y, 2, TFT_BLACK);
|
|
#endif
|
|
|
|
if (SwitchOn)
|
|
{
|
|
if ((x > REDBUTTON_X) && (x < (REDBUTTON_X + REDBUTTON_W))) {
|
|
if ((y > REDBUTTON_Y) && (y <= (REDBUTTON_Y + REDBUTTON_H))) {
|
|
Serial.println("Red btn hit");
|
|
redBtn();
|
|
}
|
|
}
|
|
}
|
|
else //Record is off (SwitchOn == false)
|
|
{
|
|
if ((x > GREENBUTTON_X) && (x < (GREENBUTTON_X + GREENBUTTON_W))) {
|
|
if ((y > GREENBUTTON_Y) && (y <= (GREENBUTTON_Y + GREENBUTTON_H))) {
|
|
Serial.println("Green btn hit");
|
|
greenBtn();
|
|
}
|
|
}
|
|
}
|
|
|
|
Serial.println(SwitchOn);
|
|
|
|
}
|
|
}
|
|
//------------------------------------------------------------------------------------------
|
|
|
|
void touch_calibrate()
|
|
{
|
|
uint16_t calData[5];
|
|
uint8_t calDataOK = 0;
|
|
|
|
// check file system exists
|
|
if (!SPIFFS.begin()) {
|
|
Serial.println("Formatting file system");
|
|
SPIFFS.format();
|
|
SPIFFS.begin();
|
|
}
|
|
|
|
// check if calibration file exists and size is correct
|
|
if (SPIFFS.exists(CALIBRATION_FILE)) {
|
|
if (REPEAT_CAL)
|
|
{
|
|
// Delete if we want to re-calibrate
|
|
SPIFFS.remove(CALIBRATION_FILE);
|
|
}
|
|
else
|
|
{
|
|
File f = SPIFFS.open(CALIBRATION_FILE, "r");
|
|
if (f) {
|
|
if (f.readBytes((char *)calData, 14) == 14)
|
|
calDataOK = 1;
|
|
f.close();
|
|
}
|
|
}
|
|
}
|
|
|
|
if (calDataOK && !REPEAT_CAL) {
|
|
// calibration data valid
|
|
tft.setTouch(calData);
|
|
} else {
|
|
// data not valid so recalibrate
|
|
tft.fillScreen(TFT_BLACK);
|
|
tft.setCursor(20, 0);
|
|
tft.setTextFont(2);
|
|
tft.setTextSize(1);
|
|
tft.setTextColor(TFT_WHITE, TFT_BLACK);
|
|
|
|
tft.println("Touch corners as indicated");
|
|
|
|
tft.setTextFont(1);
|
|
tft.println();
|
|
|
|
if (REPEAT_CAL) {
|
|
tft.setTextColor(TFT_RED, TFT_BLACK);
|
|
tft.println("Set REPEAT_CAL to false to stop this running again!");
|
|
}
|
|
|
|
tft.calibrateTouch(calData, TFT_MAGENTA, TFT_BLACK, 15);
|
|
|
|
tft.setTextColor(TFT_GREEN, TFT_BLACK);
|
|
tft.println("Calibration complete!");
|
|
|
|
// store data
|
|
File f = SPIFFS.open(CALIBRATION_FILE, "w");
|
|
if (f) {
|
|
f.write((const unsigned char *)calData, 14);
|
|
f.close();
|
|
}
|
|
}
|
|
}
|
|
|
|
void drawFrame()
|
|
{
|
|
tft.drawRect(FRAME_X, FRAME_Y, FRAME_W, FRAME_H, TFT_BLACK);
|
|
}
|
|
|
|
// Draw a red button
|
|
void redBtn()
|
|
{
|
|
tft.fillRect(REDBUTTON_X, REDBUTTON_Y, REDBUTTON_W, REDBUTTON_H, TFT_RED);
|
|
tft.fillRect(GREENBUTTON_X, GREENBUTTON_Y, GREENBUTTON_W, GREENBUTTON_H, TFT_DARKGREY);
|
|
drawFrame();
|
|
tft.setTextColor(TFT_WHITE);
|
|
tft.setTextSize(2);
|
|
tft.setTextDatum(MC_DATUM);
|
|
tft.drawString("ON", GREENBUTTON_X + (GREENBUTTON_W / 2), GREENBUTTON_Y + (GREENBUTTON_H / 2));
|
|
SwitchOn = false;
|
|
}
|
|
|
|
// Draw a green button
|
|
void greenBtn()
|
|
{
|
|
tft.fillRect(GREENBUTTON_X, GREENBUTTON_Y, GREENBUTTON_W, GREENBUTTON_H, TFT_GREEN);
|
|
tft.fillRect(REDBUTTON_X, REDBUTTON_Y, REDBUTTON_W, REDBUTTON_H, TFT_DARKGREY);
|
|
drawFrame();
|
|
tft.setTextColor(TFT_WHITE);
|
|
tft.setTextSize(2);
|
|
tft.setTextDatum(MC_DATUM);
|
|
tft.drawString("OFF", REDBUTTON_X + (REDBUTTON_W / 2) + 1, REDBUTTON_Y + (REDBUTTON_H / 2));
|
|
SwitchOn = true;
|
|
}
|
|
|