Freenove ESP32-S3 + I2C LCD1602: text is extremely faint
I am using a Freenove ESP32-S3 with an I2C LCD1602.
I2C communication works correctly at address 0x27, and the LCD displays the text, but the characters are extremely faint.
I tried a 10K potentiometer between VDD and GND with the wiper connected to VO, but I could not get normal contrast.
When VO is connected directly to GND, the characters become very dark and the display becomes garbled.
Could you please confirm:
Should this LCD1602 be powered from 3.3V or 5V on the Freenove ESP32-S3 kit?
What is the recommended voltage range for VO/contrast?
Is there a specific wiring configuration for the LCD1602 used in this kit?
Is the I2C interface board designed for 5V operation while SDA/SCL remain 3.3V-safe?
If you apply only VCC and GND to the I2C adapter of the LCD, you can see if a VCC of 5vdc and 3v3 have different brightnesses. (This is a method of adjusting the contrast potentiometer)
The LCDs I have worked with were 5.0 Volts. That includes 16X2. The I2C versions also included a contrast adjust pot on the I2C board. Anyway, I would try 5.0 volts or if you have a part number for your specific module try a Google..
A standard LCD 1602 module requires a 5.0V DC power supply for its logic and operation, though many modern variants or modules equipped with an I2C adapter interface support a flexible 3.3V to 5.0V range. [1, 2, 3, 4]
Voltage Breakdown
Logic Supply (VDD / VCC): Standard parallel-driven boards need 5V. I2C-adapted or modern versions often accept 3.3V up to 5V.
Backlight Voltage (A/K): Usually runs on 3.3V to 5V. Standard modules need a current-limiting resistor (or use an onboard jumper/resistor) if driven at 5V.
Contrast Adjustment (V0): Controlled via an analog voltage from 0V to 5V (typically adjusted using a 10kΩ or 50kΩ potentiometer). [1, 2, 3, 4, 5, 6]
Interfacing Considerations
3.3V Microcontrollers: If you hook up a strict 5V LCD 1602 to a 3.3V device (like a Raspberry Pi or ESP32), the logic high signals might be too weak or the display logic may underpower, while sending 5V back on I2C lines can risk damaging 3.3V pins unless a level shifter or modified module is used. [1, 2, 3, 4]
That sounds like a typical 5V LCD1602 being operated with Vdd at 3.3V. Even with Vo at Gnd, Vo isn't far enough below Vdd to get decent contrast.
You can buy 3.3V LCD1602s, though they aren't as common as their 5V cousins, and are therefore typically more expensive.
If you have moderately decent soldering skills, you can also modify many 5V LCD1602s to operate at 3.3V by adding a 7660 voltage converter to supply the necessary negative voltage to Vo. You'll need a SOIC 7660, a couple of 1206 10uF caps, an 0805 or 0603 76.8K resistor (to keep the HD44780 operating at the correct frequency) and a 1206 resistor to keep the backlight at the same level. I use a 22R in mine, but you'll want to check what value is on your display and adjust accordingly.
The SOIC and 1206 parts are easy enough even if you haven't done much/any SMD work; the 0603/0805 resistor is a bit fiddly.
The PCF8574 on the I2C backpack will operate as is at 3.3V.
I checked Freenove's own ESP32-S3 documentation, and there is an interesting detail: their schematic explicitly powers this I2C LCD1602 from 5V, while connecting SDA/SCL directly to GPIO14/13.
Before doing that, however, I would verify one thing that hasn't been measured yet: the actual idle voltage on SDA and SCL.
Power the LCD module from 5V, disconnect SDA/SCL from the ESP32, and measure both lines to GND. If the module's I2C pull-ups are tied to its 5V VCC, the bus may sit near 5V — while Espressif specifies a 3.6V GPIO limit for the ESP32-S3. In that case I would use an I2C level shifter rather than connect it directly.
If SDA/SCL sit around 3.3V, then the bus side is fine and @van_der_decken's contrast/bias explanation becomes the main suspect.
This measurement would separate the LCD contrast problem from the I2C voltage-level problem very quickly.
I do this quite often, but I use an LCD with an I²C backpack. I power the backpack from 5V while the Arduino operates at 3V3.
I then use I²C pull-up resistors in the 2.5K to 3.5K range connected to 3V3, not to +5V. The logic levels are compatible based on the I²C specifications.
Be sure that the 3V3 Arduino and the 5V LCD/backpack have their grounds connected together.