This uses a Nextion Display, an EPS32, and lots of Arduino C++ to allow sending messages back and forth over MQTT. Two setups are needed for this communication. I created this for my friend and her granddaughter(3yrs) to be able to communicate back and forth using EMOJIs. The ESP32 also has a built-in web server so when sending a picture is not enough, you can also send a text or some hidden images. The messages are queued and will even come in while the device is off. There is 1 button, used mostly for setting up the WIFI. Single clicking will do a random loop through the 6 visible EMOJIs, holding down for 6 seconds will reboot it and allow to set up the WIFI and MQTT details. I also used mDNS so while on your local network, you can go to HTTP://messageme.local on your home network to bring up the website. I decided I wasn't done, so I also added WebSockets to it so that if you are on the local website when messages are sent to the display, it will pop up on the website too. It's kind of like remote viewing what would have shown up on the display.
Grabbing the Data time on startup is important. If it can't it reboots until it can.
When you receive a message and the display shows a message pending, once you click on it, it saves that datetime read to the eeprom. Now if you receive more messages, it uses a REST query to grab the next message in the adafruit feed greater than the time the last message was read. That is how it can know there are messages queued even after rebooting or its been off for X minutes.
I wrote that code for a different display for friends and family to control my Christmas lights and send a message from a website. I found if it can't grab the date, it defaults to something like 1970. So now, I have 300 messages pending. If I click a message, that is saved and now I have to manually click through all 300. I was able to fix it manually, but for this device, I didn't want that to happen. No date, no start.