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. Cahnge 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
 | 
						|
 | 
						|
boolean 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("Formating 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;
 | 
						|
}
 | 
						|
 |