Сенсорный экран и использование его в быту

Тема в разделе "Arduino & Shields", создана пользователем Евгений_KRD, 20 ноя 2015.

  1. Всем привет! Вот дождался прибыл ко мне TFT дисплей 2,4 дюйма. Первое что хотелось бы реализовать на нем это использование его как обычного выключателя света. Кто знает как сделать буду благодарен за информацию, так как я не понимаю как управлять устройствами с Ардуино, если экран занимает все входы и выходы. В частности пока надо вывести на экран две кноки вкл и выкл и присобачить к этому реле. Arduino uno
    НЕ НАДО ПОДНИМАТЬ ЭТИ ВОПРОСЫ Про то что глупая затея и зачем тебе это надо прошу не писать. Планируется в дальнейшем управление системами дома с панелек установленных вместо выключателей в стене, они не дороги и могут быть намного функциональнее обычных выключателей. Про телефон знаю, что можно и с него управлять, эти экраны лишь часть системы и должны быть в стене.
     

    Вложения:

  2. An4ous

    An4ous Нерд

    я сам ковырялся с этим вопросом, кое что набросал для примера. но под экран 480:320
    для отображения русских букв подключи либу. которую прикрепил к сообщению.
    а для управления нагрузкой надо реле подключать.
    По поводу подключения пинов самому интересно, но УНО для этих целей врятли годится, дисплей занимает 8 бит, и ножек практически не остается, но говорю не уверенно) сам начинающий. но если использовать SD ног не останется точно)

    Код (C++):
     
    #include <Adafruit_GFX.h>    // Core graphics library
    #include <MCUFRIEND_kbv.h>
    #include <TouchScreen.h>
    #include <EEPROM.h>
    #include <printrus.h>

    //тач скрин
    #define YP A1  // must be an analog pin, use "An" notation!
    #define XM A2  // must be an analog pin, use "An" notation!
    #define YM 7   // can be a digital pin
    #define XP 6   // can be a digital pin
    TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);


    #define  BLACK   0x0000
    #define BLUE    0x001F
    #define RED     0xF800
    #define GREEN   0x07E0
    #define CYAN    0x07FF
    #define MAGENTA 0xF81F
    #define YELLOW  0xFFE0
    #define WHITE   0xFFFF
    #define TEST            0x1BF5
    #define JJCOLOR         0x1CB6  //ораньжевый
    #define JJORNG          0xFD03

    int homePage;
    int settings;
    int blv;
    int barv;
    int backlightbox;
    int press=0; //меняем цвет при нажатии

    //настройка тача
    #define TS_MINX 190
    #define TS_MINY 130
    #define TS_MAXX 860
    #define TS_MAXY 900

    //чувствительность нажатия на тач
    #define MINPRESSURE 10
    #define MAXPRESSURE 1000
    #define LCDROTATION 0


    int ledPin = 11;

    MCUFRIEND_kbv tft;

    void setup(void) {
    Serial.begin(9600);
      Serial.println(F("TFT LCD test"));
      pinMode(ledPin, OUTPUT);
      tft.reset();
      tft.begin(0x9488);
      tft.fillScreen(BLACK);
      tft.setRotation(LCDROTATION);
      blv = EEPROM.read(1);
      tft.setTextColor(WHITE);

      home();

    }

    void home(){

    homePage=1; //главная активна
    /////////////////////////////////////   1 ///////////////////////
       tft.setTextSize(2);
      // tft.fillRect(0,0,320,87, BLUE);
      // tft.drawRect(0,0,320,87, WHITE);
       tft.setCursor(100,10);
       tft.println(utf8rus("Разетка 1"));
      tft.setTextSize(3);
      tft.drawRect(20,40,130,45, CYAN);   //ободок кнопки 1
      tft.drawRect(170,40,130,45, CYAN);  //ободок кнопки 2
      tft.fillRect(21,41,128,43, JJORNG); // кнопка 1
      tft.fillRect(171,41,128,43, JJORNG); //кнопка 2
      tft.setCursor(60,53);
      tft.println(utf8rus("Вкл"));
      tft.setCursor(200,53);
      tft.println(utf8rus("Выкл"));

    ////////////////////////////////    2    ///////////////////////////
       tft.setTextSize(2);
       //tft.fillRect(0,90,320,72, BLUE);
       //tft.drawRect(0,90,320,72, WHITE);
       tft.setCursor(100,93);
       tft.println(utf8rus("Разетка 2"));
       tft.setTextSize(3);
      tft.drawRect(20,115,130,45, CYAN);   //ободок кнопки 3
      tft.drawRect(170,115,130,45, CYAN);  //ободок кнопки 4
      tft.fillRect(21,116,128,43, JJORNG); //кнопка 3
      tft.fillRect(171,116,128,43, JJORNG); //кнопка 4
      tft.setCursor(60,128);
      tft.println(utf8rus("Вкл"));
      tft.setCursor(200,128);
      tft.println(utf8rus("Выкл"));


    /////////////////////////////////////   3 ///////////////////////
       tft.setTextSize(2);
      // tft.fillRect(0,165,320,72, BLUE);
       //tft.drawRect(0,165,320,72, WHITE);
       tft.setCursor(100,167);
       tft.println(utf8rus("Разетка 3"));
       tft.setTextSize(3);
      tft.drawRect(20,190,130,45, CYAN);  //ободок кнопки 5
      tft.drawRect(170,190,130,45, CYAN); //ободок кнопки 6
      tft.fillRect(21,191,128,43, JJORNG); //кнопка 5
      tft.fillRect(171,191,128,43, JJORNG); //кнопка 6
      tft.setCursor(60,200);
      tft.println(utf8rus("Вкл"));
      tft.setCursor(200,200);
      tft.println(utf8rus("Выкл"));

        }
    void loop() {


      TSPoint p = ts.getPoint();



      //pinMode(XP, OUTPUT);
      pinMode(XM, OUTPUT);
      pinMode(YP, OUTPUT);
    // pinMode(YM, OUTPUT);


        #if LCDROTATION == 0
       if (p.z > MINPRESSURE && p.z < MAXPRESSURE) {
        // scale from 0->1023 to tft.width
      p.x = map(p.x, TS_MINX, TS_MAXX, tft.width(), 0);
      p.y = map(p.y, TS_MINY, TS_MAXY, tft.height(), 0);

        Serial.print("X = "); Serial.print(p.x);
         Serial.print("\tY = "); Serial.print(p.y);
         Serial.print("\tPressure = "); Serial.println(p.z);
       }

        #elif LCDROTATION == 1
        #elif LCDROTATION == 2
        #elif LCDROTATION == 3
    #endif

    if (p.x > 10 && p.x < 100 && p.y > 30 && p.y < 85 && homePage== 1){//кновка 1
      Serial.print("\n pressed button 1 \n");

      press=1;
        if (press==1){
          tft.setTextSize(3);
          tft.fillRect(21,41,128,43, GREEN); // кнопка 1
          tft.setCursor(60,53);
           tft.println(utf8rus("Вкл"));
          delay(150);
          tft.fillRect(21,41,128,43, JJORNG); // кнопка 1
          tft.setCursor(60,53);
          tft.println(utf8rus("Вкл"));
          press=0;
          }

    }


    if (p.x > 115 && p.x < 176 && p.y > 30 && p.y < 85 && homePage== 1){//кновка 2
      Serial.print("\n pressed button 2 \n");

         press=2;
        if (press==2){
          tft.setTextSize(3);
          tft.fillRect(171,41,128,43, GREEN); //кнопка 2
          tft.setCursor(200,53);
          tft.println(utf8rus("Выкл"));
          delay(150);
          tft.fillRect(171,41,128,43, JJORNG); //кнопка 2
          tft.setCursor(200,53);
          tft.println(utf8rus("Выкл"));
          press=0;
          }

    }

      if (p.x > 10 && p.x < 104 && p.y > 121 && p.y < 160 && homePage== 1){//кновка 3
      Serial.print("\n pressed button 3");
        press=3;
        if (press==3){
          tft.setTextSize(3);
          tft.fillRect(21,116,128,43, GREEN); //кнопка 3
          tft.setCursor(60,128);
          tft.println(utf8rus("Вкл"));
          delay(150);
          tft.fillRect(21,116,128,43, JJORNG); //кнопка 3
          tft.setCursor(60,128);
          tft.println(utf8rus("Вкл"));
          press=0;
          }
    }

      if (p.x > 110 && p.x < 198 && p.y > 121 && p.y < 160 && homePage== 1){//кновка 4
      Serial.print("\n pressed button 4");
        press=4;
        if (press==4){
          tft.setTextSize(3);
          tft.fillRect(171,116,128,43, GREEN); //кнопка 4
          tft.setCursor(200,128);
          tft.println(utf8rus("Выкл"));
          delay(150);
          tft.fillRect(171,116,128,43, JJORNG); //кнопка 4
          tft.setCursor(200,128);
          tft.println(utf8rus("Выкл"));
          press=0;
          }
    }

      if (p.x > 22 && p.x < 113 && p.y > 190 && p.y < 235 && homePage== 1){//кновка 5
      Serial.print("\n pressed button 5");
        press=5;
        if (press==5){
          tft.setTextSize(3);
          tft.fillRect(21,191,128,43, GREEN); //кнопка 5
          tft.setCursor(60,200);
          tft.println(utf8rus("Вкл"));
          delay(150);
          tft.fillRect(21,191,128,43, JJORNG); //кнопка 5
          tft.setCursor(60,200);
          tft.println(utf8rus("Вкл"));
          press=0;
          }
    }

      if (p.x > 120 && p.x < 228 && p.y > 190 && p.y < 235 && homePage== 1){//кновка 6
      Serial.print("\n pressed button 6");
        press=6;
        if (press==6){
          tft.setTextSize(3);
          tft.fillRect(171,191,128,43, GREEN); //кнопка 6
          tft.setCursor(60,53);
          tft.println(utf8rus("Вкл"));
          delay(150);
          tft.fillRect(171,191,128,43, JJORNG); //кнопка 6
          tft.setCursor(200,200);
          tft.println(utf8rus("Выкл"));
          press=0;
          }
     
      settings=1;
      tft.fillRect(0,0,320,480, BLACK);
      settingsscr();
    }

        // backlight buttons
        if (p.y >25 && p.y < 65 && p.x > 0 && p.x < 45 && settings == 1) {
            Serial.print("\n pressed button backlight --");
            Serial.print("\n ");
            blightdown();
        }

        if (p.y > 25 && p.y < 67 && p.x > 150 && p.x < 180 && settings == 1) {
            Serial.print("\n pressed backlight ++");
            Serial.print("\n ");
            blightup();
        }

        if (p.y > 147 && p.y < 195 && p.x > 54 && p.x < 160 && settings == 1) { // exit settings page
            tft.fillRect(0,0,320,480, BLACK);
           // tft.
            settings=0; // вышли из натсроек
            homePage=1; // активируем главноге меню
           // EEPROM.write(1, esleep);//
            EEPROM.write(1, blv); // сохраняет в первую ячейку памяти значение blv
            tft.setCursor(60,240);
            tft.setTextSize(4);
            tft.print(utf8rus("Сохранено"));
            delay(1000);
            tft.fillRect(0,0,320,480, BLACK);
            home(); //
          }

    }




    void settingsscr() {
      homePage=0;
      settings=1;
      // backlight level
      tft.setTextColor(WHITE);
      tft.setTextSize(3);
      tft.fillRect(0, 20, 60, 50, RED);
      tft.drawRect(0, 20, 60, 50, WHITE);
      tft.drawRect(80, 20, 160, 50, JJCOLOR);
      tft.fillRect(260, 20, 60, 50, GREEN);
      tft.drawRect(260, 20, 60, 50, WHITE);
      tft.setCursor(22, 33);
      tft.print("-");
      tft.setCursor(282, 33);
      tft.print("+");
      tft.setTextSize(1);
      tft.setCursor(120, 31);
      tft.print("Backlight Level");
      tft.drawRect(110, 48, 100, 10, WHITE);
      blbar();
      // sleep time
      tft.setTextSize(3);
      tft.fillRect(0, 80, 60, 50, RED);
      tft.drawRect(0, 80, 60, 50, WHITE);
      tft.drawRect(80, 80, 160, 50, JJCOLOR);
      tft.fillRect(260, 80, 60, 50, GREEN);
      tft.drawRect(260, 80, 60, 50, WHITE);
      tft.setCursor(22, 93);
      tft.print("-");
      tft.setCursor(282, 93);
      tft.print("+");
      tft.setTextSize(1);
      tft.setCursor(130, 91);
      tft.print("Sleep Time");

      //save and exit
      tft.drawRect(80, 140, 160, 50, JJCOLOR);
      tft.setCursor(120, 160);
      tft.print("Save and Exit");

    }
    void blbar() { // this function fills the yellow bar in the backlight brightness adjustment
      if (blv < barv) {
        tft.fillRect(111, 49, 98, 8, BLACK);
      }
      backlightbox = map(blv, 1, 255, 0, 98);
      tft.fillRect(111, 49, backlightbox, 8, YELLOW);
      barv = blv;
      delay(5);
    }
    void blightup() { // increase the backlight brightness
      blv = blv + 1;
      if (blv >= 255) {
        blv = 255;
      }
      analogWrite(ledPin, blv);
      blbar();
    }
    void blightdown() { // decrease the backlight brightness
      blv = blv - 1;
      if (blv <= 1) {
        blv = 1;
      }
      analogWrite(ledPin, blv);
      blbar();
    }


     
     

    Вложения:

    • printrus.h
      Размер файла:
      679 байт
      Просмотров:
      899
    Последнее редактирование: 23 ноя 2015
  3. Salk

    Salk Гик

    An4ous
    Дисплейчик у вас вроде такого, можно полюбопытствовать :)
    Ещё хотелось уточнить про работу тача, он адекватно себя ведет, как со стабильностью его работы и точностью позиционирования?
    Я правильно понял из кода, что вот эти условия отвечают за нажатия в конкретное место дисплея по координатам?
    Код (C++):
    if (p.x > 120 && p.x < 228 && p.y > 190 && p.y < 235 && homePage== 1){//кновка 6
    Со временем хочу заказать такой дисплейчик с тачем, а пока собираю информацию про них.
     
  4. An4ous

    An4ous Нерд

    именно такой) ну дисплейчик первый так что сравнивать несчем. но кнопки работают отлично, как и сам тач.
    Да, когда все условия выполнены кнопка срабатывает, и добавил переменную, с ее помощью можно организовать подменю) пример тому 6я кнопка. там хотелось бы реализовать подсветку дисплея на шим. но дисплей не поддерживает его. и еще если будете брать именно на МК ILI9488 как по ссылке, то используйте библиотеку MCUFRIEND_kbv а не Adafruit_TFTLCD. 2я либа работает в 2 раза медленнее, первая довольно шустрая)
     
    Salk нравится это.
  5. An4ous

    An4ous Нерд

    а какую библиотеку вы использовали? у меня такой же дисплейчик, но не знаю на каком чипе он, пришел с китая с треснутым сенсором, я так его и забросил не включив даже
     
    Последнее редактирование: 20 ноя 2015
  6. Salk

    Salk Гик

    Спасибо, большое :)
     
  7. Добрый день. Можете подсказать какие-нибудь обучающие статьи по работе с дисплеями. Особенно интересуют примеры создания меню на дисплее. Заранее, спасибо.