【毕业设计】单片机远程wifi红外无接触体温测量系统 - 物联网 stm32

news/2024/5/19 2:26:49/文章来源:https://blog.csdn.net/m0_71572576/article/details/126712275

文章目录

  • 0 前言
  • 1 简介
  • 2 主要器件
  • 3 实现效果
  • 4 设计原理
    • 4.1 **MLX90614红外测温传感器**
    • 4.2 TOF10120激光测距传感器
    • 4.3 DS18B20传感器
      • **DS18B20单总线协议**
  • 5 部分核心代码
  • 5 最后


0 前言

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

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

🚩 基于单片机的远程wifi红外无接触体温测量系统

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

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

🧿 选题指导, 项目分享:

https://gitee.com/dancheng-senior/project-sharing-1/blob/master/%E6%AF%95%E8%AE%BE%E6%8C%87%E5%AF%BC/README.md


1 简介

基于STM32的红外测温测距实验箱,可实现红外测温,测距等功能。

2 主要器件

  • STM32F103RCT6芯片
  • MLX90614红外测温传感器
  • TOF10120激光测距传感器
  • ESP_WIFI模块
  • 1.77寸TFT屏幕
  • DHT11温湿度传感器
  • DS18B20传感器
  • 光敏电阻、蜂鸣器、按键等

3 实现效果

在这里插入图片描述
在这里插入图片描述

4 设计原理

4.1 MLX90614红外测温传感器

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

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

4.2 TOF10120激光测距传感器

简介
TOF10120激光模块最大的优势在于测距远、操作简单,程序中仅仅需要通过单片机给模块串口发送命令字符串,就可以向单片机发送回距离数据。如果发送自动测距的字符串命令,则模块会按照一定频率自动回送数据,相关物理量都可以通过命令字符串设置。传感器仅需要串口就可以实现。
在这里插入图片描述

TOF10120基于Sharp低成本标准CMOS工艺和SPAD技术,可为自动对焦(AF)提供精确、可重复的长距离测量,测量结果不受物体反射的影响。主要特点包括:

  • 采用940nm激光;
  • 小型陶瓷封装(20×13.2×2.0mm);
  • 可在室内测量长达1.8m长度,精度5%;
  • 测量距离不受姆堡反射的影响;
  • 先进广促俄串扰补偿技术;
  • 30ms高速测量;
  • 单电源供电;
  • Txd接口用于设备控制和数据传送;
  • 无铅,符合RoHS指令。

在这里插入图片描述

TOF10120典型测距范围为100-1800mm,电源电压3-5v,消耗电流35mA,兼容Arduino、ESP8266、ESP32等5V和3.3V控制板,适合-20°C to +70°C等室内外环境。

TOF10120支持UART、I2C通讯,1#引脚、2#引脚、3#引脚、4#引脚、5#引脚、6#引脚分别为GND、VDD、RXD、TXD、SDA、SCL。在六个引脚中,本项目只使用了其中的GND, VDD, SDA, and SCL四个脚。

根据数据表,TOF10120的I2C地址为0xA4,但寻址采用高7bit即0x52,这相当于82。

4.3 DS18B20传感器

DS18B20数字温度计提供9位温度读数。信息经过单线接口送入或送出DS18B20传感器,因此从中央处理器到DS18B20仅需要提供电源以及一根数据线,就可以工作。

DS18B20的ROM指令表
在这里插入图片描述
DS18B20的RAM指令表
在这里插入图片描述

DS18B20单总线协议

1、DS18B20初始化
在这里插入图片描述

(1) 数据线拉到低电平“0”。

(2) 延时480微妙(该时间的时间范围可以从480到960微妙)。

(3) 数据线拉到高电平“1”。

(4) 延时等待80微妙。如果初始化成功则在15到60微妙时间内产生一个由DS18B20所返回的低电平“0”.根据该状态可以来确定它的存在,但是应注意不能无限的进行等待,不然会使程序进入死循环,所以要进行超时判断。

(5) 若CPU读到了数据线上的低电平“0”后,还要做延时,其延时的时间从发出的高电平算起(第3步的时间算起)最少要480微妙。

2、读时序
在这里插入图片描述

