单片机毕设分享 - 基于单片机的无接触测温枪 - MLX90614 红外测温仪 嵌入式 物联网 stm32


0 前言

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

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

🚩 基于单片机的无接触测温枪

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

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

🔥 项目分享与指导:https://gitee.com/sinonfin/sharing

在这里插入图片描述


1 简介

疫情当前,电子测温枪供不应求,本项目实现了基于MLX90614的红外测温仪。含有3段温度区段报警功能:分为绿蓝红区,低于绿区设定值不报警,介于绿区红区设定值鸣响5声,高于红区设定值鸣响10声。

2 主要器件

  • Atmel Mega168主控芯片
  • MLX90614为红外温度传感器
  • 3位0.28寸共阳数码管为屏幕显示
  • 18650电池
  • IP5306升压转换SOC

3 实现效果

正常温度-绿色在这里插入图片描述
中等温度-蓝色
在这里插入图片描述
严重高温-红色
在这里插入图片描述
实物检测
在这里插入图片描述
在这里插入图片描述

4 相关模块、配置介绍

mlx90614红外传感器
MLX90614是一款红外非接触温度计。TO-39金属封装里同时集成了红外感应热电堆探测器芯片和信号处理专用集成芯片。由于集成了低噪声放大器、17位模数转换器和强大的数字信 号处理单元,使得高精度和高分辨度的温度计得以实现。温度计具备出厂校准化,有数字 PWM和 SMBus(系统管理 总线)输出模式。作为标准,配置为 10 位的 PWM 输出格式用于连续传送温 度范围为-20…120 ˚C 的物体温度,其分辨率为 0.14 ˚C。 POR 默认模式是 SMBus 输出格式。
实物
在这里插入图片描述

硬件电路图如下:
在这里插入图片描述

烧录配置(部分)
在这里插入图片描述在“1”框内选择相应的芯片型号
选择完成后,按下“2”
按下“3”进入熔丝位设置

设置对应的熔丝位,完成后点击“写入”
在这里插入图片描述
在这里插入图片描述
选择相应的固件,点击“打开”
在这里插入图片描述

主要原理图
在这里插入图片描述

5 部分核心代码

void setup() {
  // put your setup code here, to run once:
  pinMode(RIGHT, INPUT_PULLUP);
  pinMode(LEFT, INPUT_PULLUP);
  pinMode(MAIN, INPUT_PULLUP);
  pinMode(RED, OUTPUT);
  pinMode(YELLOW, OUTPUT);
  pinMode(GREEN, OUTPUT);
  pinMode(BUZZER, OUTPUT);
  Wire.begin();
  byte highTCA = EEPROM.read(temperatureCalibrationAddress);
  byte lowOTCA = EEPROM.read(temperatureCalibrationAddress + 1);
  byte highBSA = EEPROM.read(buzStateAddress);
  byte lowbBSA = EEPROM.read(buzStateAddress + 1);
  temperatureCalibration = (highTCA << 8) + lowOTCA;
  buzState = (highBSA << 8) + lowbBSA;
  sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins); //初始化数码管
  sevseg.setBrightness(45);
  digitalWrite(RED, HIGH);
  delay(175);
  digitalWrite(RED, LOW);
  digitalWrite(YELLOW, HIGH);
  delay(175);
  digitalWrite(YELLOW, LOW);
  digitalWrite(GREEN, HIGH);
  delay(175);
  digitalWrite(GREEN, LOW);

  if (temperatureCalibration < -25 or temperatureCalibration > 25)
  {
    temperatureCalibration = 0;
  }
  if (buzState < 0 or buzState > 1)
  {
    buzState = 0;
  } 
  /*
  由于使用固件烧录会擦除EEPROM,所以烧录完程序启动时,读取到的EEPROM会不正常
  为了避免系统异常,就增加这几行代码,用作数据纠正
  */
  if (buzState == 1)
  {
    digitalWrite(BUZZER, HIGH);
    delay(85);
    digitalWrite(BUZZER, LOW);
  }
  else
  {
    digitalWrite(BUZZER, LOW);
  }
  sevseg.setChars("--.-");
}

void loop() {
  if (digitalRead(MAIN) == 0)
  {
    keyState1 = 1;
    sevseg.refreshDisplay();
  }
  else
  {
    keyState1 = 0;
  }
  if (digitalRead(LEFT) == 0)
  {
    keyState2 = 1;
    sevseg.refreshDisplay();
  }
  else
  {
    keyState2 = 0;
  }
  if (digitalRead(RIGHT) == 0)
  {
    keyState3 = 1;
    sevseg.refreshDisplay();
  }
  else
  {
    keyState3 = 0;
  }

  if (keyState2 == 1)
  {
    delayCount = delayCount + 1;
  }
  if (delayCount >= delayCountMax3)
  {
    delayCount = 0;
    menu = menu + 1;
    digitalWrite(RED, LOW);
    digitalWrite(GREEN, LOW);
    digitalWrite(YELLOW, LOW);
  }
  if (menu > menuMax)
  {
    survey();
    sevseg.refreshDisplay();
    menu = 0;
  }
  switch (menu)
  {
    case 0 :
      menu_0();
      sevseg.refreshDisplay();
      break;
    case 1 :
      menu_1();
      sevseg.refreshDisplay();
      break;
    case 2 :
      menu_2();
      sevseg.refreshDisplay();
      break;
  }

  if (buzState == 1 && buzRingFrequency > 0)
  {
    buzDelayCount = buzDelayCount + 1;
    if (buzDelayCount == (delayCountMax4 / 5) * 4)
    {
      digitalWrite(BUZZER, HIGH);
    }
    if (buzDelayCount >= delayCountMax4)
    {
      digitalWrite(BUZZER, LOW);
      buzDelayCount = 0;
      buzRingFrequency = buzRingFrequency - 1;
    }
  }
  if (buzState == 0 or buzRingFrequency == 0)
  {
    digitalWrite(BUZZER, LOW);
  }
}

