Отображение данных о статусе исполнительных устройств на экране дисплея и управление с помощью сенсора




Нам необходимо на экран дисплея выводить и данные о состоянии исполнительных устройств, подключенных к реле. Для этого нам необходимо формировать другие экраны, а также главный экран. Как мы будем делать переходы между экранами? Будем использовать сенсорный экран 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). Выход на экран главного меню –

Далее нам необходимо добавить код включения лампы по нажатии по сенсорному экрану. Для этого вносим изменения в процедуру 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

 

Теперь мы можем управлять включением/выключением лампы нажатием по сенсорному экрану.

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2020-06-03 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: