如何使用esp32和ILI9341实现触控开关灯?-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 426|回复: 1

[未解决] 如何使用esp32和ILI9341实现触控开关灯?

[复制链接]
发表于 2022-7-16 15:52 | 显示全部楼层 |阅读模式

救!

现在使用了TFT_eSPI的库,屏幕显示和触摸功能都没有问题,但是使用其中的On_Off_Button,画面中只显示了按键(见下图),但是触控没有反应。请问能在这个代码基础上修改,实现触控开关灯吗?本人小白,求好心人能帮忙改代码,跪谢!


On_Off_Button的代码:

// 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;

}



微信图片_20220716153344.jpg
发表于 2022-7-17 01:50 | 显示全部楼层
User_Setup.h设置看一下
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-12-1 01:36 , Processed in 0.107495 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表