Passaggio da ESP32+display ILI9341 a ESP32-2432S028

Buonasera, mi chiamo Paolo, sono un ingegnere elettronico, ma poco esperto di programmazione, perchè nella vita, nel lavoro, ho fatto tutt'altro. Per passione, però, nel tempo libero, ancora coltivo questa passione. Di recente ho lavorato ad un semplice progetto di controllo umidità/temperatura con ESP 32 + display TFT ILI9341 + touchXPT2046.
Adesso ho scoperto però l'ESP32-2432 S028 che, in un'unica scheda, integra sia l'esp che il display con touch e che quindi è molto più comodo da utilizzare e anche più gradevole esteticamente.
L'ho acquistato su amazon ma l'ho ricevuto senza un minimo di documentazione.
Ho provato a caricare il vecchio codice (quello scritto per esp 32 e display separato ILI9341), il codice gira correttamente sul nuovo ESP32-2432 (sul monitor seriale è tutto ok), ma sul display non appare nulla. Ne deduco che il display dell'ESP32-2432 non è un ILI9341.
Qualcuno può cortesemente aiutarmi a capire quali librerie utilizzare per display e touch?
Vi ringrazio molto e vi auguro una buona serata
Paolo

Buonasera e benvenuto nella sezione Italiana del forum,

cortesemente, come prima cosa, leggi attentamente il REGOLAMENTO di detta sezione, (... e, per evitare future possibili discussioni/incomprensioni, prestando molta attenzione al punto 15), dopo di che, come da suddetto regolamento (punto 16.7), fai la tua presentazione NELL'APPOSITA DISCUSSIONE spiegando bene quali esperienze hai in elettronica e programmazione, affinché noi possiamo conoscere la tua esperienza ed esprimerci con termini adeguati.

Grazie,

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposita discussione, nel rispetto del succitato regolamento nessuno ti risponderà (eventuali risposte o tuoi ulteriori post, verrebbero temporaneamente nascosti), quindi ti consiglio di farla al più presto. :wink:

No, si tratta proprio di un ILI9341, ma di sicuro non avrà la stessa piedinatura che hai usato fino ad ora con l'altro display.
Anche per quanto riguarda il touch, di solito nei display standalone condivide lo stesso bus del display stesso, mentre in questa scheda sono usati due bus SPI distinti.

Devi verificare sullo schema elettrico o in alternativa puoi prendere riferimento da questa configurazione per il firmware OpenHASP

Ti ringrazio molto, hai centrato il problema, infatti definendo i pin giusti per miso-mosi-sclk funziona correttamente O il display O il touch.
Immagino che per farli funzionare entrambi dovrei impostarli, come suggerisci tu, su due SPI distinti.
Ho passato diverse ora a cercare, ma non sono riuscito a venirne a capo.
Sai aiutarmi a capire come fare o dove andare a studiare?
ti ringrazio molto
paolo

L'ESP32 ha due bus SPI che possono essere usati: HSPI e VSPI.

Ti basta instanziarli in modo esplicito e poi passarne uno alla classe che gestisce il touch e l'altro a quella del display.
Se metti il codice che stai usando attualmente, magari ridotto all'osso, possiamo andare più nel dettaglio.

#include <SPI.h>
vspi = new SPIClass(VSPI);
hspi = new SPIClass(HSPI);

#define VSPI_CLK 14
#define VSPI_MISO 12
// etc etc

void setup() {
  vspi.begin(VSPI_CLK, VSPI_MISO, VSPI_MOSI, VSPI_SS);
  hspi.begin(HSPI_CLK, HSPI_MISO, HSPI_MOSI, HSPI_SS);

  pinMode(vspi->pinSS(), OUTPUT); //VSPI SS
  pinMode(hspi->pinSS(), OUTPUT); //HSPI SS
}


Ho scritto due righe di codice all'osso, che funzionano con l'esp32 e display separato, per mostrarti cosa faccio. Le allego qui.
Mi è chiaro che devo assegnare pin diversi ai miso-mosi-sclk, mi è chiaro che devo utilizzare due SPI diversi per touch e display, ma non mi è chiaro come comandare i due Chip Select.
Ho provato inoltre a scrivere i tuoi suggerimenti di codice, ma nella compilazione ho subito errori su:
vspi = new SPIClass(VSPI);
hspi = new SPIClass(HSPI);
(errore: vspi/hspi does not name a type)

Grazie davvero per il tuo aiuto
paolo

//*******************************************************************
#include <SPI.h>
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"
#include <XPT2046_Touchscreen.h>

#define _sclk              26
#define _mosi              27
#define _miso              25
#define CS_PIN             23
#define TFT_DC             14
#define TFT_CS             13
#define TFT_RST            12

XPT2046_Touchscreen ts(CS_PIN);
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);

#include <Fonts/FreeSans12pt7b.h>
#include "DHT.h"
DHT dht(22, DHT22);

float h, t;             //h e t misurati
boolean istouched = true;

void setup()//*************************************************************************
{
  Serial.begin(115200);
  dht.begin();
  SPI.begin( _sclk, _miso, _mosi );
  SPI.setFrequency( 40000000 );
  tft.begin(4000000);
  tft.setRotation(2);
  ts.begin();
  ts.setRotation(2);
}

