×

使用AVR DA微控制器的温度接入点

消耗积分:0 | 格式:zip | 大小:0.05 MB | 2022-11-24

刘桂英

分享资料个

描述

在大流行期间,人们被要求在任何当地市场或杂货店进行体温检查,这通常由另一个人完成。这对于人与人之间的互动来说可能是一种冒险的做法。为了降低这种风险,我们开发了一个温度接入点,它可以自动检测人员并邀请他们检查体温,远程测量,然后将其显示在高对比度(有机发光二极管)OLED 显示屏上,无需任何人为干预。

 

发展

选择AVR128DA48进行开发是因为板载外设种类繁多且 I/O 引脚充足。AVR® DA 利用其板载 12 位 ADC 测量来自无源红外 (PIR)传感器的输出以唤醒。

为了加快开发速度,我们使用了 AVR128DA 的Curiosity Nano 评估板Curiosity Nano 是一种低成本的开发工具,可拆分设备上的 I/O,并包括一个专用的板载 USB 编程器。除了 Nano,还使用了Curiosity Nano 基板。该板可方便地访问 3 个 MikroBUS™ 串行接口,以便于连接开发板。在此应用中,使用了OLED C 显示器、红外温度计 (IrThermo)被动红外 (PIR) click

为了检测一个人何时进入建筑物,需要一种非接触式的感应方式。此外,该系统将充当大楼的看门人,拒绝发烧的人进入。由于存在通过身体接触传播疾病的风险,机械开关或磁簧开关不适合此应用。

相比之下, PIR 传感器会生成一个低电平模拟信号,该信号与其视野中的物体温度相关,如下所示。

poYBAGN-2TSAGFHNAAEiCTETGZY949.jpg
PIR 传感器对环境变化的响应
 

其视野内温度总和的突然变化(例如有人进入)会干扰传感器,并导致输出电平发生变化。PIR 传感器板带有一个模拟前端,可将输出信号的比例增加到可以使用板载 12 位 ADC 可靠测量的水平。

为了减少与 PIR 传感器变化相关的处理开销,ADC 的窗口比较器用于检查 ADC 的值是否在设定值范围之内(或之外)。当值超出正常范围时,会触发中断,将设备从睡眠中唤醒以开始处理。

虽然 PIR 传感器确实会产生与其视野中的 IR 量相关的输出,但它对于测量人的温度来说太不精确了。为了准确测量人的温度,使用了红外温度计点击板。该板有一个数字高精度红外温度计,可通过 I2C 或通过 PWM 输出进行通信。在这个应用程序中,使用了 I2C 通信。

一旦测量了人的体温,屏幕上就会打印一条消息,指示该人的体温以及是否允许进入建筑物。可以将蜂鸣器连接到该板上以指示各种事件,例如门解锁或访问被拒绝。蜂鸣器的音调因事件而异。如果门“解锁”,Curiosity Nano 上的 LED 会亮起。

程序说明

通常 AVR128DA 处于睡眠模式。PIR 传感器在睡眠时由 ADC 连续采样。当采样值超过设置的窗口阈值时,设备会从睡眠中唤醒。入睡后,红外温度计立即测量房间的环境温度,然后测量传感器前面的人(或物体)的温度,并比较是否:

  • 温差太小——重复测量最多 TIMEOUT_MEAS 次。
  • 温差大于阈值,人不发烧。
  • 温差大于阈值,人发热。

在温差过小的情况下,系统最终会超时并返回睡眠,因为这是一个误报。在另外两种情况下,存在足够的温差来确定一个人正在寻求访问。IR温度计用于测量他们的温度REPEATED_MEAS次,记录最大值。最大值用于确定是否应允许某人进入建筑物。对于不发烧的人,蜂鸣器响起,门“解锁”。OLED 屏幕显示他们的温度和指示门已打开的消息。对于发烧的人,蜂鸣器会发出不同的声音,OLED 屏幕会显示他们的体温和“拒绝访问”的消息。

快速设置

