Arduino制作简易热成像装置

2021-05-133.6万
精华项目
AI 快速预览详细 收起
本文介绍了如何使用Arduino和AMG8833热成像模块制作一个简易热成像装置。该项目旨在帮助化学老师在课堂上演示化学反应中的能量变化。硬件材料包括DFRduino uno R3-EDU、AMG8833热成像模块和1.44’TFT_LCD显示屏。通过详细的结构设计、电路连线和代码编写步骤,用户可以轻松完成这个项目。最终效果是能够以图形化或数字矩阵的方式显示热能分布。
【项目源起】
    学校化学老师要参加省优质课比赛,其中设计了一个化学实验演示环节,其目的是让学生感受到化学反应中能量的变化和分布情况。于是他想请我帮忙设计一个热成像装置,能够以图形化的方式展示化学反应中能量的变化和分布情况,让能量可视化。于是就有了下面这个作品……
Arduino制作简易热成像装置图1
【项目展示】
热成像装置具有两种显示模式:图形化显示模式(如图2)和数字矩阵显示模式(如图3)。
Arduino制作简易热成像装置图4
Arduino制作简易热成像装置图2
【功能简介】
(1)感测温度:通过非接触探测红外能量,并将其转换为电信号,进而将数据传到显示屏幕上。
(2)热能成像:将接收到的能量数据,以8*8像素色块的形式显示出来。
(3)模式切换:该系统有两种显示模式:分别为数字矩阵模式和图像模式,可以在两种模式之间进行切换。
【硬件材料】
我在网上查阅了很多有关 DIY的热成像装置,其中最经典的一项就是使用Arduino ESP32+AMG8833热成像模块制作的,具体地址如下所示http://ck.mfcad.com/diy/s157.html。在此次制作中,我们使用的硬件设备与上述地址中的有所不同,具体清单如下表1所示。
序号
名称
数量
1
DFRduino uno R3-EDU
1
2
模拟角度传感器
1
3
AMG8833热成像模块
1
4
1.44’TFT_LCD(ST7735)
1
5
模拟角度传感器
1
6
杜邦线
1
7
7.4V锂电池及充电器

表1项目器材清单
其中AMG8833热成像模块具备分别率为 8X8,同时支持 arduino 或者树莓派,I2C 接口,供电为 3-5 伏,紧凑,尺寸小,容易集成。传感器可以测量的温度范围是 0-80 摄氏度,准确度为 2.5 摄氏度,可以从 7 米外到测到一个人,10hz 的刷新率,是做热成像时不错的选择。
Arduino制作简易热成像装置图3
另外显示端我们使用的是1.44’TFT_LCD,总体来说这款显示屏,满足了基本的图形化显示需求,但从显示的分别率来说有些低,热成像显示时像素的颗粒感比较重。
Arduino制作简易热成像装置图5
Arduino制作简易热成像装置图6


