LilyGO TTGO T3 LoRa32 433MHz V1.6.1 ESP32 samen met een TFT - SPI - ILI9341

Beste mede-Arduino'ers,

Ik loop tegen het volgende probleem aan, waar ik tot nu toe nog geen oplossing voor heb gevonden.

Voor een projectje probeer ik een "extern" TFT-scherm (een 2.8 inch TFT Display, 240x320 pixels - SPI - ILI9341 - 3.3V) aan te sluiten op een LilyGO TTGO T3 LoRa32.

De LilyGO TTGO T3 LoRa32 heeft overigens zelf ook een OLED aan boord!
Het probleem is SPI/GPIO-gerelateerd omdat het LoRa-gedeelte "onboard" zit, en ik hier fysiek geen toegang tot heb.

Als ik de LilyGO TTGO T3 LoRa32 zonder het LoRa-gedeelte wil gebruiken met het TFT-schermpje, werkt alles netjes (zie code).

/*
TFT GND β†’ GND (ESP32)
TFT VCC β†’ 3.3V (ESP32)
TFT RES β†’ GPIO04 (ESP32)
TFT DC β†’ GPIO02 (ESP32)
TFT CS1 β†’ GPIO15 (ESP32)
TFT MOSI β†’ GPIO23 (ESP32) (MOSI is required)
TFT CLK β†’ GPIO22 (ESP32) (since GPIO18 is unavailable, we are using GPIO22 for SPI Clock)
*/

#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#include <SPI.h> // Include the SPI library

#define TFT_CS   15  // Chip Select
#define TFT_RST  4   // Reset
#define TFT_DC   2   // Data/Command
#define TFT_CLK  22  // Clock
#define TFT_MOSI 23  // Data

Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);

void setup() {
  SPI.begin(TFT_CLK, -1, TFT_MOSI, -1); // Initialize SPI with custom clock and MOSI pins
  tft.begin();
  tft.setRotation(1);
  tft.fillScreen(ILI9341_BLACK);
  tft.setTextColor(ILI9341_WHITE);
  tft.setTextSize(2);
  tft.setCursor(50, 120); // X, Y position
  tft.print("Hallo Wereld");
}

void loop() {
  // Niks te doen hier
}

Om enkel de onboard LoRa te initialiseren (en wat werkt), gebruik ik de volgende code:

#include <LoRa.h>

#define LORA_MOSI 27
#define LORA_MISO 19
#define LORA_CLK 5
#define LORA_NSS 18
#define LORA_RST 23
#define LORA_DIO0 26

#define LORA_BAND 433E6

void setup() {
  Serial.begin(115200);
  // Initialize LoRa
  SPI.begin(LORA_CLK, LORA_MISO, LORA_MOSI, LORA_NSS);
  LoRa.setPins(LORA_NSS, LORA_RST, LORA_DIO0);
  if (!LoRa.begin(LORA_BAND)) {
    Serial.println("Starting LoRa failed!");
    while (1)
      ;
  }
  Serial.println("LoRa Transceiver initialized...");
}

void loop() {
// Niks te doen hier
}

Zowel de "Hallo Wereld"- als de "initialisatie van de LoRa"-code werken goed, maar hoe kan ik nu SPI gebruiken voor beiden als de LORA_CLK "vast" zit, en niet bij kan!?
(Ik snap dat de andere GPIO's voor het TFT scherm ook anders moeten)

De toegankelijke GPIO's op de LilyGO TTGO T3 LoRa32 zijn 0, 1, 2, 3, 4, 12, 13, 14, 15, 19, 21, 22, 23, 25, 26, 34, 35, 36, 39.

Heeft iemand hier misschien een oplossing?

Hoi.

Het is mij niet geheel duidelijk waar je probleem precies ligt, maar SPI is een bus systeem.
Dat betekent dat over de bus alle data voor alle modules gaat.
MOSI gaat naar alle devices en MISO komt van alle devices.
Om dat onder controle te houden, heb je ook nog een CS pin per module.
Die is dus per module uniek, en wanneer daar het juiste nivo op staat, dan is de data dus voor die module.
Jouw reset voor de LoRa, deelt pin 23 met de data (MOSI) met je display, en dat kan dus niet goed zijn.
Wanneer je dan de display gaat aansturen, krijgt je LoRa telkens het signaal om te resetten (dat gebeurt meestal wanneer het signaal op de betreffende pin LOW is).

Voor zover ik kan zien, is pin 23 de enige die gedeeld wordt (en voor verschillende functies).
En omdat die pin 23 dus hardwarematig ook naar je LoRa gaat, moet je voor die functie naar je display een andere pin vinden.
Dat is natuurlijk wel een dingetje, want SPI zit naar alle waarschijnlijkheid hardwarematig in de ESP controller.

Daarom kun je eens op zoek gaan naar softwarematige SPI voor de ESP om daarmee je schermpje aan te sturen, maar vaak zitten daar wel wat nadelen aan.

Ik begrijp niet zo goed waarom de fabrikant het een goed idee vond om juist deze pin te gebruiken voor een signaal waarvoor je elke willekeurige pin kan gebruiken, maar goed die keuze hebben zij gemaakt.

Ik zie dat de SD kaart ook MOSI en MISO gebruikt via pinnen 15 en 02, en de clock via pin 14.
Deze pinnen zijn beschikbaar op MISO na, maar de communicatie beperkt zich toch tot een richting verkeer van controller naar display, dus MOSI op pin 15.
Misschien dat je daar iets mee kunt, wanneer je de SD kaart niet gebruikt en / of pin 13 ook niet gebruikt want die selecteert dan een eventueel aanwezige SD kaart.

Dit soort dingen gebeuren wel vaak wanneer je veel dubbele functies hebt voor pinnen.
Daarom moet je goed vooruit plannen wat je wil maar ook kunt doen en combineren.

1 Like

Dankjewel @MAS3 ,

Even wat zitten schuiven met wat pinnetjes, en ja heb nu dit voor de "Hallo Wereld" werkende.

Als ik deze pincombinatie samen met mijn LoRa code gebruik start de LoRa zelfs op, maar helaas het schermpje niet.

#define TFT_CS   13  // Chip Select (was 15)
#define TFT_RST  4   // Reset
#define TFT_DC   2   // Data/Command
#define TFT_CLK  22  // Clock
#define TFT_MOSI 15  // Data (Was 23)

Mijn volgende vraag is nu: "Hoe doe ik twee maal een SPI.begin in de void setup()?"

Stukje code hieronder gaat natuurlijk niet werken.

// Initialize TFT
SPI.begin(TFT_CLK, -1, TFT_MOSI, -1); // Initialize SPI with custom clock and MOSI pins

// Initialize LoRa
  SPI.begin(LORA_CLK, LORA_MISO, LORA_MOSI, LORA_NSS);

Alles wat ik ni even heb, en helaas maar 1/2 werkt

#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#include <SPI.h>  // Include the SPI library
#include <LoRa.h>

// LoRa
#define LORA_MOSI 27
#define LORA_MISO 19
#define LORA_CLK 5
#define LORA_NSS 18
#define LORA_RST 23
#define LORA_DIO0 26
#define LORA_BAND 433E6

// TFT
#define TFT_CS 13    // Chip Select (was 15)
#define TFT_RST 4    // Reset
#define TFT_DC 2     // Data/Command
#define TFT_CLK 22   // Clock
#define TFT_MOSI 15  // Data (Was 23)

Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);

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

  // Initialize LoRa
  SPI.begin(LORA_CLK, LORA_MISO, LORA_MOSI, LORA_NSS);
  LoRa.setPins(LORA_NSS, LORA_RST, LORA_DIO0);
  if (!LoRa.begin(LORA_BAND)) {
    Serial.println("Starting LoRa failed!");
    while (1)
      ;
  }
  Serial.println("LoRa Transceiver initialized...");

  // Initialize TFT
  SPI.begin(TFT_CLK, -1, TFT_MOSI, -1);  // Initialize SPI with custom clock and MOSI pins
  tft.begin();
  tft.setRotation(1);
  tft.fillScreen(ILI9341_BLACK);
  tft.setTextColor(ILI9341_WHITE);
  tft.setTextSize(2);
  tft.setCursor(50, 120);  // X, Y position
  tft.print("Hallo Wereld");

}

void loop() {
  // Niks te doen hier
}

Ik weet weinig van de ESP32 aangezien ik ze niet gebruik. De ESP32 heeft twee SPI interfaces and je kunt misschien de tweede gebruiken?

Er zijn genoeg artikelen op het web daarover, zie bv ESP32 SPI Communication: Pins, Multiple SPI, Peripherals (Arduino) | Random Nerd Tutorials.

1 Like

Wow.. Hoe simpel kan het zijn.

SPIClass secondSPI(VSPI);

Dan in de setup.

// Initialize TFT
secondSPI.begin(TFT_CLK, -1, TFT_MOSI, -1); // Initialize SPI with custom clock and MOSI pins

Dankjewel @MAS3 en @sterretje

Had het bijna opgegeven.

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