3353| 3
|
[求助问答] amg8833热成像仪 |
#include <Adafruit_GFX.h> #include <Adafruit_ST7735.h> #include <SPI.h> #include <Wire.h> #include <Adafruit_AMG88xx.h> #include <avr/pgmspace.h> //tft显示屏的引脚 #define TFT_CS 10 #define TFT_RST 9 #define TFT_DC 8 //温度,对应颜色 #define MINTEMP 40 #define MAXTEMP 25 //256种颜色 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,}; //创建tft显示对象 Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST); //创建AMG对象 Adafruit_AMG88xx amg; float pixels[AMG88xx_PIXEL_ARRAY_SIZE]; //一维数组 用来存放amg返回的64个温度数据 uint16_t displayPixelWidth, displayPixelHeight; //tft显示屏的最小显示单元的长和宽 float arr [8][8]; //将64个温度数据放在8*8的二维数组中 float pixels2[85][85]; //插值后的85*85的二维数组 float *pixels3 = new float[7225]; //将插值后的85*85二维数组放回到一维数组中,共7225个温度点 void setup() { Serial.begin(9600); Serial.println(F("AMG88xx thermal camera!")); tft.initR(INITR_BLACKTAB); //我用的1.8寸的显示屏,所以初始化屏幕尺寸1.8寸 tft.fillScreen(ST7735_BLACK); //没有显示的区域都用黑色表示 //改变显示最小单元来填满整个屏幕 displayPixelWidth = 1.33*tft.width() / 85; displayPixelHeight = 1.064*tft.height() / 85; bool status; status = amg.begin(); if (!status) { Serial.println("Could not find a valid AMG88xx sensor, check wiring!"); while (1); } Serial.println("-- Thermal Camera Test --"); delay(50); //传感器间歇延时 } void loop() { //amg返回数据 amg.readPixels(pixels); int hang; int lie; int x=-1; //一维64变二维8*8 for(hang=0;hang<8;hang++) { for(lie=0;lie<8;lie++) { x=x+1; arr[hang][lie]=pixels[x]; } } int a=-1; float ku,kv; //插值计算 //每个数据点中间插入11个数据点 for(hang=0;hang<85;hang++) { if(hang==0) {a=a+1;} if(hang>2) { if(hang%12==1){a=a+1;} } if(hang%12==0){ku=0;} if(hang%12==1){ku=0.0833;} if(hang%12==2){ku=0.1666;} if(hang%12==3){ku=0.2500;} if(hang%12==4){ku=0.3333;} if(hang%12==5){ku=0.4166;} if(hang%12==6){ku=0.5000;} if(hang%12==7){ku=0.5833;} if(hang%12==8){ku=0.6666;} if(hang%12==9){ku=0.7500;} if(hang%12==10){ku=0.8333;} if(hang%12==11){ku=0.9166;} if(hang==12 || hang==24 || hang==36 || hang==48 || hang==60 || hang==72 || hang==84){ku=1;} int b=-1; for(lie=0;lie<85;lie++) { if(lie==0) {b=b+1;} if(lie>2) { if(lie%12==1){b=b+1;} } if(lie%12==0){kv=0;} if(lie%12==1){kv=0.0833;} if(lie%12==2){kv=0.1666;} if(lie%12==3){kv=0.2500;} if(lie%12==4){kv=0.3333;} if(lie%12==5){kv=0.4166;} if(lie%12==6){kv=0.5000;} if(lie%12==7){kv=0.5833;} if(lie%12==8){kv=0.6666;} if(lie%12==9){kv=0.7500;} if(lie%12==10){kv=0.8333;} if(lie%12==11){kv=0.9166;} if(lie==12 || lie==24 || lie==36 || lie==48 || lie==60 || lie==72 || lie==84){kv=1;} pixels2[hang][lie] = (1-ku)*(1-kv)*arr[a][b]+(1-ku)*kv*arr[a][b+1]+ku*(1-kv)*arr[a+1][b]+ku*kv*arr[a+1][b+1]; } } //二维85*85变一维7225 int y=-1; for (hang=0;hang<85;hang++) { for (lie=0;lie<85;lie++) { y=y+1; pixels3[y]=pixels2[hang][lie]; } } //显示tft for(int i=0; i<7225; i++) { float kk = 1; uint8_t colorIndex = map(pixels3[i], MINTEMP, MAXTEMP, 0, 255); colorIndex = constrain(colorIndex, 0, 255); //tft.fillRect(x1,y1,x2,y2,填充的内容) //这个函数一共五个量 //x1 y1是填充矩形左上开始点的坐标 //x2 y2是填充矩形右下结束点的坐标 //最后就是填充的颜色,我们这用温度对应了颜色 tft.fillRect(kk*displayPixelHeight * floor (i/85),kk*displayPixelWidth * (i%85),kk*displayPixelHeight, kk*displayPixelWidth, camColors[colorIndex]); } } |
6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666 |
#include <Adafruit_GFX.h> // Core graphics library #include <Adafruit_ILI9341.h> #include <SPI.h> #include <Wire.h> #include <Adafruit_AMG88xx.h> #ifdef ESP8266 #define STMPE_CS 16 #define TFT_CS 0 #define TFT_DC 15 #define SD_CS 2 #endif #ifdef ESP32 #define STMPE_CS 32 #define TFT_CS 15 #define TFT_DC 33 #define SD_CS 14 #endif #if defined(__AVR__) || defined(ARDUINO_ARCH_SAMD) || defined(ARDUINO_ARCH_SAM) #define STMPE_CS 6 #define TFT_CS 9 #define TFT_DC 10 #define SD_CS 5 #endif #ifdef TEENSYDUINO #define TFT_DC 10 #define TFT_CS 4 #define STMPE_CS 3 #define SD_CS 8 #endif #ifdef ARDUINO_STM32_FEATHER #define TFT_DC PB4 #define TFT_CS PA15 #define STMPE_CS PC7 #define SD_CS PC5 #endif #ifdef ARDUINO_FEATHER52 #define STMPE_CS 30 #define TFT_CS 13 #define TFT_DC 11 #define SD_CS 27 #endif //Comment this out to remove the text overlay #define SHOW_TEMP_TEXT //low range of the sensor (this will be blue on the screen) #define MINTEMP 20 //high range of the sensor (this will be red on the screen) #define MAXTEMP 28 //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,}; Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC); Adafruit_AMG88xx amg; unsigned long delayTime; float pixels[AMG88xx_PIXEL_ARRAY_SIZE]; uint16_t displayPixelWidth, displayPixelHeight; void setup() { delay(500); Serial.begin(9600); Serial.println(F("AMG88xx thermal camera!")); tft.begin(); tft.fillScreen(ILI9341_BLACK); displayPixelWidth = tft.width() / 8; displayPixelHeight = tft.width() / 8; //Keep pixels square tft.setRotation(0); bool status; // default settings status = amg.begin(); if (!status) { Serial.println("Could not find a valid AMG88xx sensor, check wiring!"); while (1); } Serial.println("-- Thermal Camera Test --"); delay(100); // let sensor boot up } void loop() { //read all the pixels amg.readPixels(pixels); for(int i=0; i<AMG88xx_PIXEL_ARRAY_SIZE; i++){ int colorTemp; if(pixels[i] >= MAXTEMP) colorTemp = MAXTEMP; else if(pixels[i] <= MINTEMP) colorTemp = MINTEMP; else colorTemp = pixels[i]; uint8_t colorIndex = map(colorTemp, MINTEMP, MAXTEMP, 0, 255); colorIndex = constrain(colorIndex, 0, 255); //draw the pixels! tft.fillRect(displayPixelHeight * floor(i / 8), 40 + displayPixelWidth * ((AMG88xx_PIXEL_ARRAY_SIZE - i - 1) % 8), displayPixelHeight, displayPixelWidth, camColors[colorIndex]); #ifdef SHOW_TEMP_TEXT tft.setCursor( displayPixelHeight * floor(i / 8) + displayPixelHeight/2 - 12, 40 + displayPixelWidth * ((AMG88xx_PIXEL_ARRAY_SIZE - i - 1) % 8) + displayPixelHeight/2 - 4); tft.setTextColor(ILI9341_WHITE); tft.setTextSize(1); tft.print(pixels[i],1); #endif } } |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed