×

用药温度监测系统

消耗积分:0 | 格式:zip | 大小:0.18 MB | 2023-07-03

31274

分享资料个

描述

介绍

该项目监控平板电脑存储冷却室的温度。它检查温度是否在指定的范围内,并在温度有任何偏差时通知用户。

它基本上分3个阶段实施-

  • 第 1 阶段 - 记录室中的温度值几个小时。实施多项式回归的机器学习算法,用于预测未来值并确定室内温度的边界。
  • 第 2 阶段 - 每 10 秒获取温度值,如果温度超过温度阈值(我们在第 1 阶段设置),则向用户发送通知(通过电子邮件)。
  • 第 3 阶段 - 使系统“自力更生” - 使用 z 分数分析,检测任何异常并通知用户。

保护药物和药片免受设备故障或故障的影响对于维持合规性和质量标准至关重要。

阶段1

在这个阶段,我们将记录温度传感器的值约 2 小时。我们还将实施多项式回归模型,以预测未来一些点的温度读数。根据结果​​,我们将找到温度的阈值边界值。

1.1 构建电路

LM35传感器是一种常用的温度读数传感器。随着温度升高,传感器两端的电压升高,反之亦然。

T = r / 10.24,r-> LM35 传感器读数,T-> 温度(摄氏度)

下面给出了LM35-温度传感器与螺栓模块的电路连接。

poYBAGOYQUOARDx9AAzVEaWpJQs170.jpg
LDR 连接到 Bolt IoT Wifi 模块
 

将 LM35 连接到螺栓模块-

1)拿着LM35,这样你就可以看到上面写的LM35。

2)从这个位置最左边的引脚连接到Vcc(螺栓模块上的+5v)。

3)中间引脚连接到输出(即螺栓模块上的A0)

4)最右边的引脚接地(螺栓模块上的GND)

通过 Micro USB 电缆将 Bolt Wifi 模块连接到电源。

1.2 创建产品并将其链接到我们的设备

转到https://cloud.boltiot.com/ ,然后按照以下步骤操作:

 

1.3 实现多项式回归算法

  • 多项式回归是一种机器学习算法,我们在其中找到一个最能模拟数据集的多项式方程。

多项式方程的形式是-

y = f(x),其中 f(x) 是 x 的不同幂次之和的函数。
pYYBAGOYQUeAKoAkAAAP5RI8tks381.png
我们试图找到最适合给定数据集的多项式方程。
 

在这里,我们使用“时间”作为 x 坐标。然后我们可以使用获得的多项式方程来预测未来的温度值。

  • 步骤- 1. 单击配置此产品。
poYBAGOYQUyAKKbHAAEg3brA1w0176.jpg
 

2. 点击 A0 引脚并给它一个名字——“temp”。(因为该引脚将温度作为输入)

根据您的要求选择数据收集率。(我选择了 5 分钟)

pYYBAGOYQVCATS1pAAF8drVVZJA948.png
 

3. 单击代码。选择.js作为扩展文件,编写如下代码。

setChartLibrary('google-chart')
setChartTitle('Polynomial Regression')
setChartType('predictionGraph')
setAxisName('time_stamp','temp')
mul(0.0977)
plotChart('time_stamp','temp')

注意-a)我使用谷歌图表库来实现多项式回归。

b) setChartLibrary() - 选择 google 图表库 setChartTitle() - 设置图表的标题 setChartType() - 将图表类型设置为预测图(即它选择多项式回归) setAxisName() - 将名称设置为 x 和 y轴(分别是时间和温度值) mul(0.0977)- 将温度值乘以 0.0977,将温度传感器读数转换为以摄氏度为单位的温度。 plotChart() - 最后绘制图表。

4. 保存配置。

poYBAGOYQVWAduOEAAFFU7uRYlg239.png
保存配置。
 

5. 部署硬件配置并单击“查看此设备”。

pYYBAGOYQWCAUzwoAAEfzOb3me4678.jpg
 

6. 现在将传感器在冷却室中放置约 2 小时(盖上盖子)并记录数值。(PS - 我使用了一个封闭的托盘,里面有一些冰块作为房间,但你可以把设置放在冰箱里)。

pYYBAGOYQYeAXy5PAAc7OrTFsBk001.jpg
冷却室托盘,里面有一些冰块。
 
  • 了解预测模型-
poYBAGOYQZuASkfYAAQR61F66II411.jpg
当您单击预测按钮时,除了显示的数据图之外,还有 2 个图。这些图表是预测历史和预测数据。
 

预测点:这个数字告诉 Visualizer 需要预测多少未来数据点。因此,如果您将产品设置为每 5 分钟收集一次数据,并选择 4 个预测点,Visualizer 将预测趋势并在未来 30 分钟内显示 4 个点。

