From 0759546e7de6a96fda6a9a004e3f37fe2ddcb75a Mon Sep 17 00:00:00 2001 From: Sadeep Madurange Date: Mon, 15 Dec 2025 22:37:40 +0800 Subject: Etlas write-up. --- _site/projects/etlas/index.html | 78 +++++++++++++++++++++++++++++------------ 1 file changed, 56 insertions(+), 22 deletions(-) (limited to '_site/projects') diff --git a/_site/projects/etlas/index.html b/_site/projects/etlas/index.html index f8f539f..6b2906b 100644 --- a/_site/projects/etlas/index.html +++ b/_site/projects/etlas/index.html @@ -44,9 +44,7 @@

ETLAS: E-PAPER DASHBOARD

05 SEPTEMBER 2024

-

Etlas is a news, stock market, and weather tracker powered by an ESP32 NodeMCU -D1, featuring a 7.5-inch Waveshare e-paper display and a -DHT22 sensor module.

+

Etlas is a weather, news, and stock price tracking system.

@@ -55,34 +53,70 @@ DHT22 sensor module.

-

The top left panel displays the end-of-day stock prices from the Polygon.io API, relayed through my own -FastCGI-wrapped Flask app hosted on a VPS. The stock symbols can be configured -through the Flask app’s application settings. The server.fcgi script enclosed -in the tarball at the end of the page contains the Flask app.

+

Acknowledgements

-

The following diagram outlines this system architecture.

+

The e-paper display driver in the epd.c file of the project is derived from Waveshare examples for Arduino +and STM32 platforms.

-

architecture

+

The exceptionally elegant algorithm in the file dht.c, which reads DHT22 sensor +data by comparing consecutive pulses, I ported directly from this implementation for ESP8266 +modules to my ESP32. All credit for the algorithm belongs to them.

+ +

Overview

-

Unlike my e-reader, which worked with raster images, -Etlas downloads time series data as CSV and computes the price curves on the -ESP32.

+

Etlas comprises an embedded system featuring an ESP32 NodeMCU D1 +microcontroller, a 7.5″ Waveshare e-paper display, a +DHT22 weather sensor, and a server backend consisting of a FastCGI-wrapped +Flask app. The following diagram outlines this system architecture.

+ +

architecture

-

The more prominent panel on the right of the e-paper display shows local -(Singapore) and world news from the Channel News Asia -RSS feed. The MCU downloads and parses XML data from the RSS feed directly -before rendering it to the display. Although I did it this way to avoid writing -server code, it limits the feeds from which Etlas can receive data. In a future -version, I will relay the RSS feed through a server (like the stock prices) to -make it more flexible.

+

The embedded application, written in C with the help of the ESP-IDF v5.2.1, +connects to a (2.4GHz) WiFi network at startup and obtains time from an NTP +server. It then composites and updates an internal pixel buffer using data +acquired from various data sources and renders to the screen by writing to its +Serial Peripheral Interface.

+ +

Price curves

+ +

On the e-paper display, the top-left panel displays end-of-day price curves +over two weeks from the Polygon.io API. The +microcontroller’s 512KB SRAM limits the price curves to two weeks. Instead of +using raster images for complex graphics—like e-paper projects often do—Etlas +computes the price curves from CSV data on the fly using the ESP32’s 160MHz +microprocessor. To avoid the overhead of floating-point arithmetic, all +computations are performed on integers. The gui_plot_stocks() function in the +gui.c file contains the rendering logic.

+ +

Proxying the price feeds through the Flask app permits me to configure the +tickers I’m interested in via its application settings. The Flask app cycles +through the tickers in its configuration file as it receives requests from the +embedded software. The Flask app is secured with basic authentication +implemented using htpasswd and OpenBSD’s httpd web server. This FastCGI-wrapped +architecture dramatically reduces the complexity of the server code and +increases system reliability.

+ +

News feed

+ +

The more prominent panel on the right displays news from Channel News Asia. The embedded program downloads +and parses the RSS feed before rendering it to the display. The character +glyphs used for rendering news are stored in header files in the sprites +directory as bitmaps. I created the glyphs manually by saving them as images in +GIMP and rasterizing them with ImageMagick.

+ +

I connected the embedded system directly to the RSS feed to write less server +code (the focus of this project was the embedded system). In hindsight, +however, it limits the feeds from which Etlas can receive data. In a future +version, I will relay the RSS feed through the backend (like the stock prices) +to make it more flexible.

+ +

Weather data

The bottom panels (middle and right) display the temperature and relative humidity from a DHT22 sensor. The DHT22 driver, arguably the most interesting part of the software, reads real-time sensor data by comparing relative pulse widths. The pulses themselves are too quick for the ESP32 to reliably measure -directly. I ported this -implementation for ESP8266 modules to my ESP32. All credit for the algorithm -belongs to them.

+directly.

Much of the heavy lifting of acquiring, interpreting, and rendering data from different data sources is performed on the microcontroller using less than 512 -- cgit v1.2.3