Hi,
i´d like to build a mini thermal imager arround the panasonic amg8834 sensor. i have the basic code running and now i would like to implement some features. first thing is to bicubic interpolate the 8x8 grid to 64x64 for example. i have found some usefull information about interpolation here:
http://paulbourke.net/miscellaneous/interpolation/
i think i understand the math behind the interpolation, but i have no idea how to implement in my code and upscale the 8x8 array. please, i need some help.
regards, markus
i´d like to build a mini thermal imager arround the panasonic amg8834 sensor. i have the basic code running and now i would like to implement some features. first thing is to bicubic interpolate the 8x8 grid to 64x64 for example. i have found some usefull information about interpolation here:
http://paulbourke.net/miscellaneous/interpolation/
i think i understand the math behind the interpolation, but i have no idea how to implement in my code and upscale the 8x8 array. please, i need some help.
regards, markus
Code:
#include <SSD_13XX.h>
#include <Adafruit_GFX.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_AMG88xx.h>
#define __RST 8 )
#define __CS 10 )
#define __DC 9 )
SSD_13XX tft = SSD_13XX(__CS, __DC, __RST);
float MINTEMP, MAXTEMP;
float pixels[AMG88xx_PIXEL_ARRAY_SIZE];
byte displayPixelWidth = 8;
byte displayPixelHeight = 8;
Adafruit_AMG88xx amg;
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
//the colors we will be using
const uint16_t camColors[] = {0x480F,
0x400F, 0x400F, 0x400F, 0x4010, 0x3810, 0x3810, 0x3810, 0x3810, 0x3010, 0x3010,
0x3010, 0x2810, 0x2810, 0x2810, 0x2810, 0x2010, 0x2010, 0x2010, 0x1810, 0x1810,
0x1811, 0x1811, 0x1011, 0x1011, 0x1011, 0x0811, 0x0811, 0x0811, 0x0011, 0x0011,
0x0011, 0x0011, 0x0011, 0x0031, 0x0031, 0x0051, 0x0072, 0x0072, 0x0092, 0x00B2,
0x00B2, 0x00D2, 0x00F2, 0x00F2, 0x0112, 0x0132, 0x0152, 0x0152, 0x0172, 0x0192,
0x0192, 0x01B2, 0x01D2, 0x01F3, 0x01F3, 0x0213, 0x0233, 0x0253, 0x0253, 0x0273,
0x0293, 0x02B3, 0x02D3, 0x02D3, 0x02F3, 0x0313, 0x0333, 0x0333, 0x0353, 0x0373,
0x0394, 0x03B4, 0x03D4, 0x03D4, 0x03F4, 0x0414, 0x0434, 0x0454, 0x0474, 0x0474,
0x0494, 0x04B4, 0x04D4, 0x04F4, 0x0514, 0x0534, 0x0534, 0x0554, 0x0554, 0x0574,
0x0574, 0x0573, 0x0573, 0x0573, 0x0572, 0x0572, 0x0572, 0x0571, 0x0591, 0x0591,
0x0590, 0x0590, 0x058F, 0x058F, 0x058F, 0x058E, 0x05AE, 0x05AE, 0x05AD, 0x05AD,
0x05AD, 0x05AC, 0x05AC, 0x05AB, 0x05CB, 0x05CB, 0x05CA, 0x05CA, 0x05CA, 0x05C9,
0x05C9, 0x05C8, 0x05E8, 0x05E8, 0x05E7, 0x05E7, 0x05E6, 0x05E6, 0x05E6, 0x05E5,
0x05E5, 0x0604, 0x0604, 0x0604, 0x0603, 0x0603, 0x0602, 0x0602, 0x0601, 0x0621,
0x0621, 0x0620, 0x0620, 0x0620, 0x0620, 0x0E20, 0x0E20, 0x0E40, 0x1640, 0x1640,
0x1E40, 0x1E40, 0x2640, 0x2640, 0x2E40, 0x2E60, 0x3660, 0x3660, 0x3E60, 0x3E60,
0x3E60, 0x4660, 0x4660, 0x4E60, 0x4E80, 0x5680, 0x5680, 0x5E80, 0x5E80, 0x6680,
0x6680, 0x6E80, 0x6EA0, 0x76A0, 0x76A0, 0x7EA0, 0x7EA0, 0x86A0, 0x86A0, 0x8EA0,
0x8EC0, 0x96C0, 0x96C0, 0x9EC0, 0x9EC0, 0xA6C0, 0xAEC0, 0xAEC0, 0xB6E0, 0xB6E0,
0xBEE0, 0xBEE0, 0xC6E0, 0xC6E0, 0xCEE0, 0xCEE0, 0xD6E0, 0xD700, 0xDF00, 0xDEE0,
0xDEC0, 0xDEA0, 0xDE80, 0xDE80, 0xE660, 0xE640, 0xE620, 0xE600, 0xE5E0, 0xE5C0,
0xE5A0, 0xE580, 0xE560, 0xE540, 0xE520, 0xE500, 0xE4E0, 0xE4C0, 0xE4A0, 0xE480,
0xE460, 0xEC40, 0xEC20, 0xEC00, 0xEBE0, 0xEBC0, 0xEBA0, 0xEB80, 0xEB60, 0xEB40,
0xEB20, 0xEB00, 0xEAE0, 0xEAC0, 0xEAA0, 0xEA80, 0xEA60, 0xEA40, 0xF220, 0xF200,
0xF1E0, 0xF1C0, 0xF1A0, 0xF180, 0xF160, 0xF140, 0xF100, 0xF0E0, 0xF0C0, 0xF0A0,
0xF080, 0xF060, 0xF040, 0xF020, 0xF800,
};
void setup() {
tft.begin();
tft.setBrightness(15);
amg.begin();
Serial.begin(9600);
delay(100); // Time for Sensor startup
}
void loop() {
//read all the pixels
amg.readPixels(pixels);
//get min and max temp of pixeldata; get mintemp and maxtemp array possiton
float MAXTEMP = 0;
int max_i = 0;
float MINTEMP = 200;
int min_i = 0;
for ( int i = 0; i < sizeof(pixels) / sizeof(pixels[0]); i++ )
{
if ( pixels[i] > MAXTEMP )
{
MAXTEMP = pixels[i];
max_i = i;
}
if ( pixels[i] < MINTEMP )
{
MINTEMP = pixels[i];
min_i = i;
}
}
//map temp to color and pixel to the oled display
for (int i = 0; i < AMG88xx_PIXEL_ARRAY_SIZE; i++) {
uint8_t colorIndex = map(pixels[i], MINTEMP, MAXTEMP, 0, 255);
colorIndex = constrain(colorIndex, 0, 255);
//draw the pixels!
tft.fillRect(displayPixelHeight * floor(i / 8), displayPixelWidth * (i % 8),
displayPixelHeight, displayPixelWidth, camColors[colorIndex]);
// mark the hottest point at display
tft.fillCircle(displayPixelHeight * floor (max_i / 8), displayPixelWidth * (max_i % 8), 4, WHITE);
// mark the coldest point at display
// tft.fillCircle(displayPixelHeight * floor (min_i / 8), displayPixelWidth * (min_i % 8), 4, BLACK);
//print some text on display for min and max messured temp
tft.setTextColor(WHITE, BLACK);
tft.setTextScale(1);
tft.setCursor(65, 5 );
tft.print("min");
tft.setCursor(65, 15 );
tft.println(MINTEMP);
tft.setCursor(65, 25 );
tft.print("max");
tft.setCursor(65, 35 );
tft.println(MAXTEMP);
}
}