No. 多项式系数:Polynomial Visualizer 处理给定的输入时间相关数据,并输出以下形式的函数的系数:

pYYBAGOYQZ6ATt_sAAA8w2hRdKQ274.png
 

最接近输入数据的趋势。这个数字告诉 Visualizer 函数中应该存在多少元素,即 n 的值。

帧大小:这些是 Visualizer 将用于预测数据趋势的先前数据点的数量。例如,如果将此值设置为 3,Visualizer 将使用前 3 个点来预测趋势。

预测历史图表可帮助您调整机器学习模型。您必须更改以下参数,以使该图表最接近实际数据。当这种情况发生时,预测数据或预测的未来温度将是最准确的。

这在有特定要求时很有用,例如 - 片剂的温度不得一次保持在 -33 到 -30 度之间超过 20 分钟。使用预测数据,只要图表预测温度将保持在 -33 和 -30 摄氏度范围内超过 20 分钟,我们就可以及早采取行动。

1.4设置室内温度边界

poYBAGOYQbyAVTyIAALEB0it2k0310.png
从云端下载数据
 

通过查看数据,我们可以将阈值设置为26*C 传感器值 - 277)和34*C (传感器值 - 351)

第二阶段

我们将编写一个 python 代码来获取温度数据,每 10 秒,如果温度超过我们在 1.4 部分中确定的温度阈值,则发送电子邮件警报(通过 Mailgun)。

因此,如果腔室中出现任何问题(由于温度变化),可以很容易地检测到并进行修复。

2.1 设置 Mailgun

使用过 Mailgun——它是一个电子邮件自动化服务。它有一套非常强大的用于发送电子邮件的内置功能。开发人员可以在 Mailgun API 的帮助下处理他们的电子邮件。

第 1 步 - 打开https://www.mailgun.com/并注册免费试用帐户。

第 2 步 - 遵循以下步骤 -

 

2.2 服务器和SSH终端软件

在这个项目中使用了数字海洋云服务。

DigitalOcean 是一家云计算供应商,为软件开发人员提供基础设施即服务 (IaaS) 平台。

  • 单击此链接- https://www.digitalocean.com/并创建一个帐户并进行验证。创建一个 Droplet。(确保选择离您最近的数据中心)
  • 您将通过邮件获得登录凭据和服务器 IP。

我使用“putty”软件通过 SSH 连接到服务器。SSH 是一种网络协议,它允许我们通过 Internet 远程访问计算机。

看看,在腻子中登录。

 
 
 
pYYBAGOYQb-AMA67AACfYEl60_I240.jpg
 
1 / 4写出droplet的ip地址
 

2.3 配置文件

我们必须创建一个文件来存储 Mailgun 和 Bolt IoT 的所有凭据。

Bolt 模块的 API 密钥和设备 ID 可以如下确定:

pYYBAGOYQcGAYKBLAAECSCHsTLM833.jpg
 
  • 转到 API 部分以了解 API 密钥。
poYBAGOYQcaAK8o9AAEIpbLaTag142.png
 

2.4 编写最终的python代码

代码算法——

  • 从 Bolt 设备中获取最新的传感器值。
 

收到邮件截图——

poYBAGOYQd6AZX30AAKEga0QCJs000.jpg
 

阶段 - 3

在阶段 -2 中,我手动设置了温度传感器的阈值范围。但在这个阶段,我将使用Z-score算法来动态更改发送警报的范围。

这个阶段的要点是——

当腔室工作正常时,温度变化会很慢,系统的界限会随着这种变化而变化。但是当出现任何系统故障或任何问题时,房间内的温度会突然发生变化。因此,系统将检测到异常并迅速提醒用户存在问题。

3.1 Z分数分析

Z-score 分析是一种用于异常检测的算法。在这里,温度的突然变化超出(阈值)范围值,是一种异常情况。值的范围称为界限(上限和下限)。这些界限是使用输入值、帧大小和乘法因子计算的。帧大小是 Z 分数分析所需的最小输入值数量,乘法因子确定边界与输入值曲线的接近程度。

pYYBAGOYQeGAb4QUAAAiMnhydlM277.png
 

上面给出的是计算边界的公式。这里输入表示为“Vi”,“r”表示帧大小,“C”是乘法因子。首先,我们计算输入值的平均值(Mn)(对于每个新输入,再次计算平均值)。每个输入值的变化(来自平均值)为 (Vi - Mn)^2。Z 分数 (Zn) 的计算如上所示(每个输入值的变化平均值的平方根乘以乘法因子)。界限表示为“Tn”,上限计算为 (Vi + Zn),下限计算为 (Vi - Zn)。

