Notes on Adafruit AS7341 Arduino Library Example Code
I've purchased an AS7341 breakout board from Adafruit (#4698) and read through their guide (single-page view) on the board. It's nice to see their library takes care of the complexity of this chip's internals such as SMUX configuration. Examples that come bundled with a library is always a good overview of capabilities, and this is what I see from its examples directory:
-
basic_counts
: "Basic Counts" is a concept described in the AS7341 calibration application note. A bit of math that takes raw sensor counts and compensates for gain and integration time. AMS recommends application logic work with "Basic Counts". This lets us change gain and integration based on environment and still keep the rest of the application logic unchanged. -
flicker_detection
: Prime concern of flicker detection is with household AC power frequencies of 50Hz or 60Hz however this sensor is not limited to those rates. The datasheet says it can detect flicker frequencies up to 2kHz. This capability feels like a potential project all by itself, I'll have to think more about it. -
get_channel
: Performs a read of all channels then iterates through 10 spectral sensing channels of 8 visible spectrum + clear + infrared to print their raw counts. (Flicker detection channel is ignored.) -
gpio_example
: Using the "GPIO" pin as a digital output. High for 3 seconds and low for half a second and repeat. Important note: according to board schematic published by Adafruit, the GPIO pin is brought out directly to the headers. There is no voltage level shifting or protection on this pin so be sure to consult datasheet and be nice to this 1.8V part. -
gpio_input_example
: Using the "GPIO" pin as digital input. Samples every half second and prints either "high" or "low" to serial console. -
led_test
: The canonical "blink a LED" test implemented with the LED Adafruit installed on the breakout board connected to AS7341's LDR pin. Lights up at 4mA for 1/10th of a second, dark for half a second, light up to 100mA for 1/10th of a second, dark for another half a second, and repeat. Note while the AS7341 constant current control register goes up to 258mA, we shouldn't go that far. According to board schematic published by Adafruit, the onboard LED is an EAHC2835WD6 with recommended ceiling of 150mA and absolute maximum of 180mA. -
plotter_example
: A clever variation onget_channel
designed to work with Arduino IDE's Serial Plotter feature. Five comma-separated sensor values are printed on a line so that when we turn on Serial Plotter, the plotter line drawing colors are close to the color wavelength of that sensor. -
read_all_channels
: This is almost identical toget_channel
. The only difference is this sketch passes an array into the call toreadAllChannels()
and prints from sketch's own array. get_channel does the exact same thing using the array stored in Adafruit library object. -
reading_while_looping
: Most of these examples callreadAllChannels()
, which is a blocking call that waits for sensor integration to complete before returning with results. Depending on integration time configuration, delay caused by waiting can be problematic. This sketch illustrates a way to initiate AS7341 integration and yield control so other things can happen until integration is complete. Note: the I2C operations involved are still blocking calls via Arduino's Wire library. -
smux_test
: I didn't understand this sketch. It has an emptyloop()
and I don't see howsetup()
tests SMUX in any way. -
spectral_interrupts
: By its name I hoped to see a demonstration of using AS7341 INT pin to generate a hardware interrupt signal for Arduino microcontroller, triggering an ISR (interrupt service routine) for sensor read. I was wrong, the "interrupt" for this sketch is merely a register flag that we read from withinloop()
. -
synd_mode
: By its name I hoped to see a demonstration of using GPIO pin to trigger start of AS7341 sensor integration. This time I think I got my wish! Unlike all of the other examples, this sketch doesn't use Adafruit's AS7341 library and was not written by anyone at Adafruit. It uses the Wire library directly and was written by an AMS application support engineer.
Despite mysteries like smux_test
, I see a good set of examples here to help me become familiar with AS7341 capabilities. A sensible person would start their exploration with simple modifications to one of these sample sketches. I did not go down that path of sensibility.