Работа с сенсорным дисплеем в Arduino

Для отображения информации, выдаваемой Arduino, используют различные устройства вывода информации. К устройствам вывода информации можно отнести TFT дисплей. Он позволяет выводить как графическую, так и текстовую информацию. TFT LCD Shield, который рассматривается в качестве примера такого дисплея, является сенсорным экраном. Это позволяет создавать графические приложения с кнопками на экране и другими компонентами. Возможности данного дисплея ниже продемонстрированы примером приложения, которое позволяет с помощью пальца или стилуса рисовать на дисплее.

Команды, начинающиеся с символа # являются директивами компилятора и обрабатываются компилятором, до загрузки программы в контроллер. Директива #define – Макрокоманда, макроопределение или мáкрос – программный алгоритм действий, записанный пользователем. Позволяет создавать, переопределять различные выражения, команды и константы.

Для начала работы с данным дисплеем, необходимо установить следующие библиотеки:

Рисунок 15. Сенсорный дисплей Arduino

#include <Adafruit_GFX.h>    // Библиотека графического ядра
#include <Adafruit_TFTLCD.h> // Библиотека дисплея
#include <TouchScreen.h>// Библиотека для работы с сенсором
#if defined(__SAM3X8E__)
#undef __FlashStringHelper::F(string_literal)
#define F(string_literal) string_literal
#endif
#define YP A3
#define XM A2
#define YM 9
#define XP 8
//Калибровка сенсора
#define TS_MINX 150
#define TS_MINY 120
#define TS_MAXX 920
#define TS_MAXY 940
//Инициализация сенсорного экрана
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);
//Назначение выводов дисплея
#define LCD_CS A3
#define LCD_CD A2
#define LCD_WR A1
#define LCD_RD A0
#define LCD_RESET A4
int colors[9];//Массив цветов
//Список цветов
#define    BLACK   0x0000
#define    BLUE    0x001F
#define    RED     0xF800
#define    GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF
//Инициализация ЖК-дисплея
Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
#define BOXSIZE 40 //Размер кнопок
#define PENRADIUS 3//Толщина точек при рисовании
int currentcolor;// Выбранный цвет для рисования
void buttons (int x){//Подпрограмма для работы с  кнопками
  for (int i=0; i<6; i++){//В цикле определяется номер кнопки, в которую попадает координата нажатия
    tft.fillRect(BOXSIZE*i, 0, BOXSIZE, BOXSIZE, colors[i]);
    if ((x>BOXSIZE*i)&(x<BOXSIZE*(i+1))) {
      tft.drawRect(BOXSIZE*i, 0, BOXSIZE, BOXSIZE, RED);//Подцветка кнопки с выбранным цветом.
      currentcolor=colors[i];//Запоминание выбранного цвета
    }
    else tft.drawRect(BOXSIZE*i, 0, BOXSIZE, BOXSIZE, WHITE);
  }
}
void setup() {
  //Заполнение массива цветов
  colors[0]=WHITE;
  colors[1]=BLUE;
  colors[2]=RED;
  colors[3]=GREEN;
  colors[4]=CYAN;
  colors[5]=YELLOW;
  colors[6]=BLACK;
  tft.reset();//Сброс контроллера экрана
  uint16_t identifier = tft.readID();//
  tft.begin(identifier);
  tft.fillScreen(BLACK);//Очистка экрана
  buttons(10);
  pinMode(13, OUTPUT);
}
#define MINPRESSURE 10
#define MAXPRESSURE 1000
void loop(){
  digitalWrite(13, HIGH);
  TSPoint p = ts.getPoint();//Считывание сенсора
  digitalWrite(13, LOW);
  pinMode(XM, OUTPUT);
  pinMode(YP, OUTPUT);
  if (p.z > MINPRESSURE && p.z < MAXPRESSURE) {//Если нажали на сенсор
    p.x = map(p.x, TS_MINX, TS_MAXX, tft.width(), 0);//Считывание координат нажатия
    p.y = map(p.y, TS_MINY, TS_MAXY, tft.height(), 0);
    if (p.y < BOXSIZE) {//Если попадает в область с кнопками с цветами
      buttons(p.x);
    }
    else {// Если попали вне палитры кнопок
      tft.fillCircle(p.x, p.y, PENRADIUS, currentcolor);//рисуется кружок выбранного цвета в нажатой точке
    }
  }
}

Windows на Arduino с сенсорным дисплеем