(1) 将数据线拉低“0”。

(2) 延时1微妙。

(3) 将数据线拉高“1”,释放总线准备读数据。

(4) 延时10微妙。 //等待数据稳定

(5) 读数据线的状态得到1个状态位,并进行数据处理。

(6) 延时45微妙。

(7) 重复1~7步骤,直到读完一个字节。

3、写时序
在这里插入图片描述

(1) 数据线先置低电平“0”

(2) 延时15微妙。

(3) 按从低位到高位的顺序发送数据(一次只发送一位)。

(4) 延时60微妙。

(5) 将数据线拉到高电平。

(6) 重复1~5步骤,直到发送完整的字节。

(7) 最后将数据线拉高。

5 部分核心代码

/* 红外温度传感器对象初始化 */
void MLXInitialization(MLXObjectType *mlx,    //MLX90614对象uint8_t address,       //设备地址MLXRead read,          //读数据函数指针MLXWrite write,        //写数据函数指针MLXDelayus delayus      //微秒岩石函数指针)
{if((mlx==NULL)||(read==NULL)||(write==NULL)||(delayus==NULL)){return;}mlx->Read=read;mlx->Write=write;mlx->Delayus=delayus;mlx->tempAmbient=0.0;mlx->tempObject1=0.0;mlx->tempObject2=0.0;if(address>0x00){mlx->devAddress=address;}else{mlx->devAddress=MLXSlaveAddress;}mlx->Delayus(200);GetIDFromMLX90614(mlx);mlx->flags=(uint8_t)ReadFlagFromMLX(mlx);mlx->pwmctrl=ReadDataFromMLX(mlx,EEPROMAccess|PWMCTRL);mlx->ConfigRegister=ReadDataFromMLX(mlx,EEPROMAccess|ConfigRegister1);
}
/*******************************************************************************
* 函 数 名         : DS18B20_Check
* 函数功能		   : 检测DS18B20是否存在
* 输    入         : 无
* 输    出         : 1:未检测到DS18B20的存在,0:存在
*******************************************************************************/
u8 DS18B20_Check(void) 	   
{   u8 retry=0;DS18B20_IO_IN();//SET PG11 INPUT	 while (DS18B20_DQ_IN&&retry<200){retry++;delay_us(1);};if(retry>=200)return 1;else retry=0;while (!DS18B20_DQ_IN&&retry<240){retry++;delay_us(1);};if(retry>=240)return 1;	 return 0;
}/*******************************************************************************
* 函 数 名         : DS18B20_Read_Bit
* 函数功能		   : 从DS18B20读取一个位
* 输    入         : 无
* 输    出         : 1/0
*******************************************************************************/
u8 DS18B20_Read_Bit(void) 			 // read one bit
{u8 data;DS18B20_IO_OUT();//SET PG11 OUTPUTDS18B20_DQ_OUT=0; delay_us(2);DS18B20_DQ_OUT=1; DS18B20_IO_IN();//SET PG11 INPUTdelay_us(12);if(DS18B20_DQ_IN)data=1;else data=0;	 delay_us(50);  return data;
}/*******************************************************************************
* 函 数 名         : DS18B20_Read_Byte
* 函数功能		   : 从DS18B20读取一个字节
* 输    入         : 无
* 输    出         : 一个字节数据
*******************************************************************************/
u8 DS18B20_Read_Byte(void)    // read one byte
{        u8 i,j,dat;dat=0;for (i=1;i<=8;i++) {j=DS18B20_Read_Bit();dat=(j<<7)|(dat>>1);}						    return dat;
}/*******************************************************************************
* 函 数 名         : DS18B20_Write_Byte
* 函数功能		   : 写一个字节到DS18B20
* 输    入         : dat:要写入的字节
* 输    出         : 无
*******************************************************************************/
void DS18B20_Write_Byte(u8 dat)     
{             u8 j;u8 testb;DS18B20_IO_OUT();//SET PG11 OUTPUT;for (j=1;j<=8;j++) {testb=dat&0x01;dat=dat>>1;if (testb) {DS18B20_DQ_OUT=0;// Write 1delay_us(2);                            DS18B20_DQ_OUT=1;delay_us(60);             }else {DS18B20_DQ_OUT=0;// Write 0delay_us(60);             DS18B20_DQ_OUT=1;delay_us(2);                          }}
}

5 最后

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_5728.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

精妙绝伦

精妙绝伦啊,精妙绝伦啊,大妙! 今天讨论到一个二级联动省和市在一个表中的情况, 这么一组数据,需要达成一个sql语句便能把省和市同时显示出来,愚绞尽脑汁思虑良久,未得有用之策,经同事提点,顿醍醐灌顶! 先来解释一下这串代码:Select * from TBSpace inner join TBPla…

three.js绘制地图(平面、曲面)

加载中国地图json数据 let loader = new THREE.FileLoader(); loader.load(model/chinaJson.json, function (data) {let jsonData = JSON.parse(data);initMap(jsonData); // 解析并绘制地图 });绘制曲面地图function initMap( chinaJson ) {//创建一个空对象存放对象map = ne…

Vue指令

Vue指令分为内置指令和自定义指令 内置指令 v-bind 单向绑定解析表达式&#xff0c; 简写&#xff1a; &#xff1a;xxx <div id"root">单项数据绑定&#xff1a;<input type"text" v-bind:value"name"><br></div> v…

2023秋招——快手数据研发一、二面面经

&#x1f33c;今天来总结一下快手数据研发的一、二面&#xff0c;在面试中进步&#xff0c;在总结中成长&#xff01;对往期内容感兴趣的小伙伴可以参考下面&#x1f447;&#xff1a; 链接: 2022暑期实习字节跳动数据研发面试经历-基础数仓.链接: 2022百度大数据开发工程师实…

three.js实现鼠标拾取例子

基本思路 <script> var renderer,scene,camera; var light; var raycaster,//相机->鼠标的射线mouse,//鼠标所在位置actionObject;//选中的物体 init(); animation();function init(){//渲染器//场景//相机//方向光//创建2000个立方体//创建射线//创建鼠标二维向量(圆…

epoll实现异步请求数据---以UDP为例

文章目录同步UDP请求数据的问题异步请求的模型具体的代码同步UDP请求数据的问题 不管是请求DNS资源还是其他资源。如果以串行的方式请求数据&#xff0c;也就是send以后recv阻塞等待获取数据&#xff0c;这样做的效率非常低效&#xff0c;网络延迟、服务器处理请求、再加上rec…

【C# 学习笔记 ②】C#基本语法(数组、判断和循环、字符串、枚举、结构体)

由于在自己的工作和学习过程中&#xff0c;只查看某个大佬的教程或文章无法满足自己的学习需求和解决遇到的问题&#xff0c;所以自己在追赶大佬们步伐的基础上&#xff0c;又自己总结、整理、汇总了一些资料&#xff0c;方便自己理解和后续回顾&#xff0c;同时也希望给大家带…

【我不熟悉的css】07. css命名,bem规范,跟着组件库element-ui学习组件命名

在去年&#xff0c;我总结了一篇文章&#xff0c;跟着element-ui学习css命名 【系统学习css】跟着element-ui学习css的命名_我有一棵树的博客-CSDN博客每日鸡汤&#xff0c;每一个你想要学习的念头都是未来的你向自己求救写css 最烦人的就是给class起名字了&#xff0c;这里不…

这一次,我们把AI自治数据库带到了世界人工智能大会上

9月3日,2022世界人工智能大会(WAIC)在上海圆满落幕。WAIC2022 秉持“智联世界”理念,通过线上线下联动的会展形式,汇聚顶级科学家、企业家、政府官员、专家学者、国际组织、投资人、创新团队一同探讨科技前沿话题,推动全球“共创、共建、共融、共治、共享、共赢”。WAIC …

【Python刷题篇】——Python入门 09 字典(上)

&#x1f935;‍♂️ 个人主页: 北极的三哈 个人主页 &#x1f468;‍&#x1f4bb; 作者简介&#xff1a;Python领域新星创作者。 &#x1f4d2; 系列专栏&#xff1a;《牛客题库-Python篇》 &#x1f310;推荐《牛客网》——找工作神器|笔试题库|面试经验|实习经验内推&am…

【数据结构与算法】之深入解析“乘法表中第K小的数”的求解思路与算法示例

一、题目要求 几乎每一个人都用乘法表,但是你能在乘法表中快速找到第 k 小的数字吗?乘法表是大小为 m x n 的一个整数矩阵,其中 mat[i][j] == i * j(下标从 1 开始)。给你三个整数 m、n 和 k,请你在大小为 m x n 的乘法表中,找出并返回第 k 小的数字。示例 1:输入:m =…

MATLAB | 全网唯一,三元相映射图绘制(三元相分级统计地图)

示例 对上期的补充 本期文章名叫三元相映射图绘制&#xff0c;但不单单讲这一点&#xff0c;同时会对上一篇多元映射地图做出补充https://slandarer.blog.csdn.net/article/details/126702967&#xff1a; 上篇中可以绘制这样的三变量映射地图&#xff1a; 但这只是对多边形…

Vue学习之--------路由(Router)的基本使用(1)(2022/9/5)

理解&#xff1a; 一个路由&#xff08;route&#xff09;就是一组映射关系&#xff08;key - value&#xff09;&#xff0c;多个路由需要路由器&#xff08;router&#xff09;进行管理。前端路由&#xff1a;key是路径&#xff0c;value是组件。控制页面的跳转 文章目录1、基…

01-linux基础命令

1、常用命令 常用Linux命令的基本使用序号命令对应英文作用01 ls list 查看当前目录下的内容02 pwd print working derectory 查看当前所在文件夹03 cd [目录名] change directory 切换文件夹04 touch [文件名] touch 如果文件不存在, 新建文件05 mkdir [目录名] make director…

【JavaSE】多线程篇(三)用户线程、守护线程与线程的7大状态

&#x1f481; 个人主页&#xff1a;黄小黄的博客主页 ❤️ 支持我&#xff1a;&#x1f44d; 点赞 &#x1f337; 收藏 &#x1f918;关注 &#x1f38f; 格言&#xff1a;All miracles start from sometime somewhere, make it right now. 本文来自专栏&#xff1a;JavaSE从入…

关于使用@Scheduled()注解造成的多任务冲突问题解决

问题描述&#xff1a; 2022-08-18 01:59:00.001 INFO [irms-transfer-service,,,] 15 --- [ scheduling-1] c.s.i.t.service.impl.ProjectManageSvc : -------定时扫描导出任务开启------- 2022-08-18 01:59:00.004 INFO [irms-transfer-service,,,] 15 --- [ schedu…

如何查看navicat已连接用户的密码

1:从注册表中查看加密后的密码。1.1:windows键+r,输入 regedit1.2:在注册表中找到 \HKEY_CURRENT_USER\SOFTWARE\PremiumSoft\navicat\servers 并找到 UserName 即 账号1.3:从上面步骤中,打开注册表、并找到如下图片中的密码栏:Pwd(加密的密码)2:解密密码,打开在线工…

React 应用程序中的简单路由

React 应用程序中的简单路由一个简单的、可扩展的路由解决方案可以满足您的应用程序的所有需求,而不会引入像 React-Router 这样的工具所提供的复杂性。 进入: 浏览器的 窗口位置 目的。 它提供了为您的应用程序创建一个简单的“路由”系统所需的一切。例如,这里是什么 窗口…

【Selenium Other】一键杀死进程 进程清理大师

前言 有位读者留言&#xff0c;遇到了一件两难全的事儿。在关闭Python使用os模块执行cmd命令调用的chromedriver驱动打开的chrome浏览器时&#xff0c;有以下问题~ 使用driver.quit()退出浏览器&#xff0c;chromedriver.exe进程退出&#xff0c;关闭没有窗口使用driver.close(…

2021年中青杯B题港珠澳大桥桥梁设计与安全策略数学建模全过程文档及程序

港珠澳大桥桥梁设计与安全策略 原题再现 “港珠澳大桥是国家工程、国之重器&#xff0c;其建设创下多项世界之最&#xff0c;非常了不起&#xff0c;体现了一个国家逢山开路、遇水架桥的奋斗精神&#xff0c;体现了我国综合国力、自主创新能力&#xff0c;体现了勇创世界一流的…