毕业设计 基于单片机的红外热视仪(源码+硬件+论文)

本文介绍了一个毕业设计项目——基于单片机的红外热视仪,该系统使用Arduino主控制器、红外传感器模块、温度检测模块和TFTLCD显示屏,能实时显示和报警高温。硬件和软件设计详尽,包括AMG8833红外传感器的数据采集、插值计算和图像显示。项目具有中等难度和创新性,适合毕业设计。
摘要由CSDN通过智能技术生成


0 前言

🔥
这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。

为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是

🚩 毕业设计 基于单片机的红外热视仪(源码+硬件+论文)

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:3分
  • 工作量:3分
  • 创新点:4分

🧿 项目分享:

https://gitee.com/sinonfin/sharing

在这里插入图片描述

实物演示效果

毕业设计 基于单片机的红外热视仪 - 嵌入式 物联网

课题介绍

红外热视仪可以实时监控目标的热量变化,它利用先进的光学技术和数字信号处理技术,将实时的热量变化数据转化成可视化的视频图像,从而更好地了解目标的热量状况。目前,非制冷红外热像仪的基本原理和理论已被广泛认可,并在多个领域取得了显著的成果,但是,在材料、噪音、系统、性能等方面,仍然存在着一些挑战。这就有待于大量的调查。随着技术的进步,非制冷红外成像系统已经取代了第一代成像系统,其结构更加紧凑,可靠性、分辨率以及探测灵敏度都有了显著的改善,而且成本也有所下降。焦平面阵列红外侦察系统被用于工业、医学、交通、公共安全、消防和海关,包括商业和住宅,以有效地获取和跟踪远距离和恶劣天气条件下的目标。红外热像技术是一种新型的综合技术,它是通过对各种目标的自然发射和发射的红外光的能量的差异来实现的,它对周围的条件有很好的适应性,而且不会受到烟雾和亮度等因素的影响。红外热像仪最初用于军用,目前已逐步从军用向民用发展,尤其是工业检测、安全监测、森林防火等方面;

1 主要功能

红外热图像测温系统主要由Arduino主控制器、红外传感器模块、温度检测模块、TFTLCD显示屏模块、蜂鸣器模块等组成,该系统的硬件设计框图如图1.1所示。系统采用AMG8833红外热成像模块采集8*8的温度矩阵,通过I2C通讯传回MCU,MCU经过插值计算、RGB编码等处理后再将热像图显示在TFTLCD屏上。系统还设置有高温报警功能,报警温度可以自主高低调节,当温度过高时会亮灯并伴随蜂鸣器报警。通过仿真及实物测试,验证了本文设计的红外测温系统能够实现实时非接触性温度测量

在这里插入图片描述

2 硬件设计

在这里插入图片描述

3 核心软件设计

该系统的软件实施过程:当程序启动时,将对整个系统进行初始化。具体内容有: Arduino单片机端口的初始化、AMG8833红外传感器初始化、 IIC接口的初始化。首先,是数据的采集,其中,以AMG8833为核心,实现了对红外线信号的采集;第二步是对各个传感器采集到的温度信息进行数据处理,并通过IIC接口对其进行传输至Arduino主控台,主控台根据64个像素的温度资料进行内插计算,若超过则发出警报,若没超过则持续进行红外线测温;最后是图像的显示,在 TFTLCD屏幕上,以像素点组成热像,如此循环往复

在这里插入图片描述

在一个程序中,经常会有对相同的部件进行多遍运算的情况,这样做会使程序变得很繁琐,而且会使程序变得混乱。要做到这一点,你可以把这个拷贝的程序写入一个子线路,然后被主要线路所调用。该算法不仅减少了程序的编写工作量,而且可以大幅度地减少程序的时间。在原来的主机控制程序中,在需要执行某项工作时,将其调用出来,然后在该工作结束后,将其返回主机控制程序。由此,可以简化程序的逻辑结构,节省程序内存。在此基础上,本次的设计采用了模块化的结构,其中包括了TFTLCD显示模块,AMG8833的红外传感器模块和DS18B20温度检测模块。

在这里插入图片描述

篇幅有限,不过多复述详细设计细节,详细的设计分享在论文中。。。

