关于触摸屏的那些事-Arduino中文社区 - Powered by Discuz! Archiver

tmld570707 发表于 2022-7-28 11:09

关于触摸屏的那些事

关于触摸屏网友eagler8谈的很透。现基于TFT_eSP和XPT2046作背景叽歪两句。触摸屏大致分为两类。既分离型和集成型。
      分离型:触摸屏与MCU分开的,需用线正确连接。此类共享SIP见图

/Users/tmld/Desktop/截屏2022-07-28 09.09.36.png

使用前需校正数据。TFT_eSP的校正程序Toucu_calibrat。示例程序有TFT_Button_labl_Datum,on_off_Button,keypad_240x320,keypad_480x320。
   集成型:触摸屏与MCU集成。此类大多独享SPI。速度快。网友fmzhangpei241做的就是。需另外的驱动。下面是以修改好的驱动。不妥请砖正。
   编译时 警告: TFT_Touch-master 库要求运行在 avr 架构(),可能与你现在运行在 esp32 架构上的开发板()不兼容。不用管。
   编程时勿用上面示例程序中的特定指令,有莫名冲突。
/Users/tmld/Desktop/GMT024-10模块代码.zip

tmld570707 发表于 2022-7-28 11:29


tmld570707 发表于 2022-7-28 11:35

网友fmzhangpei241 的屏可用。其他不知道

tmld570707 发表于 2022-8-14 15:39

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

#include <TFT_Touch.h>

// These are the pins used to interface between the 2046 touch controller and Arduino Pro
//独用SPI的触摸屏。
#define DOUT 39/* Data out pin (T_DO) of touch screen */
#define DIN32/* Data in pin (T_DIN) of touch screen */
#define DCS33/* Chip select pin (T_CS) of touch screen */
#define DCLK 25/* Clock pin (T_CLK) of touch screen */

/* Create an instance of the touch screen library */
TFT_Touch touch = TFT_Touch(DCS, DCLK, DIN, DOUT);

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

// 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(38400);//(9600);
tft.init();

// Set the rotation before we calibrate
tft.setRotation(1);
touch.setRotation(1);//屏与触摸板一致

// call screen calibration你的校正值,见TFT_Touch_Calbrate_V2.
touch.setCal(526, 3443, 750, 3377, 320, 240, 1);

// 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 (touch.Pressed())//
//if (tft.getTouch(&x, &y))
{
    x = touch.X();
    y = touch.Y();
    Serial.print(x); Serial.print(","); Serial.println(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)))&&((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)))&&((y > GREENBUTTON_Y) && (y <= (GREENBUTTON_Y + GREENBUTTON_H)))) {

          Serial.println("Green btn hit");
          greenBtn();
      }
    }

    Serial.println(SwitchOn);

}
}
//------------------------------------------------------------------------------------------

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;
}
页: [1]
查看完整版本: 关于触摸屏的那些事