Project Description
In this post, I will show how to setup an ESP32 for use with Iteadlib with a basic Nextion HMI.
This basic project will meet the following requirements
– MCU to change pages in response to Button release
– MCU to toggle LED on GPIO2 on Button press/release
– MCU to update a status text on Nextion
– MCU to increment and update a number
– Nextion timer to evaluate and update status based on value
– Communication set to 115200 baud
Materials Used:
– an ESP-WROOM-32 (DOIT’s ESP DEVKIT v1 30-pin version)
– a Basic Nextion 3.2″ NX4024T032_011
– included Nextion 4 wire Power/UART cable
– 4 nylon 2.5M hexnuts and screws
– Iteadlib Arduino Nextion Library v0.90
– CP210X Bridge Drivers needed for this ESP32
– Nextion Editor v0.53
– Arduino IDE v1.8.0
– Espressif ESP32 Arduino IDE boards package
> https://dl.espressif.com/dl/package_esp32_index.json
Step 1
Download the Iteadlib Arduino Nextion Library
a) goto Iteadlib Arduino Nextion Library github page
> https://github.com/itead/ITEADLIB_Arduino_Nextion
b) click Clone or Download and select Download ZIP
> https://github.com/itead/ITEADLIB_Arduino_Nextion/archive/master.zip
c) Save to a location you’ll remember on your hard drive (for Next step)
Step 2
Install the Iteadlib Arduino Nextion Library
In the Arduino IDE
Sketch > Include Library > Add .ZIP Library
Select and Open the Library zip file from step 1c.
Be sure to READ the library readme.md file for directions
Step 3
Configure the Nextion Library for use with the ESP32.
Iteadlib is preconfigured for the ATMega 2560
The ESP32 will use many of the same configurations, not all
so pay close attention to small changes as they are needed.
As the ESP32 has 3 serials we will configure for
– dbSerial enabled
– nexSerial to use our hardware serial Serial2
b) Edit NexConfig.h
locate the line
#define DEBUG_SERIAL_ENABLE
and ensure that it is not commented out,
then locate the line defining nexSerial
#define nexSerial Serial2
ensure it is Serial2 (pins GPIO16/GPIO17)
c) Edit NexHardware.cpp
locate the nexInit() function, here we configure the baudrate for Serial Monitor and Nextion.
We will use the Serial Monitor and set its baudrate high (no need to waste more MCU time than is needed),
then we will also need to configure for Nextion.
We have chosen 115200 baud in our requirements, so locate the lines
dbSerial.begin(9600); nexSerial.begin(9600);
and change these to our 250000/115200 baud
dbSerial.begin(250000); nexSerial.begin(115200);
Finally, Arduino’s AVR SoftwareSerial is not compatible
d) Edit Nextion.h
locate the line
#include NexUpload.h
ensure it is commented out or removed from this include list
//#include NexUpload.h
e) In the library folder rename NexUpload files
– rename NexUpload.h to NexUpload.h.txt
– rename NexUpload.cpp to NexUpload.cpp.txt
The Nextion HMI
Step 4
Creating the HMI for the Basic 3.2″ Nexiton NX4024T032_011
Picture Resources
– 1 background 240×400, add as Picture resource #0
Font Resources
– 1 8×16 ASCII ZI Font
Two Pages, page0 and page1
Page 0 contains
– Two Button Components
– Three Text Components
– One Number Component
– One Timer Component
Page 1 contains
– One Button Component
a) Start the Nextion Editor v0.53
b) Create a New Project
c) Name project Tutorial and click Save
Next the Settings Dialog opens to the Device TAB
d) Select Basic
e) Select NX4024T032_011 Model and click OK
Nextion Editor opens ready for the Project to be made
Step 5
Adding our Picture Resource for Page 0 background
a) in the Picture Pane, click +
b) Select your 240×400 picture file and click Open
The selected picture is now added as Picture Resource 0
Step 6
Set the Page page0 background to Picture Resource 0
a) set the page0 attribute .sta value dropdown to image and press return
b) double click the attribute .pic value and select resource 0 and press return
In the Event Pane, Preinitialize Event add
bauds=115200
This will now match our MCU side baudrate of 115200 from step 3c
Step 7
Adding our 8×16 Font
a) In the Font Pane click +
b) select your 8×16 ZI Font file (*.zi) and click Open
The Selected ZI Font is now added as Font Resource 0
Step 8
Add Button Component b0 (size 30×100) position 0,0
a) click attribute .txt value, type Page 1, press return
in the Event Pane,
b) check Send Component ID checkbox in Touch Release Event
Step 9
Add Text Component t0 (size 60×30) Position 0,82
a) click attribute .txt value, type Read:, press return
Step 10
Add Text Component t2 (size 80×30) Position 142,82
a) click attribute .txt value, type Normal, press return
b) click attribute .objname value, type t2, press return
c) click attribute .bco value, type 65504, press return
Step 11
Add Timer Component tm0 (size 80×30) Position 142,82
a) click attribute .tim value, type 50, press return
b) In Timer Event Code, add
if(n0.val>50) { n0.bco=63488 t2.txt="Too Hot!" }else { n0.bco=2016 t2.txt="Normal" }
Step 12
Add Number Component n0 (size 45×30) Position 80,82
Step 13
Add Text Component t1 (size 140×30) Position 0,154
a) click attribute .txt_maxl value, type 20, press return
b) click attribute .txt value, type Arduino Control, press return
Step 14
Add Button Component b1 (size 100×30) position 0,220
a) click attribute .txt value, type D2 LED, press return
in the Event Pane,
b) check Send Component ID checkbox in Touch Press Event
c) check Send Component ID checkbox in Touch Release Event
Step 15
Add new Page page1
in the Page pane click Add icon
a) click attribute .bco value, type 0, press return
Step 16
Add Button Component b0 (size 100×30) position 0,0
a) click attribute .txt value, type Back, press return
in the Event Pane,
b) check Send Component ID checkbox in Touch Release Event
Step 17
Compile the Nextion HMI project to a TFT file
On the Nextion Toolbar,
a) Click Save
b) Click Compile (which creates the Tutorial.tft file)
c) Optionally click Debug to test your HMI
Step 18
Preparing your microSD card
a) ensure the microSD card is embedded compatible
(I have good success with Kingston Class 10 HC 8GB microSDs)
b) ensure the microSD is format under Windows as FAT32
c) ensure there are no *.tft files on the microSD card
Step 19
Install the TFT to the Nextion device
In the Nextion Editor File Menu
a) Click Open Build Folder
b) copy Tutorial.tft to your prepared embedded microSD card
c) Turn power to the Nextion off.
d) Insert the microSD card with Tutorial.tft into Nextion device
e) Turn power to the Nextion on
f) Wait for Nextion to begin uploading and complete uploading
When Nextion completes uploading and states success
g) Turn power to the Nextion off
h) Remove the microSD card from the Nextion device
i) Turn the power to the Nextion on
j) Wait a few moments to ensure all firmware upgrades complete
At this point the Tutorial HMI should be running on the Nextion
The ESP32 MCU side of the Tutorial Project
Step 20
Include the Iteadlib Arduino Nexiton Library with the line
#include "Nextion.h"
Step 21
Declare essential MCU side HMI Components
– essential are the 2 pages, 3 Buttons, the n0 Number, and t1 Text
NexPage p0 = NexPage(0,0,"page0"); NexButton p0_b0 = NexButton(0,1,"b0"); NexNumber p0_n0 = NexNumber(0,5,"n0"); NexText p0_t1 = NexText(0,6,"t1"); NexButton p0_b1 = NexButton(0,7,"b1"); NexPage p1 = NexPage(1,0,"page1"); NexButton p1_b0 = NexButton(1,1,"b0");
Step 22
Build the nex_listen_list that the ESP32 will listen for
– only the buttons contained checked Send Component IDs
NexTouch *nex_listen_list[] = { &p0_b0, &p0_b1, &p1_b0, NULL };
Step 23
Declare other MCU side Variables
– uint32_t myInt used for updating number n0
– uint32_t next used for when to trigger intermittent function
– #define ledPin 2 used to identify LED pin GPIO2
uint32_t next, myInt = 0; #define ledPin 2
Step 24
Write a function for each Send Component ID checked
– page0.b1 Press to turn LED on
– page0.b1 Release to turn LED off
– page0.b0 Release to change page to page 1
– page1.b0 Release to change page to page 0
void p0_b1_Press(void *ptr) { digitalWrite(ledPin, HIGH); } void p0_b1_Release(void *ptr) { digitalWrite(ledPin, LOW); } void p0_b0_Release(void *ptr) { p1.show(); } void p1_b0_Release(void *ptr) { p0.show(); }
Step 25
Write the intermittent function for updating n0
– here we increment myInt from 0 to 100 and then circle back to 0
– and we update Nextion’s page0 n0 with the new value
void do_every_so_often() { myInt = (myInt + 1) % 101; p0_n0.setValue(myInt); }
Step 26
Creating the setup() function
– first, initialize the Nextion with nexInit()
– setup and initialize the pin for the LED
– add in our four Press/Release functions
– set page0 t1 Text
– initialize our next value for our intermittent function
void setup() { nexInit(); pinMode(ledPin,OUTPUT); digitalWrite(ledPin,LOW); p0_b0.attachPop(p0_b0_Release, &p0_b0); p0_b1.attachPush(p0_b1_Press, &p0_b1); p0_b1.attachPop(p0_b1_Release, &p0_b1); p1_b0.attachPop(p1_b0_Release, &p1_b0); p0_t1.setText("Arduino Text"); next = millis(); }
Step 27
Create our loop() code
– the first line is nexLoop()
– the next is a conditional and bridled intermittent call
void loop() { nexLoop(nex_listen_list); if(millis() >= next) { next = millis()+500; do_every_so_often(); } }
Step 28
In the Arduino IDE, compile the code to ensure there are no coding issues.
#include "Nextion.h" NexPage p0 = NexPage(0,0,"page0"); NexButton p0_b0 = NexButton(0,1,"b0"); NexNumber p0_n0 = NexNumber(0,5,"n0"); NexText p0_t1 = NexText(0,6,"t1"); NexButton p0_b1 = NexButton(0,7,"b1"); NexPage p1 = NexPage(1,0,"page1"); NexButton p1_b0 = NexButton(1,1,"b0"); NexTouch *nex_listen_list[] = { &p0_b0, &p0_b1, &p1_b0, NULL }; uint32_t next, myInt = 0; #define ledPin 2 void p0_b1_Press(void *ptr) { digitalWrite(ledPin, HIGH); } void p0_b1_Release(void *ptr) { digitalWrite(ledPin, LOW); } void p0_b0_Release(void *ptr) { p1.show(); } void p1_b0_Release(void *ptr) { p0.show(); } void do_every_so_often() { myInt = (myInt + 1) % 101; p0_n0.setValue(myInt); } void setup() { nexInit(); pinMode(ledPin,OUTPUT); digitalWrite(ledPin,LOW); p0_b0.attachPop(p0_b0_Release, &p0_b0); p0_b1.attachPush(p0_b1_Press, &p0_b1); p0_b1.attachPop(p0_b1_Release, &p0_b1); p1_b0.attachPop(p1_b0_Release, &p1_b0); p0_t1.setText("Arduino Text"); next = millis(); } void loop() { nexLoop(nex_listen_list); if(millis() >= next) { next = millis()+500; do_every_so_often(); } }
Step 29
Upload the sketch to the ESP32
Step 30
For each of the 4 Nextion DuPont connector ends
– we connect directly to the ESP32 pins
Nextion RX (yellow) connected to ESP32 Serial2 TX2
Nextion TX (blue) connected to ESP32 Serial2 RX2
Nextion GND (black) connected to ESP32 GND
Nextion 5V (red) connected to ESP32 VIN (Powered from USB)
Power Note:
I can connect this 3.2″ Nextion into this ESP32 Board because:
1) I confirmed with the board and this Nextion model’s Datasheets
as such, this board will deliver the recommended current.
2) Do not connect direct UNLESS you also make a similar confirmations
(for your specific board and your model Nextion) via Datasheets.
Nextion Datasheets are clear on the recommended supply it asks for.
Conclusion
We have now successfully created a basic HMI for Nextion
using an ESP32 MCU and the Iteadlib Arduino Nextion Library.
Nextion Button page0 b0
– notifies the ESP32, the ESP32 changes page to page 1
Nextion Button page1 b0
– notifies the ESP32, the ESP32 changes page to page 0
Nextion Button page 0 b1 press
– notifies the ESP32, and LED is lit while pressed
Nextion Button page 0 b1 release
– notifies the ESP32, and LED turns off when released
the ESP32 updates page0 t1 to “Arduino Text” from setup
In loop, periodic conditional and bridled
– update MCU side myInt and updates page0 n0
Nextion side timer code evaluates n0
– updates n0 background and t2.txt based on value