关键代码

	//用到的库

	//tft显示屏的引脚
	#define TFT_CS     10  
	#define TFT_RST    9                     
	#define TFT_DC     8
	
	
	//温度,对应颜色
	#define MINTEMP 40
	#define MAXTEMP 25
	
	//256种颜色
	const uint16_t camColors[] = {0x480F,
	0x400F,0x400F,0x400F,0x4010,0x3810,0x3810,0x3810,0x3810,0x3010,0x3010,
	0x3010,0x2810,0x2810,0x2810,0x2810,0x2010,0x2010,0x2010,0x1810,0x1810,
	0x1811,0x1811,0x1011,0x1011,0x1011,0x0811,0x0811,0x0811,0x0011,0x0011,
	0x0011,0x0011,0x0011,0x0031,0x0031,0x0051,0x0072,0x0072,0x0092,0x00B2,
	0x00B2,0x00D2,0x00F2,0x00F2,0x0112,0x0132,0x0152,0x0152,0x0172,0x0192,
	0x0192,0x01B2,0x01D2,0x01F3,0x01F3,0x0213,0x0233,0x0253,0x0253,0x0273,
	0x0293,0x02B3,0x02D3,0x02D3,0x02F3,0x0313,0x0333,0x0333,0x0353,0x0373,
	0x0394,0x03B4,0x03D4,0x03D4,0x03F4,0x0414,0x0434,0x0454,0x0474,0x0474,
	0x0494,0x04B4,0x04D4,0x04F4,0x0514,0x0534,0x0534,0x0554,0x0554,0x0574,
	0x0574,0x0573,0x0573,0x0573,0x0572,0x0572,0x0572,0x0571,0x0591,0x0591,
	0x0590,0x0590,0x058F,0x058F,0x058F,0x058E,0x05AE,0x05AE,0x05AD,0x05AD,
	0x05AD,0x05AC,0x05AC,0x05AB,0x05CB,0x05CB,0x05CA,0x05CA,0x05CA,0x05C9,
	0x05C9,0x05C8,0x05E8,0x05E8,0x05E7,0x05E7,0x05E6,0x05E6,0x05E6,0x05E5,
	0x05E5,0x0604,0x0604,0x0604,0x0603,0x0603,0x0602,0x0602,0x0601,0x0621,
	0x0621,0x0620,0x0620,0x0620,0x0620,0x0E20,0x0E20,0x0E40,0x1640,0x1640,
	0x1E40,0x1E40,0x2640,0x2640,0x2E40,0x2E60,0x3660,0x3660,0x3E60,0x3E60,
	0x3E60,0x4660,0x4660,0x4E60,0x4E80,0x5680,0x5680,0x5E80,0x5E80,0x6680,
	0x6680,0x6E80,0x6EA0,0x76A0,0x76A0,0x7EA0,0x7EA0,0x86A0,0x86A0,0x8EA0,
	0x8EC0,0x96C0,0x96C0,0x9EC0,0x9EC0,0xA6C0,0xAEC0,0xAEC0,0xB6E0,0xB6E0,
	0xBEE0,0xBEE0,0xC6E0,0xC6E0,0xCEE0,0xCEE0,0xD6E0,0xD700,0xDF00,0xDEE0,
	0xDEC0,0xDEA0,0xDE80,0xDE80,0xE660,0xE640,0xE620,0xE600,0xE5E0,0xE5C0,
	0xE5A0,0xE580,0xE560,0xE540,0xE520,0xE500,0xE4E0,0xE4C0,0xE4A0,0xE480,
	0xE460,0xEC40,0xEC20,0xEC00,0xEBE0,0xEBC0,0xEBA0,0xEB80,0xEB60,0xEB40,
	0xEB20,0xEB00,0xEAE0,0xEAC0,0xEAA0,0xEA80,0xEA60,0xEA40,0xF220,0xF200,
	0xF1E0,0xF1C0,0xF1A0,0xF180,0xF160,0xF140,0xF100,0xF0E0,0xF0C0,0xF0A0,
	0xF080,0xF060,0xF040,0xF020,0xF800,};
	
	//创建tft显示对象
	Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS,  TFT_DC, TFT_RST);
	
	//创建AMG对象
	Adafruit_AMG88xx amg;
	
	float pixels[AMG88xx_PIXEL_ARRAY_SIZE];   //一维数组 用来存放amg返回的64个温度数据
	
	uint16_t displayPixelWidth, displayPixelHeight; //tft显示屏的最小显示单元的长和宽
	
	float arr [8][8];                   //将64个温度数据放在8*8的二维数组中
	
	float pixels2[85][85];              //插值后的85*85的二维数组  
	
	float *pixels3 = new float[7225];   //将插值后的85*85二维数组放回到一维数组中,共7225个温度点  
	
	void setup() {
	  Serial.begin(9600);
	    Serial.println(F("AMG88xx thermal camera!"));
	    
	    tft.initR(INITR_BLACKTAB);  //我用的1.8寸的显示屏,所以初始化屏幕尺寸1.8寸
	    
	    tft.fillScreen(ST7735_BLACK); //没有显示的区域都用黑色表示
	
	    //改变显示最小单元来填满整个屏幕
	    displayPixelWidth  = 1.33*tft.width() / 85;   
	    displayPixelHeight = 1.064*tft.height() / 85;
	    
	    bool status;
	    status = amg.begin();
	    if (!status) {
	        Serial.println("Could not find a valid AMG88xx sensor, check wiring!");
	        while (1);
	    }
	    
	    Serial.println("-- Thermal Camera Test --");
	    delay(50); //传感器间歇延时
	
	}
	
	void loop() 
	{
	
	  //amg返回数据
	  amg.readPixels(pixels);
	  int hang;
	  int lie;
	  int x=-1;
	  
	  //一维64变二维8*8
	    for(hang=0;hang<8;hang++)
	    {
	        for(lie=0;lie<8;lie++)
	        {
	            x=x+1;
	            arr[hang][lie]=pixels[x];
	        }
	    }
	
	  int a=-1;
	  float ku,kv;
	
	  //插值计算
	  //每个数据点中间插入11个数据点
	  for(hang=0;hang<85;hang++)
	  {
	      if(hang==0) {a=a+1;}
	      if(hang>2)
	      {
	        if(hang%12==1){a=a+1;}  
	      } 
	
	      if(hang%12==0){ku=0;}
	      if(hang%12==1){ku=0.0833;}
	      if(hang%12==2){ku=0.1666;}
	      if(hang%12==3){ku=0.2500;}
	      if(hang%12==4){ku=0.3333;}
	      if(hang%12==5){ku=0.4166;}
	      if(hang%12==6){ku=0.5000;}
	      if(hang%12==7){ku=0.5833;}
	      if(hang%12==8){ku=0.6666;}
	      if(hang%12==9){ku=0.7500;}
	      if(hang%12==10){ku=0.8333;}
	      if(hang%12==11){ku=0.9166;}
	      if(hang==12 || hang==24 || hang==36 || hang==48 || hang==60 || hang==72 || hang==84){ku=1;}
	      
	     int  b=-1;
	
	      for(lie=0;lie<85;lie++)
	      {
	          if(lie==0) {b=b+1;}
	          
	          if(lie>2)
	          {
	            if(lie%12==1){b=b+1;}  
	          }
	
	          if(lie%12==0){kv=0;}
	          if(lie%12==1){kv=0.0833;}
	          if(lie%12==2){kv=0.1666;}
	          if(lie%12==3){kv=0.2500;}
	          if(lie%12==4){kv=0.3333;}
	          if(lie%12==5){kv=0.4166;}
	          if(lie%12==6){kv=0.5000;}
	          if(lie%12==7){kv=0.5833;}
	          if(lie%12==8){kv=0.6666;}
	          if(lie%12==9){kv=0.7500;}
	          if(lie%12==10){kv=0.8333;}
	          if(lie%12==11){kv=0.9166;}
	          if(lie==12 || lie==24 || lie==36 || lie==48 || lie==60 || lie==72 || lie==84){kv=1;}
	          
	
	          pixels2[hang][lie] = (1-ku)*(1-kv)*arr[a][b]+(1-ku)*kv*arr[a][b+1]+ku*(1-kv)*arr[a+1][b]+ku*kv*arr[a+1][b+1];
	      }
	  }
	
	   //二维85*85变一维7225
	    int y=-1;
	    for (hang=0;hang<85;hang++)
	    {
	        for (lie=0;lie<85;lie++)
	        {
	            y=y+1;
	             pixels3[y]=pixels2[hang][lie];
	        }
	    }
	
	  //显示tft
	  for(int i=0; i<7225; i++)
	  {
	    float kk = 1;
	    uint8_t colorIndex = map(pixels3[i], MINTEMP, MAXTEMP, 0, 255);
	    colorIndex = constrain(colorIndex, 0, 255);
	
	    //tft.fillRect(x1,y1,x2,y2,填充的内容) 
	    //这个函数一共五个量
	    //x1 y1是填充矩形左上开始点的坐标
	    //x2 y2是填充矩形右下结束点的坐标
	    //最后就是填充的颜色,我们这用温度对应了颜色
	    tft.fillRect(kk*displayPixelHeight * floor (i/85),kk*displayPixelWidth * (i%85),kk*displayPixelHeight, kk*displayPixelWidth, camColors[colorIndex]);
	  
	  }
	}

4 实现效果

在这里插入图片描述

实物演示效果

毕业设计 基于单片机的红外热视仪 - 嵌入式 物联网

5 最后

包含内容

在这里插入图片描述

包含详细配套论文
在这里插入图片描述

🧿 项目分享:

https://gitee.com/sinonfin/sharing

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值