Introduction ¶
A while ago I got some large, high resolution OLED displays from AliExpress. I intended to use them for an ESP32 powered handheld NES emulator but the completion of my Retropie Handheld decreased my interest in making it. So, I had these two, crisp and perfect large displays, but I had no idea what to do with them. Recently I’ve been working on writing the firmware for this multi app smart sensor. I plan to add more functions to it as time progresses. Currently it has a BME280 sensor reading out temperature, humidity, air pressure, along with an NTP clock.
Software ¶
My personal favorite “application” is the NTP clock. The way it works is that the ESP8266 connects to an NTP server and fetches the time. I have to add an offset to convert the time to PST. The button on the right of the smart sensor changes the time offset by an hour so that I don’t have to reprogram the sensor when daylight savings happens. I also have programmed in offsets for 3 other time zones, EST, GMT, and JST, with little icons representing NYC, London and Japan respecively on the screen. The weather station was much simpler to program for since it was an entirely local function since the BME280 is connected directly to the ESP8266 on the I2C bus.
This project used a lot of libraries. Again, I used the TFT_eSPI library for the creating the graphics for this device. This library is excellent for drawing clean, fast graphics to color Arduino displays. To configure the library to work for the 1.54 inch 240x240 ST7789 display you need to copy the following settings into the User_Setup.h file that is in the TFT_eSPI library directory. The code is available on my github. I also used Adafruit’s BME280 library and the NTPClient libraries for making the weather station and wifi clock apps work.
// See SetupX_Template.h for all options available
#define USER_SETUP_ID 18
#define ST7789_DRIVER
// #define TFT_SDA_READ // This option is for ESP32 ONLY, tested with ST7789 display only
// If colours are inverted (white shows as black) then uncomment one of the next
// 2 lines try both options, one of the options should correct the inversion.
// #define TFT_INVERSION_ON
// #define TFT_INVERSION_OFF
// For ST7789 ONLY, define the colour order IF the blue and red are swapped on your display
// Try ONE option at a time to find the correct colour order for your display
// #define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue
#define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red
// My ST7789 display has TCT_CS wired permananently low so the pin is not defined here
// For NodeMCU - use pin numbers in the form PIN_Dx where Dx is the NodeMCU pin designation
#define TFT_DC PIN_D3 // Data Command control pin
#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line)
#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH
#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters
#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm
#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-.
#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.
#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts
#define SMOOTH_FONT
// #define SPI_FREQUENCY 20000000
#define SPI_FREQUENCY 27000000
// #define SPI_FREQUENCY 40000000
// #define SPI_FREQUENCY 80000000
#define SPI_TOUCH_FREQUENCY 2500000
//#define SUPPORT_TRANSACTIONS
Wiring ¶
Here’s the schematic. I used pull down resistors for the two input buttons because without them, the device flickers between the different modes. Overall this is a pretty simple schematic. The only thing to consider when assembling your own device, use thin wires for the data signals. There isn’t a lot of space between the display and the microcontroller so using long and thick wires is not a good idea.
Case Design ¶
The case is split into two parts. One part contains the microcontroller, BME280 sensor and micro USB port breakout board. The other half contains the display and two pushbuttons. I used M3 hex button screws to put everything together.
And now, here’s what it looks like in real life.