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