Waveshare E-Paper Cloud module
A module composed of:
- ESP32 chip
- E-Paper display of several different sizes
- Battery
Powered by USB-C
Vendor documentation:
GPIO Pinout
| PIN (e-Paper) | ESP32 | Description |
|---|---|---|
| VCC | VCC | Power input (3.3V) |
| GND | GND | GND |
| KEY | 12 | User button, Low active |
| SCK | 13 | CLK pin of SPI, clock input |
| DIN | 14 | MOSI pin of SPI, data input |
| CS | 15 | Chip select pin of SPI, Low active |
| BUSY | 25 | Busy pin, it indicates whether the e-Paper is busy |
| RST | 26 | Reset pin, Low active |
| DC | 27 | Data/Command control pin, Low for Command and High for Data |
| ADC | 36 | ADC data input, the voltage detected is the 1/3 of the battery voltage. |
Product Images

Flashing
Make sure you have a working driver installed for the CP2102 USB to serial convertor chip. I had problems with the stock MacOS Monterey one. After that simply connect to the USB-C port and flash as usual (in case of problems with enter programming mode, connect IO0 to GND, reset the device with reset button (EN) and keep the connection between GPIO0 and GND until programming starts).
Device Specific Config
substitutions:
devicename: "waveshare"
esp32:
board: esp32dev
framework:
type: arduino
sensor:
- platform: adc
pin: GPIO36
name: "${devicename} Battery voltage"
id: battery_voltage
icon: mdi:battery
device_class: voltage
attenuation: auto # without attenuation the adc is saturated (VBat/3 > 1.1 V)
filters:
- multiply: 3
update_interval: 60s
spi:
clk_pin: GPIO13
mosi_pin: GPIO14
binary_sensor:
- platform: gpio
pin:
number: GPIO12
inverted: true # user button pull IO12 to GND
mode: # pin as input and enable pull up
input: true
pullup: true
name: "${devicename} button"
filters:
- delayed_on: 50ms
on_press:
- logger.log: "Button pressed"
font:
- file: "gfonts://Roboto"
id: roboto
size: 20
display:
- platform: waveshare_epaper
cs_pin: GPIO15
dc_pin: GPIO27
busy_pin: GPIO25
reset_pin: GPIO26
model: 2.13in-ttgo-dke # choose your display size here
rotation: 270
full_update_every: 12 # every 12th time
update_interval: 60s
lambda: |-
it.print(0, 0, id(roboto), "Hello World!");