• 正文
  • 相关推荐
申请入驻 产业图谱

两百元不到的热成像装置?DIY热成像的绝佳方案!

04/21 09:25
3437
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

之前一直有一个想法想做一个热成像仪,正好最近有一个项目需要用到热成像,于是在琢磨如何制作使用一款具有无线功能的热成像装置。

1、器件选型

由于需要涉及无线传输,还要求使用WIFI,那么主控就是优先考虑ESP32作为主控。

但是关于热成像传感器的选择就需要我头疼了,如何在保证开发效率以及成本的情况下选择合适的传感器。

最开始我选择的是MI0802这款热成像传感器:

它的分辨率达到80*62,比较满足我的要求。不过MI0802居然是不开源的。于是只能选择其他的传感器了。

后来看到了MLX90640,百元级别的价格能实现32*24像素的分辨率,就先买了一块模块来试试开发难度。

2、程序开发

Arduino IDE有MLX90640的库,因此开发起来很简单,只需要调用相应的库。

Adafruit_MLX90640?mlx;float?frame[32*24]; ? ? ? ? ?// 原始温度数据

创建90640的实例对象和帧缓存区

??// 读取热像仪数据??if(mlx.getFrame(frame) !=?0) {? ??//错误? ??return;? }

读取摄像头的原始数据

为了能够显示出来,这里使用一块240*240的TFTLCD来显示。

? tft.startWrite();??for(int?y=0; y<24; y++) {? ??for(int?x=0; x<32; x++) {? ? ??uint16_t?color =?tempToColor(frame[y*32?+ x]);? ? ? tft.fillRect(x*7, y*10,?7,?10, color);? ? }? }? tft.endWrite();

tempToColor是将温度转化为不同颜色来显示。

可以看到也是能成功的显示出来,不过由于分辨率问题,像素感太强,因此我对他进行双线性插值伪彩显示。

3、双线性插值伪彩显示

双线性插值的原理不做过多赘述,总体而言就是根据已知的像素对中间的区域进行估计。

for(int?screenY =?0; screenY <?240; screenY++) {? ??// 计算对应的原始数据行(保留右侧16像素显示信息)? ??for(int?screenX =?0; screenX <?224; screenX++) {?? ? ??// 将屏幕坐标映射到原始数据坐标(32x24 → 224x240)? ? ??float?srcX = (screenX *?31.0) /?223.0; ?// 0-31? ? ??float?srcY = (screenY *?23.0) /?239.0; ??// 0-23
? ? ??// 确定四个相邻采样点? ? ??int?x0 =?floor(srcX);? ? ??int?y0 =?floor(srcY);? ? ??int?x1 =?min(x0 +?1,?31);? ? ??int?y1 =?min(y0 +?1,?23);? ? ??? ? ??// 计算插值权重? ? ??float?xWeight = srcX - x0;? ? ??float?yWeight = srcY - y0;
? ? ??// 获取四个点的温度值? ? ??float?temp00 = frame[y0*32?+ x0];? ? ??float?temp01 = frame[y0*32?+ x1];? ? ??float?temp10 = frame[y1*32?+ x0];? ? ??float?temp11 = frame[y1*32?+ x1];
? ? ??// 双线性插值计算? ? ??float?temp =?? ? ? ? temp00 * (1?- xWeight) * (1?- yWeight) +? ? ? ? temp01 * xWeight * (1?- yWeight) +? ? ? ? temp10 * (1?- xWeight) * yWeight +? ? ? ? temp11 * xWeight * yWeight;
? ? ??// 绘制像素? ? ? tft.drawPixel(screenX, screenY,?tempToColor(temp));? ? }? }

双线性插值伪彩处理

接下来让我们看看效果

4、后续安排

后面应该会对这个项目继续更近,打算将其制作成PCB,总成本大概不到200元并且设计相应的手机APP,期待以后的文章吧!

相关推荐