ESP32-S3-WROOM Devboard for TFT Displays
After making the new Klipper Console for my 3D printer I realized I now had a screen left over. After opening it up it turned out to be a generic 4.3" TFT display (driven on a 40 pin connector using parallel RGB signals) so I decided to follow along to the custom devboard tutorial here plus some more research to make devboard with the ESP32-S3-WROOM-1 and everything needed to drive the display with the board just latching on the back of the display. I've made PCB's but I've never made a devboard for an MCU, not to mention a complicated one like the ESP32 plus a TFT display support so this will be fun....
Created by
eduardbrisca
Tier 3
8 views
0 followers
Tanuki ⚡🚀
approved ESP32-S3-WROOM Devboard for TFT Displays ago
Tier approved: 3
Grant approved: $101.00
WOWWW REALLLY GOOD WORK THIS IS NICE ASH
eduardbrisca
submitted ESP32-S3-WROOM Devboard for TFT Displays for review ago
koeg 🚀
requested changes for ESP32-S3-WROOM Devboard for TFT Displays ago
Hello! This it seems like a really cool project! But we don't really give out T2 for dev boards.
One way you could reduce your cost is to use economic PCBA if you can, because currently the bulk of your cost is there.
If you really can't reduce your cost, then resubmit and leave a note on why not !
Everything else looks good!
eduardbrisca
submitted ESP32-S3-WROOM Devboard for TFT Displays for review ago
eduardbrisca
added to the journal ago
Banner image

