mirror of https://github.com/arendst/Tasmota.git
134 lines
3.4 KiB
C++
134 lines
3.4 KiB
C++
//This example implements a simple sliding On/Off button. The example
|
|
// demonstrates drawing and touch operations.
|
|
//
|
|
//Thanks to Adafruit forums member Asteroid for the original sketch!
|
|
//
|
|
#include <Adafruit_GFX.h>
|
|
#include <SPI.h>
|
|
#include <Wire.h>
|
|
#include <Adafruit_ILI9341.h>
|
|
#include <TouchScreen.h>
|
|
|
|
//Touchscreen X+ X- Y+ Y- pins
|
|
#define YP A3 // must be an analog pin, use "An" notation!
|
|
#define XM A2 // must be an analog pin, use "An" notation!
|
|
#define YM 5 // can be a digital pin
|
|
#define XP 4 // can be a digital pin
|
|
|
|
// This is calibration data for the raw touch data to the screen coordinates
|
|
#define TS_MINX 150
|
|
#define TS_MINY 120
|
|
#define TS_MAXX 920
|
|
#define TS_MAXY 940
|
|
|
|
#define MINPRESSURE 10
|
|
#define MAXPRESSURE 1000
|
|
|
|
// For better pressure precision, we need to know the resistance
|
|
// between X+ and X- Use any multimeter to read it
|
|
// For the one we're using, its 300 ohms across the X plate
|
|
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);
|
|
|
|
|
|
#define TFT_CS 10
|
|
#define TFT_DC 9
|
|
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
|
|
|
|
boolean RecordOn = false;
|
|
|
|
#define FRAME_X 210
|
|
#define FRAME_Y 180
|
|
#define FRAME_W 100
|
|
#define FRAME_H 50
|
|
|
|
#define REDBUTTON_X FRAME_X
|
|
#define REDBUTTON_Y FRAME_Y
|
|
#define REDBUTTON_W (FRAME_W/2)
|
|
#define REDBUTTON_H FRAME_H
|
|
|
|
#define GREENBUTTON_X (REDBUTTON_X + REDBUTTON_W)
|
|
#define GREENBUTTON_Y FRAME_Y
|
|
#define GREENBUTTON_W (FRAME_W/2)
|
|
#define GREENBUTTON_H FRAME_H
|
|
|
|
void drawFrame()
|
|
{
|
|
tft.drawRect(FRAME_X, FRAME_Y, FRAME_W, FRAME_H, ILI9341_BLACK);
|
|
}
|
|
|
|
void redBtn()
|
|
{
|
|
tft.fillRect(REDBUTTON_X, REDBUTTON_Y, REDBUTTON_W, REDBUTTON_H, ILI9341_RED);
|
|
tft.fillRect(GREENBUTTON_X, GREENBUTTON_Y, GREENBUTTON_W, GREENBUTTON_H, ILI9341_BLUE);
|
|
drawFrame();
|
|
tft.setCursor(GREENBUTTON_X + 6 , GREENBUTTON_Y + (GREENBUTTON_H/2));
|
|
tft.setTextColor(ILI9341_WHITE);
|
|
tft.setTextSize(2);
|
|
tft.println("ON");
|
|
RecordOn = false;
|
|
}
|
|
|
|
void greenBtn()
|
|
{
|
|
tft.fillRect(GREENBUTTON_X, GREENBUTTON_Y, GREENBUTTON_W, GREENBUTTON_H, ILI9341_GREEN);
|
|
tft.fillRect(REDBUTTON_X, REDBUTTON_Y, REDBUTTON_W, REDBUTTON_H, ILI9341_BLUE);
|
|
drawFrame();
|
|
tft.setCursor(REDBUTTON_X + 6 , REDBUTTON_Y + (REDBUTTON_H/2));
|
|
tft.setTextColor(ILI9341_WHITE);
|
|
tft.setTextSize(2);
|
|
tft.println("OFF");
|
|
RecordOn = true;
|
|
}
|
|
|
|
void setup(void)
|
|
{
|
|
Serial.begin(9600);
|
|
tft.begin();
|
|
|
|
tft.fillScreen(ILI9341_BLUE);
|
|
// origin = left,top landscape (USB left upper)
|
|
tft.setRotation(1);
|
|
redBtn();
|
|
}
|
|
|
|
void loop()
|
|
{
|
|
// Retrieve a point
|
|
TSPoint p = ts.getPoint();
|
|
|
|
// See if there's any touch data for us
|
|
if (p.z > MINPRESSURE && p.z < MAXPRESSURE)
|
|
{
|
|
// Scale using the calibration #'s
|
|
// and rotate coordinate system
|
|
p.x = map(p.x, TS_MINY, TS_MAXY, 0, tft.height());
|
|
p.y = map(p.y, TS_MINX, TS_MAXX, 0, tft.width());
|
|
int y = tft.height() - p.x;
|
|
int x = p.y;
|
|
|
|
if (RecordOn)
|
|
{
|
|
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 (RecordOn == 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(RecordOn);
|
|
}
|
|
}
|
|
|
|
|
|
|