void loop()//****************************************************************
{ 
  istouched = ts.touched();
  if (istouched) 
    {   TS_Point p = ts.getPoint();
        int px=map(p.x,300,3900,240,0);
        int py=map(p.y,300,3900,320,0);
        
        h = dht.readHumidity();
        t = dht.readTemperature();
      
        tft.fillScreen(ILI9341_BLACK);
        tft.setFont (& FreeSans12pt7b); 
        tft.setTextSize(1);
        tft.setTextColor(ILI9341_WHITE);
        tft.setCursor(1,135);
        tft.print("TEMP: "); tft.println(t);
        tft.setCursor(1,185);
        tft.print("HUM: "); tft.println(h);
        tft.setCursor(150,135);
        tft.print("X: "); tft.println(px);
        tft.setCursor(150,185);
        tft.print("Y: "); tft.println(py);
      
    }
 
}

Scusa, mancava la definizione dell'oggetto da creare con l'istruzione new. Prova come segue.

Inoltre dal sito del produttore puoi scaricare un .rar dove c'è tutta la documentazione ed anche degli esempi, però non viene mai usata la libreria Adafruit per il display, ma solo la LVGL, la LovyanGFX oppure la TFT_eSPI.

//*******************************************************************
#include <SPI.h>
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"
#include <XPT2046_Touchscreen.h>

#define  TFT_RST -1
#define  TFT_SCLK 14
#define  TFT_DC 2
#define  TFT_CS 15
#define  TFT_MOSI 13
#define  TFT_MISO 12
#define  TFT_BCKL 21

#define  TOUCH_CS 33
#define  TOUCH_SCLK 25
#define  TOUCH_MOSI 32
#define  TOUCH_MISO 39
#define  TOUCH_IRQ 36

SPIClass* vspi = new SPIClass(VSPI);
SPIClass* hspi = new SPIClass(HSPI);

// Questa classe consente di passare il bus SPI nel metodo begin() richiamato in setup()
XPT2046_Touchscreen ts(TOUCH_CS, TOUCH_IRQ);

// Costruttore da utilizzare per passare anche il bus SPI
//Adafruit_ILI9341(SPIClass *spiClass, int8_t dc, int8_t cs = -1, int8_t rst = -1);

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

#include <Fonts/FreeSans12pt7b.h>
#include "DHT.h"
DHT dht(22, DHT22);

float h, t;             //h e t misurati
boolean istouched = true;

void setup()//*************************************************************************
{
  Serial.begin(115200);
  dht.begin();

  vspi->begin(TOUCH_SCLK, TOUCH_MISO, TOUCH_MOSI, TOUCH_CS);
  hspi->begin(TFT_SCLK, TFT_MISO, TFT_MOSI, TFT_CS);

  tft.begin(4000000);
  tft.setRotation(2);

  ts.begin(*vspi);
  ts.setRotation(2);
}

void loop()//****************************************************************
{ 
  istouched = ts.touched();
  if (istouched) 
    {   TS_Point p = ts.getPoint();
        int px=map(p.x,300,3900,240,0);
        int py=map(p.y,300,3900,320,0);
        
        h = dht.readHumidity();
        t = dht.readTemperature();
      
        tft.fillScreen(ILI9341_BLACK);
        tft.setFont (& FreeSans12pt7b); 
        tft.setTextSize(1);
        tft.setTextColor(ILI9341_WHITE);
        tft.setCursor(1,135);
        tft.print("TEMP: "); tft.println(t);
        tft.setCursor(1,185);
        tft.print("HUM: "); tft.println(h);
        tft.setCursor(150,135);
        tft.print("X: "); tft.println(px);
        tft.setCursor(150,185);
        tft.print("Y: "); tft.println(py);
      
    }
 
}

Niente da fare, lo sketch gira, lo vedo sulla seriale, funziona anche il touch, ma il display è nero.
Qualche consiglio?
intanto vado a studiarmi il tuo link
grazie mille
p

Allora, vi aggiorno, perchè, dopo una notte insonne, ne sono venuto a capo, per puro c...aso!
Nello sketch semplificato che avevo estratto per te, le tue modifiche di codice lasciavano il display nero.
Ma apportate le stesse modifiche nel programmone completo, funziona tutto alla perfezione.
Come mai?
Perchè nel programmone completo usavo il pin21 per comandare un dispositivo e quindi avevo nel codice, nel setup, questa riga:
pinMode(21, OUTPUT); digitalWrite(21, HIGH);
per il pin21, che corrisponde, guarda caso, al BCLK del display nelle modifiche di codice da te suggerite. (#define TFT_BCKL 21)
Insomma, in sintesi, le tue modifiche di codice funzionano benissimo, ma solo se setti HIGH il pin 21.
Spero possa essere utile a qualcuno.

Qualcuno sa spiegarmi perchè?
Tra l'altro, il pin 21 è uno dei pochi pin disponibili sulle porte di uscita per l'utente... non è strano che sia usato per il clock? quindi, di fatto, non è a disposizione per l'utente...
Grazie mille, buona giornata a tutti
paolo

1 Like

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