Touch Screen ILI9486: metodi e parametri

ATTENZIONE: questo è un re-post di una domanda in Inglese inserita in International/Display. Per qualche motivo la domanda appare in grigio nella lista e non ricevo risposte, e nemmeno insulti :slight_smile:, quindi magari qualcosa è andato storto.
La rimando semplificata in Italiano, così forse è più chiara per voi, non solo per me.

Giocando per imparare con lo scketch MCUFRIEND:kbv/button_list ho creato una serie di bottoni sul display. Vorrei, se è possibile, che quando un bottone viene premuto esso cambi colore di fondo (e di testo) in modo stabile, per tutto il tempo della pressione, senza continuare a lampeggiare.

Le domande sono due:

  • il costruttore del 'button' non espone metodi per ridisegnare il bottone, tipo Redraw o Fill, eil metodo DrawButton lo disegna sempre con lo stesso colore definito oppure vuoto se 'false'; quindi?
  • lo stato del bottone può essere solo 'pressed' o 'justPressed' (tralascio 'JustReleased'; non utile qui); a parte che non capisco la differenza tra i due stati perchè 'justPressed' si ripresenta ad ogni lettura mentre mi aspetterei che diventasse 'pressed' dopo la prima volta, sarebbe credo utile avere anche uno stato 'stable' per evitare di ridisegnare in continua il bottone, sempre ammesso che sia possibile il ridisegno.

Sbaglio io qualcosa o c'è qualche strada da seguire (non troppo complessa perchè sono nuovo in Arduino) ?
Questo è il mio codice derivato dall'esempio:

#include <Adafruit_GFX.h>
#include <MCUFRIEND_kbv.h>

#include <TouchScreen.h>
#define MINPRESSURE 200
#define MAXPRESSURE 1000
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
const int XP = 6, XM = A2, YP = A1, YM = 7;  //ID=0x9341
const int TS_LEFT = 928, TS_RT = 182, TS_TOP = 962, TS_BOT = 180;

TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);
MCUFRIEND_kbv tft;
Adafruit_GFX_Button btn0, btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8, btn9;

int pixel_x, pixel_y;  //Touch_getXY() updates global vars
bool Touch_getXY(void) {
  TSPoint p = ts.getPoint();
  pinMode(YP, OUTPUT);  //restore shared pins
  pinMode(XM, OUTPUT);
  digitalWrite(YP, HIGH);  //because TFT control pins
  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() {
  Serial.begin(9600);
  uint16_t ID = tft.readID();
  if (ID == 0xD3D3) ID = 0x9486;  // write-only shield
  tft.begin(ID);
  tft.setRotation(0);  //PORTRAIT
  tft.fillScreen(BLACK);

  btn0.initButton(&tft, 150, 350, 80, 40, WHITE, CYAN, BLACK, "0", 2);
  btn1.initButton(&tft, 60, 200, 80, 40, WHITE, CYAN, BLACK, "1", 2);
  btn2.initButton(&tft, 150, 200, 80, 40, WHITE, CYAN, BLACK, "2", 2);
  btn3.initButton(&tft, 240, 200, 80, 40, WHITE, CYAN, BLACK, "3", 2);
  btn4.initButton(&tft, 60, 250, 80, 40, WHITE, CYAN, BLACK, "4", 2);
  btn5.initButton(&tft, 150, 250, 80, 40, WHITE, CYAN, BLACK, "5", 2);
  btn6.initButton(&tft, 240, 250, 80, 40, WHITE, CYAN, BLACK, "6", 2);
  btn7.initButton(&tft, 60, 300, 80, 40, WHITE, CYAN, BLACK, "7", 2);
  btn8.initButton(&tft, 150, 300, 80, 40, WHITE, CYAN, BLACK, "8", 2);
  btn9.initButton(&tft, 240, 300, 80, 40, WHITE, CYAN, BLACK, "9", 2);
  
  btn0.drawButton(false);
  btn1.drawButton(false);
  btn2.drawButton(false);
  btn3.drawButton(false);
  btn4.drawButton(false);
  btn5.drawButton(false);
  btn6.drawButton(false);
  btn7.drawButton(false);
  btn8.drawButton(false);
  btn9.drawButton(false);
}

// Array of button addresses to behave like a list
Adafruit_GFX_Button *buttons[] = { &btn0, &btn1, &btn2, &btn3, &btn4, &btn5, &btn6, &btn7, &btn8, &btn9, NULL };

bool update_button(Adafruit_GFX_Button *b, bool down) {
  b->press(down && b->contains(pixel_x, pixel_y));
  if (b->justReleased()) {
    b->drawButton(false);
  }
  if (b->justPressed()) {
    b->drawButton(true);
  }
  return down;
}

bool update_button_list(Adafruit_GFX_Button **pb) {
  bool down = Touch_getXY();
  for (int i = 0; pb[i] != NULL; i++) {
    update_button(pb[i], down);
  }
  return down;
}


void loop() {
  update_button_list(buttons);  //use helper function
  for (int i = 0; buttons[i] != NULL; i++) {
    if (buttons[i]->isPressed()) {
      Serial.print("Btn ");
      Serial.println(i);
      buttons[i]->drawButton(true);
//      buttons[i].fill(RED); // <=== QUI vorrei cambiare il colore
    }
    if (buttons[i]->justReleased()) {
      buttons[i]->drawButton(false);
    }
  }
}

Grazie

Buongiorno,

intanto, cortesemente, come prima cosa, leggi attentamente il REGOLAMENTO di detta sezione, (... e, per evitare future possibili discussioni/incomprensioni, prestando molta attenzione al punto 15), dopo di che, come da suddetto regolamento, fai la tua presentazione NELL'APPOSITA DISCUSSIONE spiegando bene quali esperienze hai in elettronica e programmazione, affinché noi possiamo conoscere la tua esperienza ed esprimerci con termini adeguati.

Detto questo, in conformità al punto 13 del succitato regolamento, ti rammento che il cross-posting è proibito (anche tra lingue diverse) e tu hai già posto la stessa/simile domanda QUI discussione che vedo attiva. Non solo, in quella discussione ti stanno già rispondendo (hai già ricevuto risposte dagli utenti "sterretje" e "Railroader") ed è veramente poco carino abbandonare una discussione e chi ti stava aiutando, per venire di qua a porre la stessa domanda … :roll_eyes:

Quindi, per rispetto verso chi ha già cominciato ad aiutarti, questa tua discussione duplicata viene chiusa e ti prego di continuare dove avevi cominciato.

Grazie,

Guglielmo

P.S.: Ho verificato con l'account di un altro utente (un utente senza diritti di moderazione o di amministrazione) ed il thread è tranquillamente visibile, aperto ed accessibile. Addirittura è visibile e leggibile anche senza aver fatto "login". Probabilmente dovresti sollecitare qualche risposta per riportare l'attenzione su di esso ... :roll_eyes: