前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【毕业设计】单片机红外热成像仪 - 嵌入式 stm32 树莓派

【毕业设计】单片机红外热成像仪 - 嵌入式 stm32 树莓派

作者头像
囍楽云
发布2022-12-29 13:02:01
4850
发布2022-12-29 13:02:01
举报
文章被收录于专栏:囍楽云博客

2 项目简介

红外热成像仪听起来是不是很酷、很高大尚? 它们可以清晰的显示出电路,发动机,管道,房屋隔热中的热量,可以用于消防红外热成像,医学,法医,环境科学,搜索和救援,能量监测红外热成像,化学反应,检测野生生物,检测侵入者中的热量。 它还能做什么? 在您的房子中找到最冷的地方? 微调超频游戏机中的冷却系统? 调查是否有人坐在您的躺椅上? 但是不幸的是这个相机的价格一直使它离我们遥不可及……直到现在。

   红外热像仪突破性解决方案,使低分辨率热成像的成本大幅降低到大众能接受的程度。 它可以检测55度或110度视野内的32 x 24像素温度网格。 借助的一些额外功能,您可以将它变成自己的微型热像仪。

  3 主要器件 3.1 红外摄像头模块

  该传感器包含24x32的红外热传感器阵列。 连接到微控制器(或 Pi)后,它将通过I2C返回768个独立红外温度读数的数组。 就像那些很酷的热像仪一样,但是它紧凑而简单,易于集成。

  3.1.1 模块特性

  该块一款红外热像仪模块,32×24 像素,I2C 接口通信,兼容 3.3V/5V 电平,支持 Pi、

   等主控。

  我采用 远红外热传感器阵列,可精确检测特定区域和温度范围内的目标物体,

  尺寸小巧,可方便集成到各种工业或智能控制应用中。

  3.1.2相关参数 3.1.2 应用场景 3.1.3 接口说明(以接入 MCU 为例): 4 实现效果 4.1 STM32+LCD 图像显示

  4.2 +ESP32+LCD 图像显示

  4.3 树莓派 HDMI 显示屏显示

  5 部分相关驱动代码

   #include

