Chart.js For Visualizing AS7341 Data
There's no shortage of web frameworks that help us put pretty things on screen. I've been eyeing A-Frame, Three.js, and D3.js for use in the right project but all would be overkill for my AS7341 interface: I just need to plot eight data points and there's no need for interactive drill-down. Would the web development ecosystem have something that fits the bill? The answer is definitely "Yes" because this is the same ecosystem that gave us "leftpad" and the debacle it caused. Yeah, I could spend a few hours and write my own, but I know I don't have to.
I went on NPM to search for charting modules and as soon as I typed "chart" I got the suggestion to look at Chart.js. A brief read of documentation told me this fits my needs. Simple, lightweight, and minimal interactivity capabilities that I plan to turn off anyway. No need for fancy graphics of WebGL or DOM interactivity of SVG, Chart.js draws onscreen using HTML Canvas. Canvas was the API I used for my Micro Sawppy browser interface, so I have a rough idea of what Canvas could and could not do.
With my limited needs, I don't expect to use most of Chart.js capabilities. But I'm happy to incorporate those that are convenient and require minimal/no effort on my part. One good bit of visual polish is its ability to animate updates to chart data, smoothly growing or shrinking bars in my bar chart based on updated AS7341 sensor data. Another bit of convenience was the ability to specify color used for each bar. I could draw the bar for one AS7341 sensor with the color that corresponds to its wavelength, which helps give me an intuitive grasp of the spectrum seen by AS7341. A quick web search found Academo's interactive wavelength to color converter and I used that to determine colors of each bar F1-F8.
What about the other sensors? I'm completely ignoring the flicker detector right now, and I decided not to draw the clear channel. From my experiments, the clear channel typically has the highest value (which makes sense as it's the sensor without any color filters blocking input) so I used its value as the Y-axis maximum. I also plotted the near infrared channel, but since it's invisible I plotted it using an arbitrary chosen dark red color. This seemed to work when I first wrote the code late at night under artificial light. The next morning, I played under natural sunlight and that was an entirely different beast.
Code for this project is publicly available on GitHub