Skip to content
Kiln Forged
All projects
ConceptE-paper · Sensors · USB-C

Desk Weather Station

A small desk display showing temperature, humidity and air pressure, with a simple rain forecast. The e-paper screen stays readable with the power off.

“Build a little desk display that shows the temperature and humidity in my room.”
Loading 3D view…
Stage 1

Spec

Spec
Qty 1

Desk Weather Station

A USB-powered e-paper display that shows indoor temperature, humidity and pressure.

Power
USB-C, 5 V
Size
54 × 54 × 16 mm, on a small stand
Inputs
BME280 temperature/humidity/pressure sensor, Button
Outputs
1.54" e-paper display (200 × 200)
Connectivity
USB-C, Wi-Fi capable
Budget
Under $30 in parts

Constraints

  • Sensor kept away from the chip's heat
  • Why

    E-paper screen

    E-paper reads like paper, has no glow at night, and only uses power when it changes.

Stage 2

Circuit board

Top view of the Desk Weather Station board46 mm46 mmU2J1SW1
ESP32-C3-MINI-119 components2-layer, 46 × 46 mm≈ $19.60 in parts
  • Why

    Sensor in its own corner

    The BME280 sits in a corner with a slot cut around it, so heat from the chip doesn't throw off the temperature.

Stage 3

Firmware

src/main.cppArduino (PlatformIO) + GxEPD2
// Desk Weather Station — shows indoor temperature, humidity and pressure
// on a 1.54" e-paper display, refreshed every five minutes.

#include <Arduino.h>
#include <Wire.h>
#include <Adafruit_BME280.h>
#include <GxEPD2_BW.h>
#include <Fonts/FreeSansBold18pt7b.h>
#include <Fonts/FreeSans9pt7b.h>
#include "pins.h"

constexpr uint32_t REFRESH_MS = 5UL * 60UL * 1000UL;

GxEPD2_BW<GxEPD2_154_GDEY0154D67, GxEPD2_154_GDEY0154D67::HEIGHT> display(
    GxEPD2_154_GDEY0154D67(PIN_EPD_CS, PIN_EPD_DC, PIN_EPD_RST, PIN_EPD_BUSY));
Adafruit_BME280 bme;

void drawReading(float tempC, float rh, float hPa) {
  display.setFullWindow();
  display.firstPage();
  do {
    display.fillScreen(GxEPD_WHITE);
    display.setTextColor(GxEPD_BLACK);

    display.setFont(&FreeSansBold18pt7b);
    display.setCursor(16, 64);
    display.printf("%.1f C", tempC);

3 files: src/main.cpp, include/pins.h, platformio.ini

  • Why

    Refresh every 5 minutes

    Indoor conditions change slowly, and fewer refreshes keep the e-paper crisp.

Stage 4

Enclosure

Outer size
54 × 54 × 16 mm
Material
PLA, 0.16 mm layers
Print time
1 h 15 min, no supports
  • Why

    Vents by the sensor

    Small slots next to the sensor let room air reach it.

Stage 5

Assembly

  1. 1Connect the display ribbon.
  2. 2Screw the board in.
  3. 3Snap on the bezel.
  • Why

    Fit check passed

    Display sits flush with the bezel.

See every stage run, step by step

The workspace shows each engine working, with approval checkpoints in between.

Open in workspace