Auteur Sujet: Shield TFT 2,4" sur UNO  (Lu 17292 fois)

msport

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 2217
  • HO avec DCC++ en DIY Réseaux très éphémères
    • Voir le profil
Shield TFT 2,4" sur UNO
« le: mai 22, 2019, 10:23:03 pm »
Bonsoir,je tente de mettre en œuvre cet écran tactile TFT 2.4" 320x240 ILI2940 dont les exemples fournis dans MCUFRIEND_kbv fonctionnent.
https://www.ebay.fr/itm/2-4-TFT-UNO-R3-LCD-Shield-Touch-Panel-Module-TF-Reader-For-Arduino-SD/153128651723
Il utilise la bibliothèque MCUFRIEND_kbv :
https://github.com/prenticedavid/MCUFRIEND_kbv
Je bute sur l'exemple multi boutons peut être parce qu'il doit être personnalisé.
Le button_simple.ino est OK
Le button_list.ino ci-dessous ne compile pas :
button_list:81:20: error: 'Adafruit_GFX_Button' was not declared in this scope
 bool update_button(Adafruit_GFX_Button *b, bool down)
                    ^
button_list:81:41: error: 'b' was not declared in this scope
A priori Adafruit_GFX contient la classe Adafruit_GFX_Button
Ma maitrise toute relative du C ne va pas au delà et une aide serait la bienvenue.
Merci.

/* an alternative approach.   swap the #if 1 / 0 values to try it
 *
 */
#if 1

#include <Adafruit_GFX.h>
#include <MCUFRIEND_kbv.h>
MCUFRIEND_kbv tft;
#include <TouchScreen.h>
#define MINPRESSURE 200
#define MAXPRESSURE 1000

// ALL Touch panels and wiring is DIFFERENT
// copy-paste results from TouchScreen_Calibr_native.ino
const int XP = 6, XM = A2, YP = A1, YM = 7; //ID=0x9341
const int TS_LEFT = 907, TS_RT = 136, TS_TOP = 942, TS_BOT = 139;

TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);

Adafruit_GFX_Button on_btn, off_btn;

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;
}

#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF

void setup(void)
{
    Serial.begin(9600);
    uint16_t ID = tft.readID();
    Serial.print("TFT ID = 0x");
    Serial.println(ID, HEX);
    Serial.println("Calibrate for your Touch Panel");
    if (ID == 0xD3D3) ID = 0x9486; // write-only shield
    tft.begin(ID);
    tft.setRotation(0);            //PORTRAIT
    tft.fillScreen(BLACK);
    on_btn.initButton(&tft,  60, 200, 100, 40, WHITE, CYAN, BLACK, "ON", 2);
    off_btn.initButton(&tft, 180, 200, 100, 40, WHITE, CYAN, BLACK, "OFF", 2);
    on_btn.drawButton(false);
    off_btn.drawButton(false);
    tft.fillRect(40, 80, 160, 80, RED);
}

/* 
 * updating multiple buttons from a list
 *
 * anything more than two buttons gets repetitive
 *
 * you can place button addresses in separate lists
 * e.g. for separate menu screens
 */

// Array of button addresses to behave like a list
Adafruit_GFX_Button *buttons[] = {&on_btn, &off_btn, NULL};

/* update the state of a button and redraw as reqd
 *
 * main program can use isPressed(), justPressed() etc
 */
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;
}

/* most screens have different sets of buttons
 * life is easier if you process whole list in one go
 */
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;
}

/* compare the simplicity of update_button_list()
 */
void loop(void)
{
    update_button_list(buttons);  //use helper function
    if (on_btn.justPressed()) {
        tft.fillRect(40, 80, 160, 80, GREEN);
    }
    if (off_btn.justPressed()) {
        tft.fillRect(40, 80, 160, 80, RED);
    }
}
#endif

Cordialement

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1714
    • Voir le profil
Re : Shield TFT 2,4" sur UNO
« Réponse #1 le: mai 22, 2019, 11:55:26 pm »
Bonsoir,

Je ne sais pas trop. J'ai installé MCUFRIEND_kbv, Adafruit_GFX et Adafruit_TouchScreen via le gestionnaire de bibliothèques et button_list compile.
Cordialement

msport

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 2217
  • HO avec DCC++ en DIY Réseaux très éphémères
    • Voir le profil
Re : Shield TFT 2,4" sur UNO
« Réponse #2 le: mai 23, 2019, 11:28:19 am »
Bonjour et merci pour la réponse,
j’imagine un conflit de bibliothèques.
Je vais tester sur un autre PC.
Cordialement

msport

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 2217
  • HO avec DCC++ en DIY Réseaux très éphémères
    • Voir le profil
Re : Shield TFT 2,4" sur UNO
« Réponse #3 le: mai 23, 2019, 01:10:43 pm »
Très curieux, le problème était lié à la cohabitation des deux sketches dans le répertoire button_simple.
button_list.ino placé seul dans le répertoire correspondant, compile (et fonctionne) avec juste des warnings liés à des conversions non autorisées.
Cordialement