Waveshare 400×300 4.2″ three-color SPI E-Ink / E-Paper display module (WHL #38)

Bit of an upmarket item for today, not the usual Wan Hung Lo…had the honour to make that thing display some demo content for a side project at work. So…why not take some photos, publish the code, and get ahold of a similar unit for use at home?

So this is an e-Paper / e-Ink display, actually a module that consists of the display unit itself and a base PCB that takes the flimsy flat-flex connector, adds some passives and presents a more sturdy interface to the microcontroller that will be handling the thing. Also, the PCB is large enough to offer mount points on each corner. Yes, area-wise this PCB is a bit of a waste, but you would buy a smaller hat anyway for the connector conversion, so that’s alright. Fixing displays in place is important!

As I got this unit from work, I don’t have exact pricing details. I know that today the entire assembly will be 36.95€ (including 19% VAT) plus 5.90€ shipping at Eckstein shop. Not sure if the cable is included, but that shouldn’t add a lot if it is not. Compared to OLED screens of that size, it is quite cheap, but it obviously has some ups and downs, and there are applications where you wouldn’t replace e-Ink with OLED and vice-versa. But from a “get a big screen for your Arduino” perspective, I think this is a bargain.

The manufacturer has its own shop and even a wiki page for it. They currently charge USD 35.99 for the display and USD 4.50 for shipping, which converts to 33€ at the moment. As this would be subject to 19% VAT (item is over 22€), it’s around 39€ delivered – ten percent less than buying locally, which, to me, isn’t worth the hassle with shipping and customs. And that’s a rare occasion for stuff that I review ;)

Well, there’s not much to show, the unit is 103x79mm in size (close to 4″x3″ in Yankee terms), display area is 85x64mm or 106mm / 4.2″ diagonal. Dot pitch is therefore 0.21mm, which is the same as 1920×1080 FHD on a 18.5″ screen – so while not competing with modern phone screens, I think that’s decent. Waveshare rates power consumption on display refresh at 26mW, which I can confirm. On a Wemos ESP8266 device, total power consumption is around 370mW on refresh, while it’s 340mW on idle – sounds about right. Standby power consumption is rated way below 1mW, so even if you don’t cut power to the display while it’s doing nothing, you’re not wasting power. Also, my power figures include the efficiency of the DC-DC converter, as ESP8266 and also the display run on 3.3V, but they are powered from 5V USB.

A word on refresh rate: It takes quite a time for the display to refresh, and I guess that is part of the supplied code. I didn’t time it, but it was in the order of 10 seconds. Doesn’t really matter for logging applications or almost-static displays as we intend to, but for other purposes this might be unsuitable. However, I know that Ben Krasnow already had one of these in his workshop and he managed to get 3 Hz refresh rate out of it. Still, that might shorten the lifespan, it might cost you quite some time to figure it out, and it also might not work on the three-color version of the display that I’m using here, but instead you’ll need the 2-color b&w version. Here’s the video, for reference: (Subscribe to Ben, he’s awesome!)

Visibility is excellent, as you would expect. This is as close to 180° viewing angle as a sheet of paper. Note that the protective foil is still attached to my unit, so that’ll account for some glare and graininess. Everything is crisp, much better than a traditional LCD with similar pixel density.

Now about getting started – as this requires quite some libraries, I’ve chosen to upload a demo sketch to Github – have a look: https://github.com/Bzzz/epaper_max44009_esp8266_plot

Let me just quote from the Readme file, you’ll need:

*ESP8266 support (if not already shipped with your Arduino board packages, use the library manager to download something appropriate, e.g. Blynk, generic ESP libraries from Wemos Wiki)
*the Adafruit GFX library (library manager, tested with v1.2.3)
*Waveshare ePaper library from Github:ZinggJM
*MAX44009 library from Github:RobTillaart (thanks for enhancing your code to support ESP8266 devices)

RobTillaart actually processed my request to make his MAX44009 ambient light sensor library fit the GPIO architecture of the ESP8266 real quick, and I’ve since updated the sketch to accommodate for these changes. You can now directly specify the SDA/SCL pins for use with ESP devices, as they are usually fixed with small to medium Arduinos. I chose D1 and D6, as the others were taken by the default SPI wiring of the e-Ink display (again, see Readme of this project and also those of the linked libraries). So I used the GY-49 / MAX44009 board to generate some meaningful data to plot, but that puppy still needs a review.

I also played quite a lot with some GFX and text from the GxEPD examples. There’s two problems for users in countries that utilize more than the standard a-Z characters – those chars are a) not included in the default font set (relatively easy to create them your own, fully documented in the Adafruit GFX package if you’re using Linux or cygwin), and b) they need to be put in separately, as a simple print instruction silently fails to display them. Here’s for example the word “Beschäftigt” (as in “busy”) – this needs to be split up into three instructions.


While that is annoying for static text, it absolutely needs to be parsed char by char if you intend to put in dynamic text, for example when using this as a semi-static status display. I didn’t bother to build such a parser, but I’d rather support Adafruit in getting the default 7-bit charset upped to 8-bit, so that most characters used in European languages are supported without that hassle. But that’s a side project that hasn’t really much to do with this display, as the Adafruit library is pretty universal for a buttload of displays on the market, including those small OLEDs with SSD1306 controller shown in WHL #6.

So, once everything was hooked up and the ESP module was running the code as stated above, I got this:

One hour of sunset light intensity as seen from my kitchen… :cool:

Notify of
:mrgreen:  :neutral:  :twisted:  :arrow:  :shock:  :smile:  :???:  :cool:  :evil:  :grin:  :idea:  :oops:  :razz:  :roll:  ;-)  :cry:  :eek:  :lol:  :mad:  :sad:  :suspect:  :!:  :?:  :bye:  :good:  :negative:  :scratch:  :wacko:  :yahoo:  :heart:  B-)  :rose:  :whistle:  :yes:  :cry2:  :mail:  :-((  :unsure:  :wink: 
Inline Feedbacks
View all comments