Every weather display I looked at wanted something from me first. An account here, an API key there, a phone app to pair with, a cloud service that would keep working right up until the day it didn’t. For a thing whose entire job is to sit on a shelf and tell me whether to take a coat, that seemed like a lot of paperwork.
So I built one that asks for nothing. Plug it in, tap your Wi-Fi network, type the password. It works out where it is, fetches the forecast, and gets on with it.
What it does
It runs on a Waveshare ESP32-S3-Touch-LCD-7 — an 800×480 IPS panel with capacitive touch, driven by an ESP32-S3 with 8 MB of PSRAM. On screen you get current conditions, a seven-day forecast, and a clock synced over SNTP and shown in local time.
- It finds itself. The location comes from the public IP address, so there is no locator, no postcode and no map to fiddle with. The result is cached, so if the geolocation provider has a bad day the screen does not go blank.
- Current conditions — temperature, apparent temperature, humidity, wind, surface pressure, precipitation, sunrise and sunset.
- Seven-day forecast — high and low, conditions, and the chance of rain for each day.
- Days off are marked. Weekends and regional public holidays are flagged on the forecast, with the holiday’s local name. Handy for working out whether tomorrow is a good day to be on the roof with an antenna.
- Three languages — English, German and Russian, switchable on the settings screen and remembered across reboots.
- Wi-Fi setup on the panel itself. It scans, lists networks strongest first, and takes the password on a touch keyboard. No serial console, no config file, no captive portal.
The details that took the longest
Two things in that list cost far more time than they look like they should have, and both are invisible when they work.
The credentials are only saved once the connection actually succeeds. The obvious way round — store what was typed, then try it — means a single typo overwrites the working network you had before, and now the thing is stranded on a shelf with no keyboard. So it connects first and commits second.
The picture does not tear. LVGL draws straight into the RGB peripheral’s two frame buffers in PSRAM and flips pages on vsync. Get this wrong and you see the redraw crawling down the screen every fifteen minutes. Get it right and nobody ever notices, which is the point.
The weather icons are worth a mention too. They are not bitmaps — each one is composed from gradient-filled LVGL primitives, so they scale to any size and cost nothing in flash. The large icon animates: rain falls, clouds drift, lightning strikes.
Where the data comes from
Forecasts come from Open-Meteo, which is free for non-commercial use and, importantly, needs no key. Location is resolved through ipapi.co, falling back to ip-api.com if that is unavailable.
That choice of sources is deliberate. Anything requiring an account is a service that can change its terms, start charging, or simply switch off — and when it does, every unit ever built stops working at the same moment. A weather station that dies because someone else’s business model changed is not much of a weather station.
Try it without building anything
There are prebuilt images in the repository. If you have the board, you need esptool and one command:
esptool.py --chip esp32s3 --port COM14 --baud 460800 \
write_flash 0x0 esp32_weather-merged.bin
The images are built for the 8 MB flash variant. Some boards ship with 16 MB — check yours with esptool.py flash_id first, and if it differs there is a one-line change in sdkconfig.defaults before rebuilding. Checksums for every image are in the repository so you can verify what you are about to flash.
Building from source needs ESP-IDF v5.3 or newer, developed against v5.5.4:
idf.py set-target esp32s3
idf.py build
idf.py -p COM14 flash monitor
The managed components — LVGL 9.2, esp_lvgl_port and the GT911 touch driver — are fetched automatically on the first build.
It is public domain
The firmware is released under the Unlicense. Not “open source with conditions” — public domain. Take it, change it, sell it, put your own name on it. I would rather it were useful than that I got credit for it.
The full source, the pin map, the schematics notes and the prebuilt images are all here:
github.com/dm5al/esp32-weather-station
If you build one, I would genuinely like to see it — and if something in the instructions does not work on your board, open an issue and I will fix it.