Для отображения информации, выдаваемой 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);//рисуется кружок выбранного цвета в нажатой точке } } }