【制作过程】1
1.结构设计
我们将本次作品结构的外形结构设计为一个相机(来自雷宇社区,我修改了部分结构,懒!),使用雷宇激光的LaserMaker绘制结构图。整个结构我们将其分为三个部分:镜头部分、机身部分和机身前后盖板。镜头部分用于放置AMG8833热成像模块,机身部分内置主控器和显示屏。
镜头部分:
Arduino制作简易热成像装置图9
机身部分
Arduino制作简易热成像装置图8
机身前后面板
Arduino制作简易热成像装置图7
3.电路连线
Arduino制作简易热成像装置图10
4代码编写
  1. #include <Adafruit_GFX.h>    // Core graphics library
  2. #include <Adafruit_ILI9341.h>
  3. #include <SPI.h>
  4. #include <Wire.h>
  5. #include <Adafruit_AMG88xx.h>
  6. #ifdef ESP8266
  7.    #define STMPE_CS 16
  8.    #define TFT_CS   0
  9.    #define TFT_DC   15
  10.    #define SD_CS    2
  11. #endif
  12. #ifdef ESP32
  13.    #define STMPE_CS 32
  14.    #define TFT_CS   15
  15.    #define TFT_DC   33
  16.    #define SD_CS    14
  17. #endif
  18. #if defined(__AVR__) || defined(ARDUINO_ARCH_SAMD) || defined(ARDUINO_ARCH_SAM)
  19.    #define STMPE_CS 6
  20.    #define TFT_CS   9
  21.    #define TFT_DC   10
  22.    #define SD_CS    5
  23. #endif
  24. #ifdef TEENSYDUINO
  25.    #define TFT_DC   10
  26.    #define TFT_CS   4
  27.    #define STMPE_CS 3
  28.    #define SD_CS    8
  29. #endif
  30. #ifdef ARDUINO_STM32_FEATHER
  31.    #define TFT_DC   PB4
  32.    #define TFT_CS   PA15
  33.    #define STMPE_CS PC7
  34.    #define SD_CS    PC5
  35. #endif
  36. #ifdef ARDUINO_FEATHER52
  37.    #define STMPE_CS 30
  38.    #define TFT_CS   13
  39.    #define TFT_DC   11
  40.    #define SD_CS    27
  41. #endif
  42. //Comment this out to remove the text overlay
  43. #define SHOW_TEMP_TEXT
  44. //low range of the sensor (this will be blue on the screen)
  45. #define MINTEMP 20
  46. //high range of the sensor (this will be red on the screen)
  47. #define MAXTEMP 28
  48. //the colors we will be using
  49. const uint16_t camColors[] = {0x480F,
  50. 0x400F,0x400F,0x400F,0x4010,0x3810,0x3810,0x3810,0x3810,0x3010,0x3010,
  51. 0x3010,0x2810,0x2810,0x2810,0x2810,0x2010,0x2010,0x2010,0x1810,0x1810,
  52. 0x1811,0x1811,0x1011,0x1011,0x1011,0x0811,0x0811,0x0811,0x0011,0x0011,
  53. 0x0011,0x0011,0x0011,0x0031,0x0031,0x0051,0x0072,0x0072,0x0092,0x00B2,
  54. 0x00B2,0x00D2,0x00F2,0x00F2,0x0112,0x0132,0x0152,0x0152,0x0172,0x0192,
  55. 0x0192,0x01B2,0x01D2,0x01F3,0x01F3,0x0213,0x0233,0x0253,0x0253,0x0273,
  56. 0x0293,0x02B3,0x02D3,0x02D3,0x02F3,0x0313,0x0333,0x0333,0x0353,0x0373,
  57. 0x0394,0x03B4,0x03D4,0x03D4,0x03F4,0x0414,0x0434,0x0454,0x0474,0x0474,
  58. 0x0494,0x04B4,0x04D4,0x04F4,0x0514,0x0534,0x0534,0x0554,0x0554,0x0574,
  59. 0x0574,0x0573,0x0573,0x0573,0x0572,0x0572,0x0572,0x0571,0x0591,0x0591,
  60. 0x0590,0x0590,0x058F,0x058F,0x058F,0x058E,0x05AE,0x05AE,0x05AD,0x05AD,
  61. 0x05AD,0x05AC,0x05AC,0x05AB,0x05CB,0x05CB,0x05CA,0x05CA,0x05CA,0x05C9,
  62. 0x05C9,0x05C8,0x05E8,0x05E8,0x05E7,0x05E7,0x05E6,0x05E6,0x05E6,0x05E5,
  63. 0x05E5,0x0604,0x0604,0x0604,0x0603,0x0603,0x0602,0x0602,0x0601,0x0621,
  64. 0x0621,0x0620,0x0620,0x0620,0x0620,0x0E20,0x0E20,0x0E40,0x1640,0x1640,
  65. 0x1E40,0x1E40,0x2640,0x2640,0x2E40,0x2E60,0x3660,0x3660,0x3E60,0x3E60,
  66. 0x3E60,0x4660,0x4660,0x4E60,0x4E80,0x5680,0x5680,0x5E80,0x5E80,0x6680,
  67. 0x6680,0x6E80,0x6EA0,0x76A0,0x76A0,0x7EA0,0x7EA0,0x86A0,0x86A0,0x8EA0,
  68. 0x8EC0,0x96C0,0x96C0,0x9EC0,0x9EC0,0xA6C0,0xAEC0,0xAEC0,0xB6E0,0xB6E0,
  69. 0xBEE0,0xBEE0,0xC6E0,0xC6E0,0xCEE0,0xCEE0,0xD6E0,0xD700,0xDF00,0xDEE0,
  70. 0xDEC0,0xDEA0,0xDE80,0xDE80,0xE660,0xE640,0xE620,0xE600,0xE5E0,0xE5C0,
  71. 0xE5A0,0xE580,0xE560,0xE540,0xE520,0xE500,0xE4E0,0xE4C0,0xE4A0,0xE480,
  72. 0xE460,0xEC40,0xEC20,0xEC00,0xEBE0,0xEBC0,0xEBA0,0xEB80,0xEB60,0xEB40,
  73. 0xEB20,0xEB00,0xEAE0,0xEAC0,0xEAA0,0xEA80,0xEA60,0xEA40,0xF220,0xF200,
  74. 0xF1E0,0xF1C0,0xF1A0,0xF180,0xF160,0xF140,0xF100,0xF0E0,0xF0C0,0xF0A0,
  75. 0xF080,0xF060,0xF040,0xF020,0xF800,};
  76. Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
  77. Adafruit_AMG88xx amg;
  78. unsigned long delayTime;
  79. float pixels[AMG88xx_PIXEL_ARRAY_SIZE];
  80. uint16_t displayPixelWidth, displayPixelHeight;
  81. void setup() {
  82.   delay(500);
  83.   Serial.begin(9600);
  84.     Serial.println(F("AMG88xx thermal camera!"));
  85.     tft.begin();
  86.     tft.fillScreen(ILI9341_BLACK);
  87.     displayPixelWidth = tft.width() / 8;
  88.     displayPixelHeight = tft.width() / 8; //Keep pixels square
  89.     tft.setRotation(0);
  90.    
  91.     bool status;
  92.    
  93.     // default settings
  94.     status = amg.begin();
  95.     if (!status) {
  96.         Serial.println("Could not find a valid AMG88xx sensor, check wiring!");
  97.         while (1);
  98.     }
  99.    
  100.     Serial.println("-- Thermal Camera Test --");
  101.     delay(100); // let sensor boot up
  102. }
  103. void loop() {
  104.   //read all the pixels
  105.   amg.readPixels(pixels);
  106.   
  107.   for(int i=0; i<AMG88xx_PIXEL_ARRAY_SIZE; i++){
  108.     int colorTemp;
  109.     if(pixels[i] >= MAXTEMP) colorTemp = MAXTEMP;
  110.     else if(pixels[i] <= MINTEMP) colorTemp = MINTEMP;
  111.     else colorTemp = pixels[i];
  112.    
  113.     uint8_t colorIndex = map(colorTemp, MINTEMP, MAXTEMP, 0, 255);
  114.    
  115.     colorIndex = constrain(colorIndex, 0, 255);
  116.     //draw the pixels!
  117.     tft.fillRect(displayPixelHeight * floor(i / 8), 40 + displayPixelWidth * ((AMG88xx_PIXEL_ARRAY_SIZE - i - 1) % 8),
  118.         displayPixelHeight, displayPixelWidth, camColors[colorIndex]);
  119.         
  120.     #ifdef SHOW_TEMP_TEXT
  121.       tft.setCursor( displayPixelHeight * floor(i / 8) + displayPixelHeight/2 - 12,
  122.                      40 + displayPixelWidth * ((AMG88xx_PIXEL_ARRAY_SIZE - i - 1) % 8) + displayPixelHeight/2 - 4);
  123.       tft.setTextColor(ILI9341_WHITE);  tft.setTextSize(1);
  124.       tft.print(pixels[i],1);
  125.     #endif
  126.    
  127.   }
  128. }
复制代码

  1. <blockquote>
复制代码
5.设备组装
第一步:安装镜头。
Arduino制作简易热成像装置图12
Arduino制作简易热成像装置图11
Arduino制作简易热成像装置图13
Arduino制作简易热成像装置图14
Arduino制作简易热成像装置图15
安装机身
Arduino制作简易热成像装置图17
Arduino制作简易热成像装置图18
Arduino制作简易热成像装置图16
Arduino制作简易热成像装置图20
Arduino制作简易热成像装置图19
Arduino制作简易热成像装置图21
Arduino制作简易热成像装置图22Arduino制作简易热成像装置图25
Arduino制作简易热成像装置图23
Arduino制作简易热成像装置图24
Arduino制作简易热成像装置图26

安装前后面板
Arduino制作简易热成像装置图30
Arduino制作简易热成像装置图27
Arduino制作简易热成像装置图29
Arduino制作简易热成像装置图28
Arduino制作简易热成像装置图31


6.系统测试
Arduino制作简易热成像装置图32
Arduino制作简易热成像装置图33
7.改进与提升
本次制作过程中,为了节省制作周期,结构件是从网上找的模型,并对其进行修改。但还是忘记了电池仓,以至于供电外置。另外由于电子件后续需要复用,所以没有对电子件电路连接进行合理的优化设计,而只是简单的连接,使得显示屏的结构设计时。



16.jpg (90.84 KB, 下载次数: 9923)

STEM教育 · Arduino制作简易热成像装置_image_3.webp

32.jpg (118.36 KB, 下载次数: 9953)

STEM教育 · Arduino制作简易热成像装置_image_6.webp

创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(15)
哈独户
哈独户
你好博主,我需要您的代码,可以购买,能加个联系方式吗QQ 2781538238
陈子涵
陈子涵

www12
www12
可以的呀 怎么联系
hnyzcj
hnyzcj
作者
回复www12
qq:519911704
www12
www12
您好我想问一下这个矩阵和图像怎么切换呀
hnyzcj
hnyzcj
作者
回复www12
代码收费,不好意思。
www12
www12回复hnyzcj
您好这个设计有没有代码可以提供一下,十分感谢!!
共3条回复,已加载2条,点击查看更多共3条回复,已加载全部
mrj007
mrj007
开机运行时花屏是什么原因呀
hnyzcj
hnyzcj
作者
回复mrj007
花了以后还能恢复吗
mrj007
mrj007回复hnyzcj
真的花了不知道什么原因
共3条回复,已加载2条,点击查看更多共3条回复,已加载全部
佛系唐法官
佛系唐法官
这个是真的秀
蒋桐
蒋桐

外形设计得很好,没有裸露出那些电线,真的牛逼
gyc13597926778
gyc13597926778
狠人
CoderCoder
CoderCoder
不粗不错,有点意思
TuTu
TuTu
评论内容
纳米物语
纳米物语
电池内置就更好啦,结构件开源的话大家一起修改一下
修远
修远
太强了吧
诩
外形设计得很好,没有裸露出那些电线
哈独户
哈独户回复hnyzcj
我需要您的代码可以加个联系方式吗
诩
回复hnyzcj
嗯嗯
共3条回复,已加载2条,点击查看更多共3条回复,已加载全部
许培享
许培享
能量可视化---想法棒
做出成品--更牛啊
怀若谷
怀若谷
赞!!!
- 没有更多了 -