Сенсорная кнопка на экране TFT

Привет народ с наступающим Новым Годом.
Проблема такая,нужно создать сенсорные кнопки с изменением цвета и надписи ON и OFF.
Есть в Adafruit_GFX пример с кнопками ,но с раздельными ON и OFF попытался из них сделать
одну ,в принципе работает.Не могу только поменять цвет кнопки и надпись,с этим проблема,что я делаю не так?Цвет должен быть зеленым или красным по факту кнопка желтая,получается оба цвета включены вместе.И даже отключив строки с ON ,OFF надпись OFF остается.

#include "Adafruit_GFX.h"
#include "MCUFRIEND_kbv.h"
#include "TouchScreen.h" // only when you want to use touch screen 

#define BLACK   0x0000
#define NAVY 0x000F
#define DARKGREEN 0x03E0
#define DARKCYAN 0x03EF
#define MAROON 0x7800
#define PURPLE 0x780F
#define OLIVE 0x7BE0
#define LIGHTGREY 0xC618
#define DARKGREY 0x7BEF
#define BLUE 0x001F
#define GREEN 0x07E0
#define CYAN 0x07FF
#define RED 0xF800
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
#define ORANGE 0xFD20
#define GREENYELLOW 0xAFE5
#define PINK 0xF81F

#define MINPRESSURE 200
#define MAXPRESSURE 1000

#define TS_MINX 900
#define TS_MAXX 100
#define TS_MINY 70
#define TS_MAXY 900

int pixel_x, pixel_y;     //Touch_getXY() updates global vars

// Making TFT object
MCUFRIEND_kbv tft(A3, A2, A1, A0, A4);

const int XP = 9, XM = A3, YP = A2, YM = 8; //ID=0x9488
const int TS_LEFT = 106, TS_RT = 930, TS_TOP = 77, TS_BOT = 926;
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);
boolean flag=1;  

//char t();
char *label = ("ON", "OFF");
char fill =GREEN;
Adafruit_GFX_Button on_off_btn;
boolean P_ON = false;
char z();
bool Touch_getXY(void)
{
  TSPoint p = ts.getPoint();
  pinMode(YP, OUTPUT);      //восстановить общие пин-коды
  pinMode(XM, OUTPUT);
  digitalWrite(YP, HIGH);   //потому что управляющие контакты TFT
  digitalWrite(XM, HIGH);
  bool pressed = (p.z > MINPRESSURE && p.z < MAXPRESSURE);
  if (pressed) {
    pixel_x = map(p.x, TS_LEFT, TS_RT, 0, tft.width()); //.kbv makes sense to me
    pixel_y = map(p.y, TS_TOP, TS_BOT, 0, tft.height());
  }
  return pressed;
}

void setup(void) {
  uint16_t ID;
  ID = tft.readID();
  tft.begin(ID);
  tft.setRotation(0);
  tft.invertDisplay(true);
  tft.fillScreen(WHITE);
  tft.fillRect(40, 80, 160, 80, RED);
   on_off_btn.initButton(&tft,  60, 240, 100, 60, WHITE, fill, BLACK, label , 2);
   on_off_btn.drawButton(false);
}

void loop() {
  bool down = Touch_getXY();
   
  //on_off_btn.initButton(&tft,  60, 240, 100, 60, WHITE, fill, BLACK, label , 2);
  
 // on_off_btn.drawButton(false);
  
  on_off_btn.press(down && on_off_btn.contains(pixel_x, pixel_y));

  if (P_ON == false) {
    pinMode(XM, OUTPUT);
    pinMode(YP, OUTPUT);

    if (on_off_btn.justReleased())
      on_off_btn.drawButton();
    if (on_off_btn.justPressed()) {
      on_off_btn.drawButton(false);

      P_ON = true;
      char fill =GREEN;
      tft.fillRect(40, 80, 160, 80, GREEN);
       char *label='OFF';     
    }
  }
  else {
    pinMode(XM, OUTPUT);
    pinMode(YP, OUTPUT);

    if (on_off_btn.justReleased())
      on_off_btn.drawButton();
    if (on_off_btn.justPressed()) {
      on_off_btn.drawButton(true);


      P_ON = false;
      char fill =RED;
      tft.fillRect(40, 80, 160, 80, RED);
      char *label = 'ON';
    
    }
  }
}




[/code] ```

интересно, что бы это значило?

и эта комбинация тоже неплоха :slight_smile:

#define GREEN 0x07E0
char fill =GREEN;

ТС, вы в курсе, что 0x07E0 это не просто цифирьки?

а что это - я просто теряюсь.
Можно было бы подумать, что это прототип функции с возвращаемым типом char - но такой функции в коде нет и я почти уверен, что ТС имел в виду что-то совсем иное.

=======
ТС, ответьте мне как художник художнику - вы программировать умеете? - только честно

По сути проблемы - у вас есть обьект кнопки on_off_btn. У этого обьекта есть свойства - надпись, цвет, состояние и тд. И если вам хочется менять цвет кнопки - устанавливать его надо через свойства этого обьекта, а не закрашивая кнопку как прямоугольник методом fill - это же бредятина…

Впрочем, на фоне того что вы даже не знаете, что такое char - остальное цветочки

Потому что char t(); не проканало.

Спойлер

Пусть число танков равно N. Нет, N - мало. Пусть число танков равно Z

1 лайк

char *label это из Adafruit_GFX ,так обозначен выводящий текст в строке рисования кнопки
char fill это тоже оттуда но отвечает за цвет заполнения
char z(); это просто заготовка пробовал подставлять ON OFF
tft.fillRect(40, 80, 160, 80, GREEN); -это из примера там 2 кнопки при нажатии на которые эта область меняет цвет оставлена для контроля работы.
on_off_btn.initButton(&tft, 60, 240, 100, 60, WHITE, fill, BLACK, label , 2);
первые 4 это координаты кнопки далее фон,цвет заливки кнопки,цвет шрифта,текст,размер шрифта.Мне надо менять тест ON-OFF и цвет заливки.Вот тут и есть проблема.ладно продолжим после отпуска на 2 недели уезжаю там компа нет.Всех с Новым Годом.

я не знаю, где вы это видели, но похоже списали вы неправильно, так как большая часть того, что у вас в коде - это бред. Причем бред настолько очевидный, что даже не пытайтесь убедить нас, что “так было в примере”.

Например 16-битный цвет никак нельзя сохранить в 8битный char: