111 lines
2.8 KiB
Python
111 lines
2.8 KiB
Python
"""This example is for Raspberry Pi (Linux) only!
|
|
It will not work on microcontrollers running CircuitPython!"""
|
|
|
|
import sys
|
|
import math
|
|
import time
|
|
import busio
|
|
import board
|
|
import numpy as np
|
|
from scipy.interpolate import griddata
|
|
from colour import Color
|
|
import adafruit_amg88xx
|
|
|
|
I2C_BUS = busio.I2C(board.SCL, board.SDA)
|
|
|
|
# low range of the sensor (this will be blue on the screen)
|
|
MINTEMP = 26.0
|
|
# high range of the sensor (this will be red on the screen)
|
|
MAXTEMP = 32.0
|
|
COLORDEPTH = 1024
|
|
SENSOR = adafruit_amg88xx.AMG88XX(I2C_BUS)
|
|
|
|
# pylint: disable=invalid-slice-index
|
|
POINTS = [(math.floor(ix / 8), (ix % 8)) for ix in range(0, 64)]
|
|
GRID_X, GRID_Y = np.mgrid[0:7:32j, 0:7:32j]
|
|
# pylint: enable=invalid-slice-index
|
|
|
|
# sensor is an 8x8 grid so lets do a square
|
|
HEIGHT = 240
|
|
WIDTH = 240
|
|
|
|
# the list of colors we can choose from
|
|
BLUE = Color("indigo")
|
|
COLORS = list(BLUE.range_to(Color("red"), COLORDEPTH))
|
|
|
|
# create the array of colors
|
|
COLORS = [(int(c.red * 255), int(c.green * 255), int(c.blue * 255)) for c in COLORS]
|
|
CONSOLE_COLORS = [
|
|
17,
|
|
18,
|
|
19,
|
|
20,
|
|
21,
|
|
57,
|
|
93,
|
|
129,
|
|
165,
|
|
201,
|
|
200,
|
|
199,
|
|
198,
|
|
197,
|
|
196,
|
|
202,
|
|
208,
|
|
214,
|
|
220,
|
|
]
|
|
|
|
|
|
def map_value(x_value, in_min, in_max, out_min, out_max):
|
|
"""Maps value of the temperature to color"""
|
|
return (x_value - in_min) * (out_max - out_min) / (in_max - in_min) + out_min
|
|
|
|
|
|
def print_there(console_x, console_y, text, color):
|
|
""" Outputs a colored text to console at coordinates """
|
|
sys.stdout.write("\x1b7\x1b[48;5;%dm" % (color))
|
|
sys.stdout.write("\x1b7\x1b[%d;%df%s\x1b8" % (console_x, console_y, text))
|
|
|
|
|
|
# let the sensor initialize
|
|
time.sleep(0.1)
|
|
|
|
COLOR_RANGE = 1
|
|
while True:
|
|
|
|
# read the pixels
|
|
PIXELS = []
|
|
for row in SENSOR.pixels:
|
|
PIXELS = PIXELS + row
|
|
PIXELS = [map_value(p, MINTEMP, MAXTEMP, 0, COLORDEPTH - 1) for p in PIXELS]
|
|
|
|
# perform interpolation
|
|
BICUBIC = griddata(POINTS, PIXELS, (GRID_X, GRID_Y), method="cubic")
|
|
|
|
MAXPIXEL = 0
|
|
MINPIXEL = 0
|
|
|
|
# draw everything
|
|
Y_CONSOLE = 2
|
|
for ix, row in enumerate(BICUBIC):
|
|
x_console = 2
|
|
for jx, pixel in enumerate(row):
|
|
color_index = 0
|
|
if COLOR_RANGE != 0:
|
|
color_index = int(round((pixel - MINPIXEL) / COLOR_RANGE))
|
|
if color_index < 0:
|
|
color_index = 0
|
|
if color_index > len(CONSOLE_COLORS) - 1:
|
|
color_index = len(CONSOLE_COLORS) - 1
|
|
print_there(x_console, Y_CONSOLE * 2 - 2, " ", CONSOLE_COLORS[color_index])
|
|
if pixel > MAXPIXEL:
|
|
MAXPIXEL = pixel
|
|
if pixel < MINPIXEL:
|
|
MINPIXEL = pixel
|
|
x_console += 1
|
|
Y_CONSOLE += 1
|
|
sys.stdout.flush()
|
|
HEAT_RANGE = MAXPIXEL - MINPIXEL
|
|
COLOR_RANGE = HEAT_RANGE / len(CONSOLE_COLORS)
|