В главе 5.2 мы рассматривали вывод данных, получаемых с датчиков на экран TFT 2.4" Shield. Теперь наv необходимо на экран дисплея выводить и данные о состоянии исполнительных устройств, подключенных к реле. Для этого нам необходимо формировать другие экраны, а также главный экран. Как мы будем делать переходы между экранами? Будем использовать сенсорный экран TFT 2.4" Shield.
Сенсорная часть дисплея использует 4 контакта совместно с ЖКИ:
A1 – TOUCH_YP;
A0 – TOUCH_XM;
D6 – TOUCH XP;
D7 / TOUCH YM.
Для работы с тачскрином будем использовать библиотеку Touch Screen. Рассмотрим какие изменения необходимо внести в код. Во первых подключим библиотеку Touch Screen:
#include "TouchScreen.h"
Создадим объект TouchScreen ts
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);
Создадим новую переменную screen – текущий экран для отображения
int screen=0; // 0 – главное меню
// 1 – датчики
// 2 – реле
// 3 – будильники
Сформируем код для формирования экранов – главного меню (view_display_main() ) и состояния реле (view_display_relays()) – см. листинг 6.2.
Листинг 6.2
// вывод главного экрана
void view_display_main() {
// очистить экран
tft.fillScreen(BLACK);
// вывод заголовка экрана
tft.setTextColor(MAGENTA);
tft.setTextSize(3);
for(int i=0;i<6;i++) {
tft.setCursor(15, xmenu[i]);
tft.print(strM1[i]);
}
}
// вывод экрана с показаниями реле
void view_display_relays() {
// очистить экран
tft.fillScreen(BLACK);
// вывод заголовка экрана
tft.setCursor(10, 15);
tft.setTextColor(MAGENTA);
tft.setTextSize(3);
tft.println("Relays:");
// вывод списка реле
tft.setTextColor(YELLOW);
tft.setTextSize(2);
for(int i=0;i<COUNT_RELAYS;i++) {
tft.setCursor(10, xrelays[i]);
tft.print(strR1[i]);
}
// вывод списка значений
for(int i=0;i<COUNT_RELAYS;i++) {
if(aktiverelays[i]==1) {
Serial.print("COUNT_RELAYS=");Serial.println(i);
if(datarelays[i]==1) {
set_display_data_relay(i,datarelays[i],RED);
}
else {
set_display_data_relay(i,datarelays[i],YELLOW);
}
}
}
// ardyino-kit
tft.setTextSize(3);
tft.setTextColor(MAGENTA);
tft.setCursor(10, 270);
tft.print("arduino-kit");
// вывод для возврата в главное меню
}
А также процедуры для вывода меняющихся значений позиции реле (set_display_data_relay()).
void set_display_data_relay(int pos,float var,unsigned int color) {
tft.setTextSize(2);
tft.setTextColor(color);
tft.setCursor(100, xrelays[pos]);
if(var==0)
tft.print("OFF");
else
tft.print("ON");
}
Теперь нам необходимо в цикле loop() добавить проверку текущего экрана перед выводом показаний на дисплей TFT 2.4" shield-а – листинг 6.3.
Листинг 6.3
void loop() {
……..
// для датчиков
if(fvar<999 && screen==1) {
set_display_data_sensor(teksensor,
datasensors[teksensor],BLACK);
datasensors[teksensor]=fvar;
set_display_data_sensor(teksensor,
datasensors[teksensor],YELLOW);
}
……..
// для реле
// вентилятор
if(aktivesensors[1]==1 && datasensors[1]<999
&& datasensors[1]>LIMIT_DS18B20MAX) {
digitalWrite(pinrelays[2],RELAY_ON);
if( aktiverelays[2]<1 && screen==2)
set_display_data_relay(2,datarelays[2],RED);
aktiverelays[2]=1;
}
else {
digitalWrite(pinrelays[2],RELAY_OFF);
if( aktiverelays[2]>0 && screen==2)
set_display_data_relay(2,datarelays[2],YELLOW);
aktiverelays[2]=0;
}
// помпа
if(aktivesensors[2]==1 && datasensors[2]<999
&& datasensors[1]>MAXVALUESOILMOISTURE 900) {
digitalWrite(pinrelays[1],RELAY_ON);
if( aktiverelays[1]<1 && screen==2)
set_display_data_relay(1,datarelays[1],RED);
aktiverelays[1]=1;
}
else {
digitalWrite(pinrelays[1],RELAY_OFF);
if( aktiverelays[1]>0 && screen==2)
set_display_data_relay(1,datarelays[1],YELLOW);
aktiverelays[1]=0;
}
……..
}
И добавляем код для работы с сенсорным экраном. В основном цикле loop() проверяем, было ли нажатие на экран:
void loop() {
……..
// определяем нажатие на экран
int tt=ts.pressure();
if(tt > MINPRESSURE && tt < MAXPRESSURE) {
Serial.println("touch");
int x=ts.readTouchX();int y=ts.readTouchY();
Serial.print("X = "); Serial.print(x);
Serial.print("\tY = "); Serial.print(y);
pinMode(XM, OUTPUT);pinMode(YP, OUTPUT);
pinMode(XP, OUTPUT);pinMode(YM, OUTPUT);
do_for_touch(x,y,screen) ;
delay(1000);
}
// возврат к назначениям пинов для вывода изображения
pinMode(XM, OUTPUT);pinMode(YP, OUTPUT);
pinMode(XP, OUTPUT);pinMode(YM, OUTPUT);
……..
}
В случае нажатия – проверка попадания в нужную область (в зависимости от текущего экрана отображения) – процедура do_for_touch():
// по нажатии по экрану
// по нажатии по экрану
void do_for_touch(int x,int y,int res) {
// главный экран
if(res==0) {
// на sensors
if(x<370 && x>320 && y<680 && y>280 ) {
screen=1;
view_display_sensors();
}
// на relays
if(x<470 && x>420 && y<680 && y>280 ) {
screen=2;
view_display_relays();
}
}
// экран sensors
else if(res==1) {
// на main
if(x<820 && x>780 && y<800 && y>160 ) {
screen=0;
view_display_main();
Serial.println("00000000000");
}
}
// экран relays
else if(res==2) {
// на main
if(x<820 && x>780 && y<800 && y>160 ) {
screen=0;
view_display_main();
Serial.println("00000000000");
}
}
// экран alarms
else if(res==3) {
;
}
//
else ;
}
Загружаем скетч на плату и переходим по экранам по нажатии на нужные области (рис. 6.4, 6.5, 6.6). Выход на экран главного меню – по нажатии по надписи arduino-kit.
Рис. 6.4. Экран главного меню.
Рис. 6.5. Экран показаний сенсоров.
Рис. 6.6. Экран состояний реле.
Далее нам необходимо добавить код включения лампы по нажатии по сенсорному экрану. Для этого вносим изменения в процедуру do_for_touch(). Добавляем следующий код:
// экран relays
else if(res==2) {
// на main
if(x<820 && x>780 && y<800 && y>160 ) {
screen=0;
view_display_main();
}
// ON / OFF лампы
else if(x<290 && x>270 && y<520 && y>440 ) {
set_display_data_relay(0,datarelays[0],BLACK);
datarelays[0]=1-datarelays[0];
if(datarelays[0]==0) {
digitalWrite(pinrelays[1],RELAY_OFF);
set_display_data_relay(0,datarelays[0],YELLOW);
}
else {
digitalWrite(pinrelays[1],RELAY_ON);
set_display_data_relay(0,datarelays[0],RED);
}
}
}
// экран alarms
Теперь мы можем управлять включением/выключением лампы нажатием по сенсорному экрану.
Скачать данный скетч можно на сайте www.arduino-kit.ru по ссылке.