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. --- _projects/etlas.md | 89 ++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 63 insertions(+), 26 deletions(-) (limited to '_projects') diff --git a/_projects/etlas.md b/_projects/etlas.md index 6a03880..775aa31 100644 --- a/_projects/etlas.md +++ b/_projects/etlas.md @@ -5,10 +5,7 @@ thumbnail: dash.jpg layout: post --- -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. @@ -17,38 +14,78 @@ 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. + +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 + +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](etlas_arch.png) -Unlike my [e-reader](/projects/e-reader), which worked with raster images, -Etlas downloads time series data as CSV and computes the price curves on the -ESP32. +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. -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. +## 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