6.3. Отображение данных о статусе исполнительных устройств на экране дисплея и управление с помощью сенсора
В главе 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 по ссылке.



1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33 


Вверх