帧大小和倍增因子是使用试错法确定的。

3.2 修改配置文件

MAILGUN_API_KEY = 'This is the private API key which you can find on your Mailgun Dashboard' 
SANDBOX_URL= 'You can find this on your Mailgun Dashboard' 
SENDER_EMAIL = 'This would be test@your SANDBOX_URL'
RECIPIENT_EMAIL = 'Enter your Email ID Here'
API_KEY = 'This is your Bolt Cloud account API key'
DEVICE_ID = 'This is the ID of your Bolt device'
FRAME_SIZE = 10
MUL_FACTOR = 6

帧大小和倍增因子猜测为 10 和 6,然后根据要求进行调整。

3.3异常检测的Python代码

import email_conf   #import the configuration file
from boltiot import Email, Bolt   #import the boltiot module from the Bolt python library
import json, time, math, statistics #import various python libraries

#//---------FUNCTION TO COMPUTE BOUNDS OR Z SCORE ANALYSIS------------//
def compute_bounds(history_data,frame_size,factor):
#//Function to compute bounds
    if len(history_data)        return None

    if len(history_data)>frame_size :
        del history_data[0:len(history_data)-frame_size]
    Mn=statistics.mean(history_data)
    Variance=0
    for data in history_data :
        Variance += math.pow((data-Mn),2)
    Zn = factor * math.sqrt(Variance / frame_size)
    High_bound = history_data[frame_size-1]+Zn
    Low_bound = history_data[frame_size-1]-Zn
    return [High_bound,Low_bound]  # //Returns Low Bound and High Bound

mybolt = Bolt(email_conf.API_KEY, email_conf.DEVICE_ID) # //To identify your bolt device
mailer = Email(email_conf.MAILGUN_API_KEY, email_conf.SANDBOX_URL, email_conf.SENDER_EMAIL, email_conf.RECIPIENT_EMAIL)    # //To identify Mailgun account
history_data=[]    # //Array of input values from LM35
#//---------------------READ INPUT FROM LM35--------------------------//
while True:
    response = mybolt.analogRead('A0')  #//Read input from LM35 at A0 pin
    data = json.loads(response) # //Retrieve the input data in json format
    if data['success'] != 1:
        print("There was an error while retriving the data.")
        print("This is the error:"+data['value'])
        time.sleep(10)
        continue

    print ("This is the value "+data['value'])
    sensor_value=0
    try:
        sensor_value = int(data['value']) # //store current input value in variable
    except e:
        print("There was an error while parsing the response: ",e)
        continue
#//----------------PERFORMING Z SCORE ANALYSIS--------------------------//
    bound = compute_bounds(history_data,email_conf.FRAME_SIZE,email_conf.MUL_FACTOR)
    if not bound:
        required_data_count=email_conf.FRAME_SIZE-len(history_data)
        print("Not enough data to compute Z-score. Need ",required_data_count," more data points")
        history_data.append(int(data['value']))
        time.sleep(10)
        continue
#//-----------DETECTING ANOMALY AND SENDING ALERTS--------------//
    try:
        if sensor_value > bound[0] :  # //If input crosses upper bound
            print ("The temperature has increased suddenly. Sending an E-mail.")
            response = mailer.send_email("Alert", "The temperature has suddenly increased! ")
            print("This is the response ",response)
        elif sensor_value < bound[1]:   # //If input crosses lower bound
            print ("The light level decreased suddenly. Sending an Email.")
            response = mailer.send_email("Alert", "The temperature has suddenly decreased! ")
            print("This is the response ",response)
        history_data.append(sensor_value);   # //Append each new input to array history_data[]
    except Exception as e:
        print ("Error",e)
    time.sleep(10)     # //Wait for 10 seconds

3.4 演示

当一杯热水靠近传感器时,温度突然变化,检测到温度值异常。帧大小和倍增因子已经以这种方式进行了调整。

 

3.5 输出说明

由于我已将帧大小设置为 10,因此在获取 10 个传感器值之前,它不会计算 z 分数。

poYBAGOYQeOANuaeAAD-dfQ9T-o412.png
腻子输出截图
 

100 秒后(10 帧延迟 10 秒),它会开始计算 z-score 并检查是否有异常。带上一杯热水后,当温度突然变化时,异常是检测到。

poYBAGOYQeeACIJCAADaCsfs9KE765.png
腻子输出截图
 

收到邮件截图——

pYYBAGOYQfaAMcVRAAHrqjFYkXY978.png
 

因此,这是一种异常检测中的自力更生系统。

 

 

 

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

评论(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.lene-v.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:'用药温度监测系统',//标题 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.lene-v.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);