After trying several options that I found on the web, I chose this one as the better to connect an ESP32 to an ILI9341 TFT display.
| ESP32 | ILI9341 |
| 3V3 | VCC |
| GND | GND |
| D15 | CS |
| D2 | RESET |
| D4 | D/C |
| D23 | MOSI |
| D18 | SCK |
| Not connected | MISO |
| 3V3 (***or D19) | LED |
The code:
/**
* ILI9341 TFT libraries and resources
*/
const int TFT_CS = 15;
const int TFT_DC = 4;
const int TFT_MOSI = 23;
const int TFT_SLK = 18;
const int TFT_RST = 2;
const int TFT_LED = 19;
#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_SLK, TFT_RST);
void setup() {
tft.begin();
tft.setRotation(3); //Landscape orientation
}
The reason for the two possibilities for the LED pin is the next:
If you connect LED pin directly to 3V3 you will get maximum brightness in your screen. LED pin controls the backlight of your TFT display.
In my case, I didn’t want to have max brightness but I wanted to control the intensity based on ambient light, so I decided to connect LED pin to any of the IO pins of the ESP32 (#19 in the showed example).
The code to control backlight intensity (once you have connected LED to pin D19) is as follows:
.
const int TFT_LED = 19;
.
/**
* PWM Constants
*/
const int freq = 5000;
const int tftledChannel = 0;
const int resolution = 8;
.
.
.
void setup() {
.
.
.
/**
* TFT DISPLAY
*/
//Background light PWM
ledcSetup(tftledChannel, freq, resolution);
ledcAttachPin(19, tftledChannel);
.
.
}
/**
* Sets TFT background luminosity (0-255)
*/
void setBGLuminosity(int level){
ledcWrite(tftledChannel, level);
}
Inserting the code above allows you to set the backlight intensity at any point just invoking setBGLuminosity() function passing a value between 0 and 255.
//Examples: setBGLuminosity(0); //Switch off screen backlight setBGLuminosity(128); //Medium intensity (theoretically) setBGLuminosity(255); //Full intensity