(Filler Filler Filler Filler Filler Filler Filler Filler Filler Filler Filler Filler Filler Filler Filler Filler Filler Filler Filler Filler Filler Filler
eduardbrisca
added to the journal ago
Fixed a few more problems and added silkscreen. FINALLY DONE
There were a few more things to fix in the schematic and upgrade. Plus I changed some of the net names for ease of reading. Then I finished the silkscreen on both sides. FINALLY. There is a complete list of all the pins labelling the headers (Plus bootstrap / PSRAM pin labelling for caution) and I cleaned up the silkscreen on the front of the board. I think I'm practically done with this for now. I have some sort of list in JLCPCB I just need to export BOM, ensure the list is complete then I'm ready to order it!



eduardbrisca
added to the journal ago
Added Ground plane and fixed DRC errors
Spent a good hour trying to figure out how to fix DRC errors and add the ground plane. I probably just about doubled the number of Vias on the board just to get all the ground planes connected very annoyingly, and had to nudge a few things to get both ground planes to work and for thermal relief to be alright.

eduardbrisca
added to the journal ago
Finished routing the PCB
After a lot of trying attempts on the last few traces I FINALLY managed to complete routing the board. Completely surprised myself as I managed to do it while only keeping to two layers and no via-in-pads! I did however end up using about 6 vias on the last route but it's fine because it's just the EN signal, and if that is a few microseconds late then it will make no difference.
Hopefully all the measurements in-between the components are wide enough for JLCPCB's PCBA, I have checked and 0.4mm between components seems to be the minimum at the cheapest cost, and I've kept well more than 0.4mm.



eduardbrisca
added to the journal ago
Routed the first part of the PCB
Routed the signal and GPIO lines for the TFT Display and the lines for the GPIO from the MCU to the header through the bottom layer while trying to leave as much space as possible for the rest of the power components lower down on the board.



eduardbrisca
added to the journal ago
Finished placing components in their best places
I finished placing the components in their best (I think) positions for routing. I also left some clearance in front of the connector as I realize that it is very low. This means the flexible cable might collide with some of the taller components so I made sure to them back far enough. Most of the main components are in the correct places, the capacitors and resistors however may move depending on routing situation.
I plan to connect the MCU to the 40-pin with all the lines first on the top layer, they run vias into the inside of the MCU package cover and then run the MCU GPIO signals on the bottom layer to all the headers on the sides for general "devboarding". Then the rest of the components can use the top layer and maybe the bottom layer at a stretch. I hope that this will all fit in terms of traces and I won't have to extend/move and reroute.


eduardbrisca
added to the journal ago
Found basic positions for components and grouped them.
After a few attempts I found the best way to layout everything on the PCB would be the split the dual headers in two to make space for the 40-pin display connector. Because of how it's wired it would be easiest to have that 40-pin connector right opposite, and so the headers don't collide with the flexible PCB arm of the TFT display, it needs to be on the top layer. However I need to maintain a certain short distance between the two columns of headers so that it fits on a breadboard (The pitch is 2.54mm so all the headers had to be in those units basically, very annoying whoever created that 2.54). And because of that width restriction it collided with the 40-pin so I had to split the headers into 4 different rows.
In addition to that I also ensured the right headers were in the right place.
Then I started organizing the components by their specific purpose. I separated the LD1117 circuitry, moved power coupling for MCU up, LED's in one group, pushbuttons in one group, MT3608 in another group, CAT4104 as well plus the UART to USB chip and placed everything above it's relevant USB as well if it had one.
I dearly hope I will have enough space to route otherwise I'll have to get creative.
P.S. I also found out I need to have at least 0.4mm (I think) in-between Pads/components for JCLPCB to do PCBA.


eduardbrisca
added to the journal ago
Had to tweak a few things on the schematic (possibly major)
Did some more research and found out I had a plethora of problems.
First of all the two transistors on the bottom were wired wrong. Fixed that to make sure the inverting part of it actually worked.
Then it turns out the AMS1117 is not a good choice AT ALL (https://www.reddit.com/r/AskElectronics/comments/1nwdioi/whats_wrong_with_the_ams1117/) meaning I had to use something else like an LD1117 which is basically the same but avoids all of the problems mentioned in that reddit post.
Then I found out that GPIO2 is also used as a bootstrap by esptool so I added a weak pulldown to that and strengthened the ones on 45/46 just to be safe.
I also needed to add some extra capacitors here for power filtering and there including on the EN pin according to this: https://github.com/atomic14/basic-esp32s3-dev-board. The EN capacitor is VERY IMPORTANT because it creates an RC circuit that adds the necessary timing delay after power is applied (of about 50us minimum) for the power supply to stabilize, otherwise the ESP won't boot properly some of the time, which can be a problem, especially in things proper commercial products (this is still a devboard though but I don't want any unnecessary problems later on)
And the UART to USB isn't even needed because the EXACT same is present inside the chip package. But I will keep it anyways because it could be useful in future.

eduardbrisca
added to the journal ago
Finished off the schematic, assigned nets, added UART USB
I figured out which pins to use depending on their position on the physical package for ease of routing and assigned the nets for the GPIO Headers and the TFT display.
I also decided to make use of the UART with a UART to USB chip like most other S3 devboards do which I needed to find a UART to USB chip for and apparently there are output pins from the converter for EN and Boot strap pin 0? I don't understand exactly how a UART to USB bridge gives me that extra automation when programming the board with the UART USB and that isn't possible on the normal USB C but either way it's a plus if it works and if it does nothing then it's fine as the USB C normal port is there as well.
Then I also added the other LED sinks (including the TFT one) and the 4 resistive touchscreen pins to another 8 headers in case i ever want to use them in future or drive some heavier 24V LEDs (Although my current will be limited to 70mA or less).
This is where I am so far. Pretty much finished, I think, hopefully...

eduardbrisca
added to the journal ago
Assigning data lines
I now need to assign the 24 RGB data lines and the other timing data lines to GPIO. I also need to take into consideration track length meaning I should probably have sequential pins. I also need to take into consideration this thing called DMA (which bypasses the CPU for writing pixels) and so I need to take into consideration the pins for this too.
To achieve all that I needed to: Assign normal RGB parallel and control pins to any GPIO almost (Except PSRAM, that is not to be touched, and any bootstrapping pins) and keep the RGB pins grouped for easy trace length matching and the resistive touchscreen pins need to be connected to ADC capable GPIOs so I attached them first.
(I also decided to separate the MCU, the connector AND the connection of pins between them (will make sense when you see it) just to make it much easier to visualize and to also make a breakout board for normal GPIO use (without display) much easier to setup.)
However upon doing this I realized I miscounted the pins quite a bit... Even with the main UART line (I don't need it for programming as I will use USB C) I only have about 27 free GPIO pins whereas just for the basic display, I need 29, an 4 extra for touch plus another 2 for built in LED and backlight PWM, putting me at 35, quite a bit over GPIO budget.
So I decided to forget about PWM control for the backlight and just add an SMD variable resistor and also remove the GPIO built-in LED that's seen on most boards, saving me 2 GPIOs and down to 33.
I can also use the 4 bootstrap pins. I still need to be careful though because they can mess up the boot sequence of the ESP32, however as long I just connect them to the resistive touch plate, they will still be floating and so won't push or pull a voltage over those pins at boot time, ensuring that the ESP32 can start fine. That's an extra 4 pins, bringing me to 31. (IO0, the bootstrap for normal/programming boot is pulled up currently but that will probably need to be done anyways to operate the resistive touchscreen)
There is also a pin called DISP on the display, this just enables whether the display is on or not and I can just pull this up permanently and have the display always on, I can tell it to display nothing from code. This brings me down to 32 needed GPIOs
However, very very annoyingly, I am still on GPIO pin short. So I will have to ditch the resistive touchscreen, any future projects needing a touchscreen will have to do without. That now leaves me with 28 needed GPIOs so I can re add the GPIO LED both on a bootstrap pin (obviously pulling it to ground as well to be safe). And leave IO0 untouched once more
OVERALL:
GPIO Needed:
x24 RGB Parallel Signal lines
x4 control lines (PCLK, HSYNC, VSYNC, DE)
x1 GPIO built-in LED
= x29
GPIO Available:
x27 normal GPIO available (x2 are default UART so they may need to be redefined in code?)
x2 bootstrap pins which can be used as long as there is a pull down and no other too strong pull ups (I've not also realized I must NOT touch IO3 as that needs to be left floating for proper boot as per the datasheet)
= x29
Now to go to bed and place all the nets in the best positions as per my first statement tomorrow, I will however make every pin accessible through breakout headers for flexibility in future projects.


eduardbrisca
added to the journal ago
Added backlight power for TFT display
Added a button to the EN, almost forgot about it but it's needed to make sure the MCU actually runs and allows you to reset it. And also added another pushbutton on GPIO0 for bootstrapping (this needs to be pressed at the same time as reset to program the board).
And I came across quite a hurdle. I need 24V for the TFT backlight. Which is far from the 5V on the USB C. And I cannot just use an LDO. Best use would be a boost switching regulator such as the MT3608 to provide the 24V current. I found out the correct resistor feedback values for the VOUT and added the necessary inductor and other components such as coupling capacitors and diode. (I'm also trying to keep everything in SMD form). Using a Schottky diode as it's better for it's application because it's lower forward voltage and better switching performance.
Besides that I also need current limiting for the LED backlight array since the MT3608 only regulates voltage, not current. I could just use a current limiting resistor but that doesn't really work when the voltage is already at the one required by the LEDs so instead I need something more sophisticated. Therefore I found the CAT4104. It's in stock for JLCPCB however KiCad has no symbol/footprint for it so I had to figure out how make my own symbol and used a standard SOIC-8 footprint, making sure the pins are right (Hopefully JLCPCB will do PCBA for this). This IC basically is designed to drive some LED strips and limit current based on a ratio provided by a resistor. Which is perfect for my LED backlight.
I was going to add a logic MOSFET as well to PWM the backlight but the IC already has an EN pin capable of switching at PWM speeds so I can just connect that straight to a GPIO pin
(So far I have also made sure that all parts are in stock for PCBA by JLCPCB, although not all of them are Standard).

eduardbrisca
added to the journal ago
Designed the first part of the schematic
Did a bunch of researching on what exact ESP module I will need and setup the basic schematic for the dev board.
I decided to try and get modules with as much PSRAM as possible to allow easiest control of the TFT. The S3 variants provide the best performance and most PSRAM. The WROOM version will have to suffice for now, antenna is built in (not the U version) and it has the oscillator also built in. This means I don't need to worry about that part of the MCU control meaning there's less space for things to go wrong.
USB C also added, I had to figure out how USB exactly works and that it would need to run in 2.0 in my case. As it's USB C, there are also some other pins, CCs need to just be pulled down to as default for 5V power let through and I also needed to add series resistors on D+ and D- and only connect them to one set on the USB C because apparently USB C automatically selects the correct one depending on port orientation.
Since the ESP32s need 3.3V I also added an LDO (much cleaner than a buck converter), more specially the TO-252 package as that provides the most heat dissipation. This is important as the LDO burns excess voltage as heat and I would need to drop enough wattage for about 500-700mA to run the ESP, TFT and maybe other stuff, with capacitors as coupling as well on all rails and before and after the LDO. Plus LED's for the power rails and GPIO test LED like on most devboards.

eduardbrisca
started ESP32-S3-WROOM Devboard for TFT Displays ago
1/6/2026 5:21 PM - Designed the first part of the schematic
Did a bunch of researching on what exact ESP module I will need and setup the basic schematic for the dev board.
I decided to try and get modules with as much PSRAM as possible to allow easiest control of the TFT. The S3 variants provide the best performance and most PSRAM. The WROOM version will have to suffice for now, antenna is built in (not the U version) and it has the oscillator also built in. This means I don't need to worry about that part of the MCU control meaning there's less space for things to go wrong.
USB C also added, I had to figure out how USB exactly works and that it would need to run in 2.0 in my case. As it's USB C, there are also some other pins, CCs need to just be pulled down to as default for 5V power let through and I also needed to add series resistors on D+ and D- and only connect them to one set on the USB C because apparently USB C automatically selects the correct one depending on port orientation.
Since the ESP32s need 3.3V I also added an LDO (much cleaner than a buck converter), more specially the TO-252 package as that provides the most heat dissipation. This is important as the LDO burns excess voltage as heat and I would need to drop enough wattage for about 500-700mA to run the ESP, TFT and maybe other stuff, with capacitors as coupling as well on all rails and before and after the LDO. Plus LED's for the power rails and GPIO test LED like on most devboards.

1/6/2026 5:22 PM - Added backlight power for TFT display
Added a button to the EN, almost forgot about it but it's needed to make sure the MCU actually runs and allows you to reset it. And also added another pushbutton on GPIO0 for bootstrapping (this needs to be pressed at the same time as reset to program the board).
And I came across quite a hurdle. I need 24V for the TFT backlight. Which is far from the 5V on the USB C. And I cannot just use an LDO. Best use would be a boost switching regulator such as the MT3608 to provide the 24V current. I found out the correct resistor feedback values for the VOUT and added the necessary inductor and other components such as coupling capacitors and diode. (I'm also trying to keep everything in SMD form). Using a Schottky diode as it's better for it's application because it's lower forward voltage and better switching performance.
Besides that I also need current limiting for the LED backlight array since the MT3608 only regulates voltage, not current. I could just use a current limiting resistor but that doesn't really work when the voltage is already at the one required by the LEDs so instead I need something more sophisticated. Therefore I found the CAT4104. It's in stock for JLCPCB however KiCad has no symbol/footprint for it so I had to figure out how make my own symbol and used a standard SOIC-8 footprint, making sure the pins are right (Hopefully JLCPCB will do PCBA for this). This IC basically is designed to drive some LED strips and limit current based on a ratio provided by a resistor. Which is perfect for my LED backlight.
I was going to add a logic MOSFET as well to PWM the backlight but the IC already has an EN pin capable of switching at PWM speeds so I can just connect that straight to a GPIO pin
(So far I have also made sure that all parts are in stock for PCBA by JLCPCB, although not all of them are Standard).

1/6/2026 5:23 PM - Assigning data lines
I now need to assign the 24 RGB data lines and the other timing data lines to GPIO. I also need to take into consideration track length meaning I should probably have sequential pins. I also need to take into consideration this thing called DMA (which bypasses the CPU for writing pixels) and so I need to take into consideration the pins for this too.
To achieve all that I needed to: Assign normal RGB parallel and control pins to any GPIO almost (Except PSRAM, that is not to be touched, and any bootstrapping pins) and keep the RGB pins grouped for easy trace length matching and the resistive touchscreen pins need to be connected to ADC capable GPIOs so I attached them first.
(I also decided to separate the MCU, the connector AND the connection of pins between them (will make sense when you see it) just to make it much easier to visualize and to also make a breakout board for normal GPIO use (without display) much easier to setup.)
However upon doing this I realized I miscounted the pins quite a bit... Even with the main UART line (I don't need it for programming as I will use USB C) I only have about 27 free GPIO pins whereas just for the basic display, I need 29, an 4 extra for touch plus another 2 for built in LED and backlight PWM, putting me at 35, quite a bit over GPIO budget.
So I decided to forget about PWM control for the backlight and just add an SMD variable resistor and also remove the GPIO built-in LED that's seen on most boards, saving me 2 GPIOs and down to 33.
I can also use the 4 bootstrap pins. I still need to be careful though because they can mess up the boot sequence of the ESP32, however as long I just connect them to the resistive touch plate, they will still be floating and so won't push or pull a voltage over those pins at boot time, ensuring that the ESP32 can start fine. That's an extra 4 pins, bringing me to 31. (IO0, the bootstrap for normal/programming boot is pulled up currently but that will probably need to be done anyways to operate the resistive touchscreen)
There is also a pin called DISP on the display, this just enables whether the display is on or not and I can just pull this up permanently and have the display always on, I can tell it to display nothing from code. This brings me down to 32 needed GPIOs
However, very very annoyingly, I am still on GPIO pin short. So I will have to ditch the resistive touchscreen, any future projects needing a touchscreen will have to do without. That now leaves me with 28 needed GPIOs so I can re add the GPIO LED both on a bootstrap pin (obviously pulling it to ground as well to be safe). And leave IO0 untouched once more
OVERALL:
GPIO Needed:
x24 RGB Parallel Signal lines
x4 control lines (PCLK, HSYNC, VSYNC, DE)
x1 GPIO built-in LED
= x29
GPIO Available:
x27 normal GPIO available (x2 are default UART so they may need to be redefined in code?)
x2 bootstrap pins which can be used as long as there is a pull down and no other too strong pull ups (I've not also realized I must NOT touch IO3 as that needs to be left floating for proper boot as per the datasheet)
= x29
Now to go to bed and place all the nets in the best positions as per my first statement tomorrow, I will however make every pin accessible through breakout headers for flexibility in future projects.


1/6/2026 5:24 PM - Finished off the schematic, assigned nets, added UART USB
I figured out which pins to use depending on their position on the physical package for ease of routing and assigned the nets for the GPIO Headers and the TFT display.
I also decided to make use of the UART with a UART to USB chip like most other S3 devboards do which I needed to find a UART to USB chip for and apparently there are output pins from the converter for EN and Boot strap pin 0? I don't understand exactly how a UART to USB bridge gives me that extra automation when programming the board with the UART USB and that isn't possible on the normal USB C but either way it's a plus if it works and if it does nothing then it's fine as the USB C normal port is there as well.
Then I also added the other LED sinks (including the TFT one) and the 4 resistive touchscreen pins to another 8 headers in case i ever want to use them in future or drive some heavier 24V LEDs (Although my current will be limited to 70mA or less).
This is where I am so far. Pretty much finished, I think, hopefully...

1/6/2026 5:27 PM - Had to tweak a few things on the schematic (possibly major)
Did some more research and found out I had a plethora of problems.
First of all the two transistors on the bottom were wired wrong. Fixed that to make sure the inverting part of it actually worked.
Then it turns out the AMS1117 is not a good choice AT ALL (https://www.reddit.com/r/AskElectronics/comments/1nwdioi/whats_wrong_with_the_ams1117/) meaning I had to use something else like an LD1117 which is basically the same but avoids all of the problems mentioned in that reddit post.
Then I found out that GPIO2 is also used as a bootstrap by esptool so I added a weak pulldown to that and strengthened the ones on 45/46 just to be safe.
I also needed to add some extra capacitors here for power filtering and there including on the EN pin according to this: https://github.com/atomic14/basic-esp32s3-dev-board. The EN capacitor is VERY IMPORTANT because it creates an RC circuit that adds the necessary timing delay after power is applied (of about 50us minimum) for the power supply to stabilize, otherwise the ESP won't boot properly some of the time, which can be a problem, especially in things proper commercial products (this is still a devboard though but I don't want any unnecessary problems later on)
And the UART to USB isn't even needed because the EXACT same is present inside the chip package. But I will keep it anyways because it could be useful in future.

1/6/2026 5:28 PM - Found basic positions for components and grouped them.
After a few attempts I found the best way to layout everything on the PCB would be the split the dual headers in two to make space for the 40-pin display connector. Because of how it's wired it would be easiest to have that 40-pin connector right opposite, and so the headers don't collide with the flexible PCB arm of the TFT display, it needs to be on the top layer. However I need to maintain a certain short distance between the two columns of headers so that it fits on a breadboard (The pitch is 2.54mm so all the headers had to be in those units basically, very annoying whoever created that 2.54). And because of that width restriction it collided with the 40-pin so I had to split the headers into 4 different rows.
In addition to that I also ensured the right headers were in the right place.
Then I started organizing the components by their specific purpose. I separated the LD1117 circuitry, moved power coupling for MCU up, LED's in one group, pushbuttons in one group, MT3608 in another group, CAT4104 as well plus the UART to USB chip and placed everything above it's relevant USB as well if it had one.
I dearly hope I will have enough space to route otherwise I'll have to get creative.
P.S. I also found out I need to have at least 0.4mm (I think) in-between Pads/components for JCLPCB to do PCBA.


1/6/2026 5:29 PM - Finished placing components in their best places
I finished placing the components in their best (I think) positions for routing. I also left some clearance in front of the connector as I realize that it is very low. This means the flexible cable might collide with some of the taller components so I made sure to them back far enough. Most of the main components are in the correct places, the capacitors and resistors however may move depending on routing situation.
I plan to connect the MCU to the 40-pin with all the lines first on the top layer, they run vias into the inside of the MCU package cover and then run the MCU GPIO signals on the bottom layer to all the headers on the sides for general "devboarding". Then the rest of the components can use the top layer and maybe the bottom layer at a stretch. I hope that this will all fit in terms of traces and I won't have to extend/move and reroute.


1/6/2026 5:30 PM - Routed the first part of the PCB
Routed the signal and GPIO lines for the TFT Display and the lines for the GPIO from the MCU to the header through the bottom layer while trying to leave as much space as possible for the rest of the power components lower down on the board.



1/6/2026 5:30 PM - Finished routing the PCB
After a lot of trying attempts on the last few traces I FINALLY managed to complete routing the board. Completely surprised myself as I managed to do it while only keeping to two layers and no via-in-pads! I did however end up using about 6 vias on the last route but it's fine because it's just the EN signal, and if that is a few microseconds late then it will make no difference.
Hopefully all the measurements in-between the components are wide enough for JLCPCB's PCBA, I have checked and 0.4mm between components seems to be the minimum at the cheapest cost, and I've kept well more than 0.4mm.



1/6/2026 5:31 PM - Added Ground plane and fixed DRC errors
Spent a good hour trying to figure out how to fix DRC errors and add the ground plane. I probably just about doubled the number of Vias on the board just to get all the ground planes connected very annoyingly, and had to nudge a few things to get both ground planes to work and for thermal relief to be alright.

1/6/2026 5:32 PM - Fixed a few more problems and added silkscreen. FINALLY DONE
There were a few more things to fix in the schematic and upgrade. Plus I changed some of the net names for ease of reading. Then I finished the silkscreen on both sides. FINALLY. There is a complete list of all the pins labelling the headers (Plus bootstrap / PSRAM pin labelling for caution) and I cleaned up the silkscreen on the front of the board. I think I'm practically done with this for now. I have some sort of list in JLCPCB I just need to export BOM, ensure the list is complete then I'm ready to order it!



1/6/2026 5:32 PM - Banner image

(Filler Filler Filler Filler Filler Filler Filler Filler Filler Filler Filler Filler Filler Filler Filler Filler Filler Filler Filler Filler Filler Filler