Driver for Grid-EYE 8x8 pixel thermal infra red array sensor (Adafruit 3538).
Now provides optional bicubic interpolation for camera displays.
The driver is a port of the Adafruit CircuitPython driver modified for MicroPython.
Original author(s): Dean Miller, Scott Shawcroft.
Adapted by Peter Hinch. Dependencies on Adafruit libraries removed, coding
adapted to conform to MicroPython conventions. Extended to provide additional
functionality.
A typical camera build:

Interpolated images (a cup of coffee):

My chair a while after I had got up:

A re-creation of the Adafruit fingers
demo. Note that their version uses numpy and scipy on a Raspberry Pi as against
bicubic interpolation on a Pyboard.

The update rate with bicubic interpolation is just over 3Hz.
amg88xx.pyThe device driver.amg_test.pySimple text based test program.
For thermal camera use:
cam.pyThermal camera demo for Adafruit 0.96 inch OLED display.cam_lcd.pyThermal camera demo for official LCD160CR display.mapper.pyProvides a class to convert temperature values to rgb colors. Required for both demos.ssd1331.pyDriver for Adafruit 0.96 OLED display.
The Adafruit OLED display driver is from this repo which also has drivers for their larger displays based on the SSD1351 chip. The repo has optional drivers supporting 16 bit color: these trade improved color against a larger frame buffer, and so are best suited to platforms with plenty of RAM.
The driver for the official LCD160CR is included in Pyboard firmware. Source is here.
The my_cam directory contains a complete set of files for my camera project.
In camera applications the 8x8 matrix of the AMG8833 gives a "blocky" effect.
This can be reduced by using bicubic interpolation. Files and
doc for this are in the interpolate directory.
If used with a Pyboard
| pyboard | amg8833 |
|---|---|
| 3V3 | VIN |
| GND | GND |
| SCL X9 | SCL |
| SDA X10 | SDA |
This maintains an internal bytearray object holding a single frame of raw
data from the sensor. It is populated by the refresh method. The contents may
be retrieved as integer temperatures in °C by means of array access syntax.
Constructor:
This takes the following arguments:
i2cAnI2Cinstance created using themachinemodule.address=0x69The default device address. If you solder the jumper on the back of the board labeledAddr, the address will change to 0x68.
Data access methods:
refreshTakes an optional arg which is ignored. This method causes the internal array to be updated with data from the sensor. On a Pyboard 1.x this method blocks for 2.9ms. This method does not allocate RAM and may be called by an interrupt service routine. The dummy arg facilitiates use as a timer callback (see commented out code incam.py).__getitem__Argsrow,col. Enables access to the data retrieved byrefresh. Return value is a signed integer representing the temperature of that pixel in °C (or °C x 4 in high resolution mode).temperatureNo args. Returns the device temperature in °C as a float.
Mode setting methods:
hi_res=NoneBy default pixel temperatures are returned in °C. IfTrueis passed, future readings will be in 0.25°C increments. This is the fundamental resolution of the chip, although its absolute accuracy is +-2.5°C. IfFalseis passed, future readings will be in °C. By default no change is made. In all cases the method returnsTrueif in high resolution mode.ma_mode=NoneIfTrueis passed the chip operates in moving average mode. This reduces noise at the expense of response speed. IfFalseis passed, moving average mode is cancelled. By default no change is made. In all cases the current mode is returned.
Example usage:
After issuing the refresh method, a set of pixel data may be read by means of
array access.
import machine
import utime
from amg88xx import AMG88XX
i2c = machine.I2C(1)
sensor = AMG88XX(i2c)
while True:
utime.sleep(0.2)
sensor.refresh()
for row in range(8):
print()
for col in range(8):
print('{:4d}'.format(sensor[row, col]), end='')This assumes a Pyboard linked to an Adafruit 0.96 OLED display. Wiring is as follows:
| pyboard | OLED |
|---|---|
| 3V3 | VCC |
| GND | GND |
| X8 MOSI | SDA |
| X6 SCL | SCL |
| X3 | RES |
| X2 | CS |
| X1 | DC |
The sensor is wired as in section 2.
Orientation of the display may be adjusted to match the physical layout of the devices by setting the following program booleans:
invertSwap top and bottom.reflectSwap left and right.transposeExchange row and column.
The limits of temperature display may be adjusted by assigning integer values to these program values:
TMAXTemperatures >=TMAXappear red.TMINTemperatures <=TMINappear blue.
As written this assumes a Pyboard 1.x with the LCD fitted in the 'Y' position and the sensor wired as in section 2.
Orientation of the display may be adjusted to match the physical layout of the devices by setting the following program booleans:
invertSwap top and bottom.reflectSwap left and right.transposeExchange row and column.
The limits of temperature display may be adjusted by assigning integer values to these program values:
TMAXTemperatures >=TMAXappear red.TMINTemperatures <=TMINappear blue.
This simple class converts a temperature in °C to 8 bit rgb color values compatible with most display drivers. Conversion uses a predefined mapping with blue for low temperatures through green to red, with constant overall brightness. Out of range temperature values are clipped to the maximum or minimum as required. The range covered may be dynamically altered.
Constructor
This takes the following args:
tminMinimum temperature to represent (°C).tmaxMaximum temperature to represent (°C).ncolors=30Number of color gradations.
Methods:
set_range(tmin, tmax)Allows the temperature range to be altered dynamically.__call__(t)Function call syntax takes a temperature in °C and returns(r, g, b). Red, green and blue values are in range 0..255.