void menu_0()
{
  if (keyState1 == 1)
  {
    delayCount = delayCount + 1;
  }
  if (delayCount >= delayCountMax3)
  {
    delayCount = 0;
    survey();
    buzRingFrequency = 1;
    if (temperature < minTemperature)
    {
      digitalWrite(GREEN, LOW);
      digitalWrite(RED, LOW);
      digitalWrite(YELLOW, LOW);
      sevseg.setChars("Lo");
      sevseg.refreshDisplay();
    }
    if (temperature >= minTemperature && temperature < yellowTemperature)
    {
      digitalWrite(GREEN, HIGH);
      digitalWrite(YELLOW, LOW);
      digitalWrite(RED, LOW);
    }
    if (temperature >= yellowTemperature && temperature < redTemperature)
    {
      digitalWrite(YELLOW, HIGH);
      digitalWrite(GREEN, LOW);
      digitalWrite(RED, LOW);
      buzRingFrequency = 5;
    }
    if (temperature >= redTemperature && temperature < maxTemperature)
    {
      digitalWrite(RED, HIGH);
      digitalWrite(GREEN, LOW);
      digitalWrite(YELLOW, LOW);
      buzRingFrequency = 10;
    }
    if (temperature >= maxTemperature)
    {
      digitalWrite(RED, LOW);
      digitalWrite(GREEN, LOW);
      digitalWrite(YELLOW, LOW);
    }
    if (temperature >= maxTemperature)
    {
      survey();
      sevseg.setChars("HIG");
      sevseg.refreshDisplay();
    }
  }
}

void menu_1()
{
  if (keyState3 == 1)
  {
    delayCount = delayCount + 1;
  }
  if (delayCount >= delayCountMax3)
  {
    buzState = buzState + 1;
    delayCount = 0;
  }
  if (buzState > 1)
  {
    buzState = 0;
  } 
  switch (buzState)
  {
    case 0:
      //buzState = 0;
      sevseg.setChars("bof");
      sevseg.refreshDisplay();
      break;
    case 1:
      //buzState = 1;
      sevseg.setChars("bon");
      sevseg.refreshDisplay();
      break;
  }
  sevseg.refreshDisplay();
}

5 最后

🔥 项目分享与指导:https://gitee.com/sinonfin/sharing

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于51单片机MLX90614红外测温仪实验指导书(含源代码) MLX90614 MLX90615 红外测温 51单片机 SMBus 这是经过本人实验测试得到的成果,再次将之分享给大家,希望对搞温度测量及控制的人有所帮助!时钟线 数据线 温度显示第个数码管段选 温度显示第个数咼管段迮 温度显示第个数码管段选 矩阵键盘第列 矩阵键盘第列 矩阵键盘第列 矩阵键盘第行 矩阵键盘第行 矩阵键盘第行 数据定义 可位寻址数据 数码管码值定义 显示代码,共阳不带小数点的 显示代码,共阳带小数点的 仝局变量定义 定时标志位 定时毫秒数 向写入命令或数据 数据 清屏 光标返回原点 设置显示模式 显示开 显示关 显示光标 无光标 光标闪动 光标不闪动 设置输入模式 光标石移 默认光标左移 田面可半移 默认画面不移动 命令模式 对操作 操作 进入命令模式 退出命令模式 读标志 进入睡眠馍式 地址(只读) 周围温度 环境温度 单元 目标温度红外温度 单元 地址 测量范围上限设定 测量范围下限设定 设定 环境温度设定 频率修正系数 配置寄存器 器件地址设定 保留 保留 地址 地址 地址 地址 函数声明 发起始位子程序 发结東位子程序 接收字节子程序 发送位子程序 接收字节子程序 接收位子程序 延时程序 读温度数据 初始化子程序 判断忙子程序 写命令子程序 写数据子程序 显示子程序 字符串显示程序 主函数 温度变量 初始化 每 扫描一次键盘 按下键时,进行数码管显示 液品屏显示 读取温度 清屏 显示字符串 且换行 显示温度 显示摄氏度 延吋再读取温度显 字符串显示稈序 字符串显示程序 直到字符肀结束 转成码 指向下一个字符 输入转换并显示用于 温度为止 温度整数 温度小数 温度超过度 显示温度百位 显小温度十位 显示温度个位 温度超过度 显小温度十位 显示温度个位 温度不超过度 显示温度个位 显示小数点 温度小数点后第位数不等于 显示温度小数点后第位数 显示温度小数点后第位数 温度小数点斤第位数等于 显示温度小数点后第位数 显示温度小数点后第位数 温度为负
基于51单片机开发的小程序,学习资料,用于学习51单片机嵌入式开发,应用案例 基于51单片机开发的小程序,学习资料,用于学习51单片机嵌入式开发,应用案例 基于51单片机开发的小程序,学习资料,用于学习51单片机嵌入式开发,应用案例 基于51单片机开发的小程序,学习资料,用于学习51单片机嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机嵌入式开发,应用案例
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值