Utilisation TFT et GPS simultanement

Bonjour à tous,
1er message sur le forum, car je rencontre un petit problème qui me fait faire du sur place depuis quelques jours.

J'ai à ma disposition un Arduino Mega, un écran TFT ADA1651 et un GPS NEO6MV2.
Mon but est d'afficher certaines informations en provenance du GPS directement sur le TFT.

Je pilote sans problème le TFT, en affichant à ma guise des informations d'autres capteurs.
Je récupère bien les informations en provenance du GPS et les affiche dans le moniteur série.

La ou ça se complique, c'est lorsque je mixe le GPS avec le TFT. Le TFT fonctionne, mais aucune remontée d'info de la part du GPS, même pas sur le moniteur série.

Quand le TFT est actif, dans la fonction GPS(), je ne rentre jamais dans la boucle, car gpsSerial.available() ne passe jamais à true.

Si dans mon code je mets en commentaire toute la partie TFT, le GPS crache des infos sur le moniteur série.

Le pb arrive des que je décommente tft.begin();.

//Définition des librairies à utiliser

//GPS
#include <SoftwareSerial.h>
#include <TinyGPS.h>
//TFT
#include <Adafruit_GFX.h>    // Core graphics library
#include <SPI.h>
#include <Wire.h>      // this is needed even tho we aren't using it
#include <Adafruit_ILI9341.h>
#include <Adafruit_STMPE610.h>
#include <Adafruit_SPITFT.h>
#include <Adafruit_SPITFT_Macros.h>

// This is calibration data for the raw touch data to the screen coordinates
#define TS_MINX 150
#define TS_MINY 130
#define TS_MAXX 3800
#define TS_MAXY 4000

// The STMPE610 uses hardware SPI on the shield, and #8
#define STMPE_CS 8
Adafruit_STMPE610 ts = Adafruit_STMPE610(STMPE_CS);

// The display also uses hardware SPI, plus #9 & #10
#define TFT_CS 10
#define TFT_DC 9
// Use hardware SPI (on Uno, #13, #12, #11) and the above for CS/DC
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);

// Size of the color selection boxes and the paintbrush size
#define BOXSIZE 40
#define PENRADIUS 3

// Creation des variables liées au GPS
long lat, lon; 
unsigned long vitesse,vitessekmh, alti;
int year;
byte month, day, hour, minutes, second, hundredths,statusGPS;
unsigned long fix_age;

SoftwareSerial gpsSerial(51,49); // Creation des connexions (Tx,Rx) du GPS
TinyGPS gps; // Creation de l'objet gps

void setup() {

  Serial.begin(115200); // Connexion série
  gpsSerial.begin(9600); // Connexion du GPS
  tft.begin();  //Connexion à l'écran TFT
  
  //rotation de l'écran en paysage
  tft.setRotation(1);
  tft.fillScreen(ILI9341_BLACK);
 
  //Allumage de l'écran en pleine luminositée
  analogWrite(3,255);
  Serial.println("En attente de GPS");

  tft.setCursor(100 , 100);
  tft.setTextColor(ILI9341_WHITE);
  tft.print("Hello");
}

void loop() 
{
  GPS();
}

void GPS()
{
  // affichage des coordonnées latitude et longitude chaque 1 seconde
      
  while (gpsSerial.available()) {
  
    if (gps.encode(gpsSerial.read())) {
      Serial.print("Nb satellites utilisés: ");
      Serial.println(gps.satellites(), DEC);
      
      statusGPS=1;
      gps.get_position(&lat, &lon); // récupère latitude et longitude
      alti=gps.f_altitude();
      vitesse=gps.f_speed_kmph();
      vitessekmh=(vitesse/100)*1.852;
      
      // Récuperation du temps et de la date
      gps.crack_datetime(&year, &month, &day, &hour, &minutes, &second, &hundredths, &fix_age);
      
      Serial.print(day);Serial.print("/");Serial.print(month);Serial.print("/");Serial.print(year);Serial.print(" ");Serial.print(hour);Serial.print(":");Serial.print(minutes);Serial.print(":");Serial.println(second);
      Serial.println(fix_age);
      
      // Affichage de la position
      Serial.print("Position: ");
      Serial.print("coordonnées ");
      Serial.print(lat / 1000000);
      Serial.print(".");
      Serial.print(lat % 1000000);

      tft.setCursor(140 , 140);
      tft.setTextColor(ILI9341_WHITE);
      tft.print(lat);
      
      Serial.print(" "); // Afficher la latitude sur le moniteur série
      Serial.print(", ");
      Serial.print(lon / 1000000);
      Serial.print(".");
      Serial.println(lon % 1000000); // Afficher la longitude sur le moniteur série
      Serial.print("Altitude: ");
      Serial.print(alti);
      Serial.print(" / Vitesse: ");
      Serial.println(vitessekmh);
      Serial.println();
      delay(1000);
    }
  }
}

J'ai essayé ce code aussi, en changeant les pins du GPS, et j'obtiens exactement les mêmes symptômes: TFT ok mais pas de GPS, et lorsque je commente la partie TFT je récupère les infos du GPS sur le moniteur série.
https://forum.arduino.cc/index.php?topic=608455.0

Voila ou j'en suis. Si vous avez des idées, je suis tout à votre écoute.

Merci d'avance.

Sur une mega les pins SPI hardware sont en 50-53 pas en 10-13

 // The STMPE610 uses hardware SPI on the shield, and #8
#define STMPE_CS 8
Adafruit_STMPE610 ts = Adafruit_STMPE610(STMPE_CS);

// The display also uses hardware SPI, plus #9 & #10
#define TFT_CS 10
#define TFT_DC 9

comment sont branchés vos éléments ?


Vous êtes sur une mega, utiliser SoftwareSerial pour le gps est une hérésie

 SoftwareSerial gpsSerial(51,49); // Creation des connexions (Tx,Rx) du GPS
TinyGPS gps; // Creation de l'objet gps

utilisez une des 3 autres port hardwar, par exemple Serial1. Ce sera bien plus stable. (Sans mentionner que la pin 51 est une utilisée par le SPI hardware ...)

Bonjour J-M-L, et merci de vos remarques.

Pour l'écran, j'utilise les pins D3 / D4 / D8 / D9 / D10 / MISO / MOS et SCK.

Votre remarque très judicieuse sur l'utilisation d'un des autres serial m'a débloqué sur mon pb, car maintenant les fonctionnent ensemble.

Encore un grand merci.