代码语言:javascript
复制
    #include "Adafruit_Arcada.h"
    Adafruit_MLX90640 mlx;
    Adafruit_Arcada arcada;
    #if !defined(USE_TINYUSB)
      #warning "Compile with TinyUSB selected!"
    #endif
    File myFile;
    float mlx90640To[768];   // Here we receive the float vals acquired from MLX90640
    #define DE_BOUNCE 200
      // Wait this many msec between button clicks
    #define MENU_LEN 12
      // Number of total available menu choices
    #define MENU_ROWS 9
      // Number of menu lines that can fit on screen
    #define MENU_VPOS 6
    #define GRAY_33 0x528A
    #define BOTTOM_DIR "MLX90640"
    #define DIR_FORMAT "/dird"
    #define BMP_FORMAT "/frmd.bmp"
    #define CFG_FLNAME "/config.ini"
    #define MAX_SERIAL 999
    // BMP File Header, little end first, Photoshop ver.
    const PROGMEM uint8_t BmpPSPHead[14] = {
     0x42, 0x4D,             // "BM" in hex
     0x38, 0x09, 0x00, 0x00, // File size, 2360
     0x00, 0x00,             // reserved for app data 1
     0x00, 0x00,             // reserved for app data 2
     0x36, 0x00, 0x00, 0x00  // Offset of first pixel, 54
    };
    // BMP 24-bit DIB Header, little end first, Photoshop ver.
    const PROGMEM uint8_t DIBHeadPSP1[40] = {
     0x28, 0x00, 0x00, 0x00,  // Header size, 40
     0x20, 0x00, 0x00, 0x00,  // pixel width, 32
     0x18, 0x00, 0x00, 0x00,  // pixel height, 24
     0x01, 0x00,              // color planes, 1
     0x18, 0x00,              // bits per pixel, 24
     0x00, 0x00, 0x00, 0x00,  // Compression method, 0==none
     0x00, 0x00, 0x00, 0x00,  // Raw bitmap data size, dummy 0
     0x12, 0x0B, 0x00, 0x00,  // Pixels per meter H, 2834
     0x12, 0x0B, 0x00, 0x00,  // Pixels per meter V, 2834
     0x00, 0x00, 0x00, 0x00,  // Colors in palette, 0==default 2^n
     0x00, 0x00, 0x00, 0x00   // Number of important colors, 0
    };
    // BMP file data, 2 byte padding
    const PROGMEM uint8_t PSPpad[2] = {0x00, 0x00};
    //Byte arrays of bitmapped icons, 16 x 12 px:
    const PROGMEM uint8_t battIcon[] = {
    0x0f, 0x00, 0x3f, 0xc0, 0x20, 0x40, 0x20, 0x40, 0x20, 0x40, 0x20, 0x40, 
    0x20, 0x40, 0x20, 0x40, 0x20, 0x40, 0x20, 0x40, 0x20, 0x40, 0x3f, 0xc0};
    const PROGMEM uint8_t camIcon[] = {
    0x01, 0xe0, 0x61, 0x20, 0xff, 0xf0, 0x80, 0x10, 0x86, 0x10, 0x89, 0x10, 
    0x90, 0x90, 0x90, 0x90, 0x89, 0x10, 0x86, 0x10, 0x80, 0x10, 0xff, 0xf0};
    const PROGMEM uint8_t SDicon[] = {
    0x0f, 0xe0, 0x1f, 0xe0, 0x3c, 0x60, 0x78, 0x60, 0x70, 0x60, 0x60, 0x60, 
    0x60, 0x60, 0x60, 0x60, 0x6f, 0x60, 0x60, 0x60, 0x7f, 0xe0, 0x7f, 0xe0};
    const PROGMEM uint8_t snowIcon[] = {
    0x15, 0x00, 0x4E, 0x40, 0xC4, 0x60, 0x75, 0xC0, 0x9F, 0x20, 0x0E, 0x00,
    0x0E, 0x00, 0x9F, 0x20, 0x75, 0xC0, 0xC4, 0x60, 0x4E, 0x40, 0x15, 0x00};
    uint8_t pixelArray[2304];   // BMP image body, 32 pixels * 24 rows * 3 bytes
    // Some global values that several functions will use, including
    // 5 floats to append to the BMP pixel data:
    // coldest pixel, coldest color, center temp, hottest color, hottest pixel
    float sneakFloats[5] = {3.1415926, 0.0, -11.7, 98.6, -12.34};      // Test values that get overwritten
    uint16_t highAddr = 0, lowAddr = 0;                                // Append the pixel addresses, too
    uint16_t backColor, lowPixel, highPixel, buttonRfunc = 1,
             emissivity = 95, frameRate = 4,
             thermRange = 0, paletteNum = 1, colorPal[256],            // Array for color palettes
             nextDirIndex = 0, nextBMPindex = 0, nextBMPsequence = 1;  // These keep count of SD files and dirs, 0==error
    uint32_t deBounce = 0, buttonBits = 0;
    boolean mirrorFlag = false, celsiusFlag = false, markersOn = true,
            screenDim = false, smoothing = false, showLastCap = false,
            save1frame = false, recordingInProg = false, buttonActive = false;
    float battAverage = 0.0, colorLow = 0.0, colorHigh = 100.0;        // Values for managing color range
    volatile boolean clickFlagMenu = false, clickFlagSelect = false;   // Volatiles for timer callback handling
    setup()函数首先执行,每次启动仅执行一次。 它的工作是初始化系统,从Arcada代码及其将控制的板载硬件开始,例如屏幕和按钮等。
    然后一组测试确定闪存是否准备好接收新的BMP文件。
    void setup()
    {
      if (!arcada.arcadaBegin()) {    // Start TFT and fill with black
        // Serial.print("Failed to begin");
        while (1);
      }
      arcada.filesysBeginMSD();       // Set up SD or QSPI flash as an external USB drive
      arcada.displayBegin();              // Activate TFT screen
      arcada.display->setRotation(1);     // wide orientation
      arcada.display->setTextWrap(false);
      arcada.setBacklight(255);           // Turn on backlight
      battAverage = arcada.readBatterySensor();
      Serial.begin(115200);
    //  while(!Serial); // Wait for user to open terminal
      Serial.println("MLX90640 IR Array Example");
      if(arcada.filesysBegin()){              // Initialize flash storage, begin setting up indices for saving BMPs
        if(!arcada.exists(BOTTOM_DIR)) {      // Is base "MLX90640" directory absent?
          if(arcada.mkdir(BOTTOM_DIR))        // Can it be added?
            nextDirIndex = nextBMPindex = 1;  // Success, prepare to store numbered files & dirs
        } else {      // "MLX90640" directory exists, can we add files | directories?
          // Get the number of the next unused serial directory path
          nextDirIndex = availableFileNumber(1, BOTTOM_DIR + String(DIR_FORMAT));
          // and the next unused serial BMP name
          nextBMPindex = availableFileNumber(1, BOTTOM_DIR + String(BMP_FORMAT));
        }
      }  // By now each global index variable is either 0 (no nums available), or the next unclaimed serial num

本文共 525 个字数,平均阅读时长 ≈ 2分钟

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档