作为安装开发工具的替代方法,存储库中的 .hex 文件可以像 USB 驱动器一样拖放到 Curiosity Nano 上。nano 将自动对 AVR DA 进行编程和配置。如果使用此选项,只需执行步骤 1 和 4。

第 1 步 - 硬件和固件设置

关闭电源后,将 3 个卡扣插入 Curiosity Nano 适配器,如下所示。将 AVR128DA48 Curiosity Nano 插入插座。如果您没有下载固件,请下载固件并将其解压缩 到您选择的文件夹中。

第 2 步 - 软件设置

通过 MicroUSB 电缆将 Curiosity Nano 连接到您的开发计算机,例如这个,然后启动 MPLAB® X。转到 File > Open Project 并导航到解压缩的文件夹。双击文件夹将其打开。如果左侧栏中的项目名称不是粗体,请在项目右侧并选择“设置为主项目”。建议关闭其他当前打开的与项目无关的文件,以免混淆。

步骤 2A(可选)- 探索外设配置

单击工具栏中的MPLAB 代码配置器 (MCC)按钮以启动 MCC。MCC 将向您显示设备上外围设备的配置。

注意:如果此按钮在 MPLAB 中不可见,则可能未安装 MCC。要安装,请转至工具 > 插件 > 可用插件 > MPLAB 代码配置器。安装完成后,重新启动 MPLAB。

第 3 步 - 对设备进行编程

首先,构建项目。您可以单击构建(按钮 A)或构建并清理(按钮 B)。构建和清理将删除缓存的编译器和链接器文件,这有时会导致构建错误。要对设备进行编程,请单击指向微控制器的箭头(按钮 C)。

poYBAGN-2TqAXNIeAAAKvigB86M823.png
工具栏图标
 

按下编程按钮后,MPLAB 可能会要求选择工具。为 AVR128DA 选择 Curiosity Nano。在大多数情况下,首次使用 nano 进行编程需要对 nano 进行固件更新,该固件将自动安装。编程后,程序自动运行。

注意:如果 Nano 固件更新过程中发生错误,请从 PC 上拔下 nano 并重新启动 MPLAB。重新连接 nano 并重复步骤 3。

注意:如果 nano 的选项显示为灰色,则可能需要更新 DFP 文件。转到工具 > 包并检查 AVR-Dx_DFP 以查看它是否已安装并且是最新的。此程序已使用 DFP 1.2.52 和 1.3.65 进行了测试。

第 4 步 - 使用演示

编程后,演示应立即生效。PIR click 产生与环境温度相关的模拟电压。如果该值超过阈值,则设备会收到中断并从睡眠中唤醒。OLED 显示屏打开并提示用户站在红外温度计前面点击。如果温度接近或等于环境温度,系统会将其标记为误报并返回睡眠状态。当检测到一个人时,IR 温度计测量温度 REPEATED_MEAS 次以找到最大值。如果最高温度在正常温度范围内,屏幕将打印“Door Opened”并发出蜂鸣声。如果温度升高,屏幕上会打印“拒绝访问”并发出不同的声音。

修改和调整

项目中的“constants.h”文件包含程序中使用的常量。可以调整其中一些值,以便在温度可能不同的不同环境中获得更好的性能。下面的列表具有关键的可调常数:

· TEMP_GOOD(默认 37.3)——设置允许进入的最高温度。

· TEMP_DIFF(默认 3.4)——设置 IR Thermo 传感器的阈值以确定是否有人在场。

· TEMP_HIGH (默认42.0) – 设置红外温度计认为有效的最高温度。

· TEMP_LOW(默认为 32.0)——设置红外温度计认为有效的最低温度。

· TIMEOUT_MEAS(默认为 300)——设置在将事件视为错误检测之前要进行的测量次数。

· REPEATED_MEAS(默认为 100)——设置检测到人时要进行的测量次数。记录最高值以进行比较。

· ADC_LOW_THRSHOLD(默认为 0x9)——设置 ADC 运动检测窗口的低阈值。

· ADC_HIGH_THRESHOLD(默认为 0xF3C)——设置 ADC 运动检测窗口的高阈值。

 


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.obk20.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'使用AVR DA微控制器的温度接入点',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.obk20.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);