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

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

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

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

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

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

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是将温度转化为不同颜色来显示。

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

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


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));
    }
  }

双线性插值伪彩处理

  接下来让我们看看效果

嘉立创PCB

还没有评论,抢个沙发!