Ajouter des fonctions librairie écran TFT arduino

qui sont présente dans le driver mais pas implémentées dans la librairie

a marqué ce sujet comme résolu.

Bonjour à tous,

Je suis en train de bidouiller avec un arduino et l’écran TFT tactile, celui-ci est un KUMAN acheté sur Amazon il y’a quelques temps, il était livré avec CD contenant des exemples, les librairies et la doc du driver, avec les commandes prises en charge par ce dernier.

Or dans la librairie MCUFRIEND_kbv qui est fourni avec, et qui utilise elle-même les librairies ADAFRUIT_GFX, Adafruit_TFTLCD et TouchScreen, certaines fonctions comme par exemple, le contrôle du rétroéclairage ou la mise en veille de l’écran ne sont pas implémentés, bien que présente dans la doc du driver. J’ai donc entrepris en m’aidant de la doc et en m’inspirant des fonctions déjà présente, de les implémenter moi-même. Celle-ci sont bien reconnues par l’IDE Arduino et le code compile sans problème, mais cela ne fonctionne pas convenablement, par exemple la mise en veille s’arrête à l’écran blanc, étape en effet décrite dans la doc du driver, mais ne continue pas, et la fonction d’allumage ou d’extinction du rétroéclairage ne fait rien du tout.

Voilà les fichiers présent dans le CD (non modifiés) : https://1fichier.com/?2k8ge45nuxxszsbwczc7 La doc du driver se trouve dans "Documents" : "Driver chip ILI9486.pdf" et les librairies dans "Arduino Demo_UNO&Mega2560/Install libraries"

Et les modifications que j’ai réalisées :

J’ai ajouté dans le fichier MCUFRIEND_kbv.h :

void     sleepIn(void);
void     sleepOut(void);
void     backlightOff(void);
void     backlightOn(void);

dans le fichier MCUFRIEND_kbv.cpp

void MCUFRIEND_kbv::sleepIn(void){
    CS_ACTIVE;
    WriteCmd(0x10);
    WriteData(0x00);
    CS_IDLE;
}

void MCUFRIEND_kbv::sleepOut(void){
    CS_ACTIVE;
    WriteCmd(0x11);
    WriteData(0x00);
    CS_IDLE;
}

void MCUFRIEND_kbv::backlightOff(void){
    CS_ACTIVE;
    WriteCmd(0x53);
    WriteData(0x00);
    CS_IDLE;
}

void MCUFRIEND_kbv::backlightOn(void){
    CS_ACTIVE;
    WriteCmd(0x53);
    WriteData(0x4);
    CS_IDLE;
}

Et voici le code de l’Arduino que j’utilise pour mes tests :

#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_TFTLCD.h> // Hardware-specific library
#include <TouchScreen.h>

#define LCD_CS A3 // Chip Select goes to Analog 3
#define LCD_CD A2 // Command/Data goes to Analog 2
#define LCD_WR A1 // LCD Write goes to Analog 1
#define LCD_RD A0 // LCD Read goes to Analog 0

#define LCD_RESET A4 // Can alternately just connect to Arduino's reset pin

#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 YP A2  // must be an analog pin, use "An" notation!
#define XM A3  // must be an analog pin, use "An" notation!
#define YM 8   // can be a digital pin
#define XP 9   // can be a digital pin

#define TS_MINX 130
#define TS_MAXX 905

#define TS_MINY 75
#define TS_MAXY 930

#define MINPRESSURE 10
#define MAXPRESSURE 1000

#include <MCUFRIEND_kbv.h>
MCUFRIEND_kbv tft;
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);

boolean inSleepMode = false;

void init_screen(){
  tft.fillScreen(BLACK);
  tft.setCursor(0, 0);
  
  tft.setTextColor(RED);  tft.setTextSize(6);
  tft.println("Hello World!");
}

void setup(void) {
  Serial.begin(9600);

  tft.reset();

  uint16_t identifier = tft.readID();
  tft.begin(identifier);
  tft.setRotation(1);

  init_screen();
}

void loop(void) {
  if(Serial.available() > 0){
    while(Serial.available() > 0){
      String command = Serial.readString();
      Serial.println(command);
      Serial.println(command == "SLEEP");
      if(command == "SLEEP"){
        enter_sleepMode();
      } 
    }
  }
}

void enter_sleepMode(){
  tft.sleepIn();
  inSleepMode = true;
  sleep_mode();
}

void sleep_mode(){
  boolean touch = false;
  while(!touch){
    digitalWrite(13, HIGH);
    TSPoint p = ts.getPoint();
    digitalWrite(13, LOW);
    pinMode(XM, OUTPUT);
    pinMode(YP, OUTPUT);
    
    if (p.z > MINPRESSURE && p.z < MAXPRESSURE) {
      touch = true;   
    }
  }
  inSleepMode = false;
  tft.sleepOut();
  //init_screen();
}

Est-ce que l’un.e d’entre vous aurait déjà réaliser ce genre de modifications ou alors y’a t’il une erreur flagrante qui fait que ça foire.

Merci d’avance,

Corentin

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte