2021-5-13 09:25:14 [显示全部楼层]
3655浏览
查看: 3655|回复: 12

[项目] Arduino制作简易热成像装置

[复制链接]
【项目源起】
    学校化学老师要参加省优质课比赛,其中设计了一个化学实验演示环节,其目的是让学生感受到化学反应中能量的变化和分布情况。于是他想请我帮忙设计一个热成像装置,能够以图形化的方式展示化学反应中能量的变化和分布情况,让能量可视化。于是就有了下面这个作品……
01.jpg
【项目展示】
热成像装置具有两种显示模式:图形化显示模式(如图2)和数字矩阵显示模式(如图3)。
02.jpg
03.jpg
【功能简介】
(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 的刷新率,是做热成像时不错的选择。
04.jpg
另外显示端我们使用的是1.44’TFT_LCD,总体来说这款显示屏,满足了基本的图形化显示需求,但从显示的分别率来说有些低,热成像显示时像素的颗粒感比较重。
05.jpg
06.jpg


【制作过程】1
1.结构设计
我们将本次作品结构的外形结构设计为一个相机(来自雷宇社区,我修改了部分结构,懒!),使用雷宇激光的LaserMaker绘制结构图。整个结构我们将其分为三个部分:镜头部分、机身部分和机身前后盖板。镜头部分用于放置AMG8833热成像模块,机身部分内置主控器和显示屏。
镜头部分:
08.png
机身部分
09.png
机身前后面板
10.png
3.电路连线
11.jpg
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.设备组装
第一步:安装镜头。
12.jpg
13.jpg
14.jpg
16.jpg
15.jpg
安装机身
17.jpg
18.jpg
19.jpg
20.jpg
21.jpg
22.jpg
23.jpg 24.jpg
25.jpg
26.jpg
27.jpg

安装前后面板
28.jpg
29.jpg
30.jpg
31.jpg
32.jpg


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



16.jpg
32.jpg

怀若谷  中级技匠

发表于 2021-5-13 17:21:53

赞!!!
回复

使用道具 举报

安卓机器人  中级技神

发表于 2021-5-14 10:21:38

能量可视化---想法棒
做出成品--更牛啊
回复

使用道具 举报

 中级技师

发表于 2021-5-14 17:56:31

外形设计得很好,没有裸露出那些电线
回复

使用道具 举报

hnyzcj  版主
 楼主|

发表于 2021-5-14 17:59:39

诩 发表于 2021-5-14 17:56
外形设计得很好,没有裸露出那些电线

后续还要改造
回复

使用道具 举报

 中级技师

发表于 2021-5-14 18:05:53


嗯嗯      
回复

使用道具 举报

修远  见习技师

发表于 2021-5-14 23:21:15

太强了吧
回复

使用道具 举报

蓝色小星星  见习技师 来自手机

发表于 2021-5-21 07:57:46

hnyzcj 发表于 2021-5-13 09:25
【项目源起】    学校化学老师要参加省优质课比赛,其中设计了一个化学实验演示环节,其目的是让学生感受到 ...

电池内置就更好啦,结构件开源的话大家一起修改一下
回复

使用道具 举报

TuTu  中级技师

发表于 2021-5-27 14:13:12

回复

使用道具 举报

刘思宇hhhhhhhhh  学徒

发表于 2021-5-29 10:47:42

不粗不错,有点意思
回复

使用道具 举报

gyc13597926778  学徒

发表于 2021-6-19 06:52:18

狠人
回复

使用道具 举报

蒋桐  学徒

发表于 2021-6-29 20:01:01


外形设计得很好,没有裸露出那些电线,真的牛逼
回复

使用道具 举报

佛系唐法官  中级技师

发表于 2021-8-6 19:26:53

这个是真的秀
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2021 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail