Problème d'affichage sur un Shield écran tactile 2,8'' TF028

j'ai un problème je veux qu'un Shield écran tactile 2,8'' TF028 positionner sur une carte arduino uno maitre affiche les valeurs du capteur de pollution positionner sur une carte arduino uno esclave grâce a une connexion par I2C. Mais l'écran reste blanc , j'ai fais des tests il marche avec tout type d'affichage (fixe et dynamique) et les valeurs reçus du capteur de pollution son correcte dans le moniteur serie de la carte maitre
voila le code de la carte maitre que j'ai pour l'instant:

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

#define LCD_CS A3
#define LCD_CD A2
#define LCD_WR A1
#define LCD_RD A0
#define LCD_RESET A4

#define BLACK 0x0000
#define WHITE 0xFFFF
#define RED 0xF800

MCUFRIEND_kbv tft;
int valeurI2C = 0;

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

  tft.reset();
  uint16_t identifier = tft.readID();
  if (identifier == 0x0101) identifier = 0x9341;
  tft.begin(identifier);
  tft.setRotation(3);
  tft.fillScreen(BLACK);

  tft.setTextColor(WHITE);
  tft.setTextSize(2);
  tft.setCursor(30, 50);
  tft.println("Valeur I2C:");
}

void loop() {
  // Demande la valeur I2C à l'esclave (adresse 8)
  Wire.requestFrom(8, 2);
  if (Wire.available() == 2) {
    byte highByte = Wire.read();
    byte lowByte = Wire.read();
    valeurI2C = (highByte << 8) | lowByte; // Reconstruction de la valeur

    Serial.print("Valeur I2C reçue : ");
    Serial.println(valeurI2C);

    // **AFFICHAGE TEST SÉCURISÉ**
    tft.setTextColor(RED, BLACK);  // Efface automatiquement l'ancienne valeur
    tft.setTextSize(3);
    tft.setCursor(30, 80);
    tft.print("     ");  // Efface bien la zone avant d'afficher
    tft.setCursor(30, 80);
    tft.print(valeurI2C);
  }

  delay(1000);
}

et celui de la carte esclave:

#include <Wire.h>

#define CAPTEUR_AIR A0  // Broche du capteur de pollution

void setup() {
  Wire.begin(8); // L'esclave utilise l'adresse 8
  Wire.onRequest(sendData); // Définir la fonction de réponse
}

void loop() {
  // Rien dans loop(), l'envoi se fait sur demande du maître
}

void sendData() {
  int valeurCapteur = analogRead(CAPTEUR_AIR); // Lire le capteur
  Wire.write(highByte(valeurCapteur)); // Octet de poids fort
  Wire.write(lowByte(valeurCapteur));  // Octet de poids faible
}

j'aimerais savoir d'où vient le problème car c'est lorsque je veux afficher les valeur en direct du capteur que l'ecran reste blanc.
merci de me dire rapidement si il y a une solution pour que mon code fonctionne.

Ton post ne respect pas les règles du Forum :frowning:
les règles et bonne pratique sont épinglé en début de la section française.

Bonjour,
Les balises de code ne sont pas 3 apostrophes mais 3 backstick.
Le plus simple c'est de cliquer sur l'icone <code/> dans la fenêtre d'édition du message.
Merci de corriger ton message pour rendre le code lisible.

Bonjour
j'ai corriger mon code et je voudrait savoir si vous avez la solution a mon problème.

Si par exemple tu fais

après tft.setTextSize(3);, est-ce que le texte s'affiche correctement?

non rien ne s'affiche l'ecran reste blanc il clignote juste une fois en noir et après plus rien.

Je n'avais pas vérifié le modèle de l'écran.
Cet écran utilise toutes les broches de la UNO (sauf A5). Tu ne peux rien connecter sur la carte lorsque cet écran est utilisé. Vendre cet écran comme pouvant être utilisé avec une UNO est à mon sens à la limite de l'arnaque.
Typiquement, dans ton cas, le fait de brancher un capteur I2C (qui utilise A4 et A5) sur ta carte va poser un problème car A4 sert au Reset de l'écran.

Pour vérifier le bon fonctionnement de l'écran, si tu déconnectes ton capteur et que tu supprimes le code lié à son utilisation l'écran devrait afficher du texte.

oui j'arrive a afficher du texte quand le capteur n'est pas connecter, oui j'ai mal regarder sa description lors de l'achat de l'écran

et il n'y a pas une solution pour le changer le branchement du capteur

Non, l'I2C n'est disponible que sur A4 et A5 et de toutes les façons toutes les broches sont prises.

Si tu n'as pas peur de mettre les mains dans le cambouis, tu peux déplacer le reset de l'écran.
Il faudrait supprimer la broche A4 sur le shield, soit en la coupant, soit en la dessoudant et tirer un fil, sur le shield, vers le reset de la UNO.

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

#define LCD_CS A3
#define LCD_CD A2
#define LCD_WR A1
#define LCD_RD A0
#define LCD_RESET A4

#define BLACK 0x0000
#define WHITE 0xFFFF
#define RED 0xF800

MCUFRIEND_kbv tft;
int valeurI2C = 0;

void setup() {
  Serial.begin(9600);
  Wire.begin();
  eteindreEcran();  // On éteint l'écran au démarrage
}

void loop() {
  // Attendre une nouvelle valeur I2C
  attendreValeurI2C();

  // Allumer l'écran et afficher la valeur reçue
  allumerEcran();
  afficherValeur();

  // Attendre 20 secondes
  delay(10000);

  // Éteindre l'écran après 20 secondes
  eteindreEcran();
}

void attendreValeurI2C() {
  valeurI2C = 0;
  while (valeurI2C == 0) {  // Attente active jusqu'à recevoir une valeur
    Wire.requestFrom(8, 2);
    if (Wire.available() == 2) {
      byte highByte = Wire.read();
      byte lowByte = Wire.read();
      valeurI2C = (highByte << 8) | lowByte; // Reconstruction de la valeur

      Serial.print("Valeur I2C reçue : ");
      Serial.println(valeurI2C);
    }
    delay(500);  // Petite pause pour éviter de bloquer le microcontrôleur
  }
}

void allumerEcran() {
  tft.reset();  // Réinitialise l'écran
  uint16_t identifier = tft.readID();
  if (identifier == 0x0101) identifier = 0x9341;
  tft.begin(identifier);
  tft.setRotation(3);
  tft.fillScreen(BLACK);
}

void afficherValeur() {
  tft.setTextColor(WHITE);
  tft.setTextSize(2);
  tft.setCursor(30, 50);
  tft.println("Valeur I2C:");

  tft.setTextColor(RED, BLACK);
  tft.setTextSize(3);
  tft.setCursor(30, 80);
  tft.print("     ");  // Efface bien la zone avant d'afficher
  tft.setCursor(30, 80);
  tft.print(valeurI2C);
}

void eteindreEcran() {
  tft.fillScreen(BLACK);  // Écran tout noir
  pinMode(LCD_CS, OUTPUT);
  pinMode(LCD_CD, OUTPUT);
  pinMode(LCD_WR, OUTPUT);
  pinMode(LCD_RD, OUTPUT);
  pinMode(LCD_RESET, OUTPUT);
  
  digitalWrite(LCD_CS, LOW);
  digitalWrite(LCD_CD, LOW);
  digitalWrite(LCD_WR, LOW);
  digitalWrite(LCD_RD, LOW);
  digitalWrite(LCD_RESET, LOW);  // Désactive l'écran complètement
} 

j'ai trouver la solution avec ce code sa marche l'ecran s'éteint prend les valeur puis se rallume et affiche les valeurs correctement.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.