ESP32 WebServer Made AS7341 Accessible via HTTP GET
I've decided to build an interactive AS7341 explorer application using web-based technologies, shifting most of the interactive input and visual output to a web browser. But web-based technologies are not able to communicate directly to an AS7341 via I2C, so I still need something to bridge the hardware to the browser. The answer is a small ESP32 Arduino Core sketch using Adafruit's AS7341 library on one side and a web server library on the other.
In the interest of starting simple, I used the WebServer library included as part of ESP32 Arduino Core. This is a simple implementation of HTTP server that can only handle a single connection at a time, but its limited features also meant simple code. I started with the HelloServer example which does everything I need: parse arguments and send a response. The most informative section is the handler for "HTTP 404 Not Found", as this is where it prints out all the arguments parsed out of the URI and serves as a handy reference to do the same in my implementation. I wanted to be able to pass in AS7341 parameters "atime" and "astep" to control sensor exposure time, "gain" for sensitivity, and "led_ma" to control brightness of illumination LED. These parameters are passed directly into Adafruit AS7341 API.
My first iteration would turn on LED just for the duration of sensor integration then turn it off. But when I read the sensor continuously in a loop, this would result in an annoying flash between reads. To address this problem, I added a "led_stay_on" parameter to control whether the illumination LED would stay on between reads.
Once sensor integration is complete, I packaged readings for sensors F1-F8, Clear, and NIR into a JSON formatted string and returned it to caller as mime type application/json
.
{
"415nm" : 7,
"445nm" : 22,
"480nm" : 31,
"515nm" : 65,
"555nm" : 113,
"590nm" : 175,
"630nm" : 243,
"680nm" : 125,
"clear" : 408,
"nir" : 28,
"settings" : {
"atime" : 10,
"astep" : 599,
"gain" : 64,
"led_ma" : 0
}
}
In hindsight, using an ESP32 was overkill: an ESP8266 would have been perfectly capable of serving as a HTTP to I2C bridge. But I already had this ESP32 ready to go, so I stayed with it.
If I want capabilities beyond what that simple WebServer library could do, in the future I could swap it out for something more powerful like the ESPAsyncWebServer library. It includes a templating feature so I wouldn't have to do as much direct string manipulation. It also includes the ArduinoJson library for simpler and more robust JSON formatting instead of the string operations I used. And finally, it includes WebSocket capability which would be very useful if I want to migrate the messy ESP-IDF code I wrote for my ESP32 Sawppy controller.
But for today, simple WebServer should be enough to let get me started on browser side code.
Code for this project is publicly available on GitHub