Based on "Cheap Internet Weather Station using LilyGo T-Display S3" by Volos Projects.
It's fully integrated into the OpenWX Suite with: OpenWXSDR, OpenWXTTGO, OpenWXDeck and OpenWXFleetMonitor.
LilyGO T-Display S3 https://www.lilygo.cc/
... but OpenWXStation is even more - It's a tiny and versatile Station Manager for your Radiosonde Decoder Gateways.
video_2026-09-27_00-46-26.mp4
- Install the PlatformIO IDE extension in VS Code and open this folder (the one containing
platformio.ini). - Build: PlatformIO toolbar β (or
pio run). Libraries and the ESP32 core (Arduino 2.0.x) download automatically. - Upload: β (or
pio run -t upload), then monitor: π (orpio device monitor). - If upload does not start: hold BOOT, tap RST, release BOOT, upload again, then tap RST once after flashing.
The TFT_eSPI display configuration (Setup206, T-Display S3) is set in platformio.ini β no edits to the library needed.
Board ESP32S3 Dev Module, ESP32 core 2.0.x (not 3.x), USB CDC On Boot: Enabled, Flash Size: 16MB, PSRAM: OPI PSRAM, Partition: 16M Flash (3MB APP/9.9MB FATFS) or Huge APP.
In Arduino/libraries/TFT_eSPI/User_Setup_Select.h comment out #include <User_Setup.h> and enable #include <User_Setups/Setup206_LilyGo_T_Display_S3.h>.
All settings live in OpenWXStation/data/config.yaml: location (name, latitude, longitude), Open-Meteo API URL,
units, pressure type, update/retry intervals, graph length, time zone (POSIX TZ with automatic DST), NTP server,
display rotation/brightness/night dimming, and WiFi portal settings.
- Edit
OpenWXStation/data/config.yaml - PlatformIO β Platform β Upload Filesystem Image (
pio run -t uploadfs) β only needed when the config changes - Restart the board. The serial log prints every loaded key (
[CFG] ...).
If SPIFFS is empty or the file is missing, built-in defaults are used and the start screen says so.
Partition table: partitions.csv (2 Γ 6.25 MB app, 3.4 MB SPIFFS, core dump).
| Button | Short press | Long press |
|---|---|---|
| BOOT (GPIO0, button 1) | Next page: weather β radiosonde β system info | 3 s: open WiFi setup portal |
| KEY (GPIO14, button 2) | Refresh weather + radiosondes now | 1 s: next brightness level |
Hold BOOT while the board starts to erase the stored WiFi credentials. The info page shows WiFi/RSSI, IP, last update, errors, uptime, battery voltage, memory and config status.
After WiFi is connected, open http://<ip>/ (the IP is shown for a few seconds after boot and on the info page) or http://openwx-station.local/.
- Live status (weather, WiFi, uptime, battery, memory)
- Place search (Open-Meteo geocoding, runs in your browser) β fills name, latitude, longitude
- All config.yaml settings as a form; Save settings writes config.yaml to SPIFFS and applies it immediately
- Advanced: edit the raw config.yaml; buttons for Refresh weather and Reboot
- Optional login: set
web.password(HTTP basic auth, userweb.user)
Initial setup: the WiFi setup portal (AP OpenWXS3, http://192.168.4.1) also asks for location name, latitude and longitude.
Receivers are configured in the web panel (System β Settings β Radiosonde receiver: Add / Edit / Test)
or in config.yaml as sections rx1: β¦ rx10: (enabled, source, host, port, name, user, password).
A v1.3 config with a single sonde.host is migrated to rx1 automatically.
| Receiver | Sondes (every poll) | Info + health (every 60 s) | Default port |
|---|---|---|---|
| OpenWXSDR | /api/sondes |
/api/gateway, /api/status, /api/health |
5000 |
| OpenWXTTGO | /api/sondes |
/live.json, /api/status, /api/health |
80 |
| OpenWXDeck | /api/status |
/api/config, /api/health |
80 |
All sondes are merged by serial (newest frame wins, "heard by" lists every receiver) and kept 24 h.
The device page shows the newest sonde; active = younger than sonde.max_age_s, older ones are recently received.
Unreachable receivers are retried every 60 s.
- Menu β Weather: large weather view (icon, temperature, condition, local clock, min/max, humidity, pressure, wind, 24 h chart)
- Menu β Radiosonde: monitor in OpenWXDeck style β map (Leaflet/OSM, needs internet in the browser) with receivers, sondes and tracks; sidebar with System Statistics, Active Radiosondes, Recently Received, System Health, Receiver Information
- System β Settings (tiles: Now Β· Location Β· Weather / Radiosonde Β· Radiosonde receiver Β· Display / WiFi Β· Web access Β· Time / System), Refresh, config.yaml (editor + download), Reboot
- About
The page source is web/index.html. PlatformIO embeds it (gzip) into OpenWXStation/webpage.h before every build
via tools/embed_web.py; with the Arduino IDE run python tools/embed_web.py after editing.
Note: Upload Filesystem Image replaces config.yaml on the device, including everything saved in the web panel.
Use it for a fresh setup only; otherwise download the current file via System β config.yaml first.