×

浮动水质传感器开源分享

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

乐侨珂

分享资料个

描述

介绍

在强降雨期间,河流的浊度往往会发生显着变化。气候变化导致空气和洋流发生变化,从而导致降雨模式发生剧烈变化。因此,河流的水质可能会在一年中突然发生变化。这些不可预测的浊度变化会大大增加饮用水处理的成本。

该项目旨在通过使用浮动传感器确定降雨模式如何与流动水体的浊度和湍流相吻合。

注意:请注意,该项目仍处于概念验证(POC)阶段,随着项目的成熟,可能需要进一步改进。

硬件

QuickFeather 开发套件,带有 EOS S3 低功耗 MCU + 嵌入式 FPGA、SD 卡读卡器、ADS1015 12 位 ADC、RTC 模块和 SEN0189 模拟浊度传感器用于构建浮动单元。

 
 
 
pYYBAGNxifaAHe0hAAOECtTkc7U789.jpg
 
1 / 3图 2:安装组件
 

由于该设备仍处于 POC 阶段,因此考虑了一种不太永久的组件安装方式。

该视频对 Quickfeather 开发套件进行了很好的介绍:

 

以下是本项目使用的接线图:

pYYBAGNxifmAbPyLAAIDkH8Fha0294.jpg
图 3:接线图
 

提示:您可以参考此处的用户指南以获取有关开发板引脚排列的更多信息。

QuickFeather 有一个集成的电池充电威廉希尔官方网站 ,可以让我将单节锂聚合物电池直接连接到 VBAT 引脚。将两块额定端电压为 5V 的太阳能电池板串联,并馈入 LM2596 降压转换器,将电压降至 3.3V。这将确保在有充足的阳光时为电池充电。

该项目使用的所有部件均使用 Solidworks 设计,然后进行 3D 打印。(附原始solidworks设计文件和STL文件)

 
 
 
poYBAGNxifuAS87ZAAB_42pJDKU251.jpg
 
1 / 3图 4:Solidworks 装配体
 

两块聚苯乙烯泡沫塑料板用于提供所需的浮力。我还使用了大量的热胶来确保没有泄漏。

pYYBAGNxif-AeQSaAAMDX8HqTv4870.jpg
图 5:浊度传感器安装
 

软件

该项目使用 QuickLogic 开放式可重构计算 (QORC) SDK 和 SensiML 生成一个模型,该模型可以根据传感器读数预测某些事件。

以下视频很好地介绍了这种方法:

 

为了继续本教程,您将需要在此处找到的 qorc sdkSensiML数据捕获实验室在 Linux 中设置所需的库相当容易,因此如果您像我一样使用 Windows,则可以使用 Windows Linux 子系统 (WSL) 快速完成工作。

如果您需要设置 WSL、GNU Arm 嵌入式工具链、qorck-sdk 和 tinyfpga 程序员的指南,您可以参考此视频:

 

PS : qorc-sdk 附带的envsetup.sh文件由于某种原因无法正常工作,所以我最终制作了一个不同的环境文件以使事情变得更容易一些。

#!/bin/bash
export INSTALL_DIR=/mnt/d/Projects/QuickLogic
export PATH="$INSTALL_DIR/quicklogic-arch-defs/bin:$INSTALL_DIR/quicklogic-arch-defs/bin/python:$PATH"
source "$INSTALL_DIR/conda/etc/profile.d/conda.sh"
conda activate
FLASH_PROGRAMMER_INSTALL_DIR=$INSTALL_DIR/TinyFPGA-Programmer-Application
alias qfprog="python3 $FLASH_PROGRAMMER_INSTALL_DIR/tinyfpga-programmer-gui.py"

您可以将其保存为 myenv.sh 并使用

source myenv.sh

当您想要设置环境时。[相应地更改安装路径]

该项目的工作流程可以总结如下:

  • 使用 qorc sdk 附带的简单数据流应用程序的修改版本来收集数据。
  • 使用 SensiML 数据捕获实验室收集数据并定义标签。
  • 使用 SensiML 分析工作室创建模型,以根据传感器数据识别特定事件。
  • 在 QuickFeather 上运行模型。

传感器直播和数据采集实验室

qorc-sdk 自带的 qf_ssi_ai_app 作为本项目的代码库。可以将现有的 Arduino 库与此代码集成,这意味着您可以轻松集成各种传感器。

对原始代码所做的更改如下:

  • 将 ADS1015 ADC 的源文件和头文件添加到 inc 和 src 目录中
  • 定义库所需的延迟函数以及字节和布尔数据类型
  • 在 sensor_ssss.cpp 文件中导入 ADS1015 库,并在 sensor_ssss_acquisition_buffer_ready 函数中进行必要的更改。
  • 编辑 sensor_ssss.cpp 文件中的 json_string_sensor_config json 描述符。
  • 在 sensor_ssss.cpp 文件中进行更改以启用数据直播和数据保存到 SD 卡。

以下视频解释了如何将新的 i2c 传感器与 quickfeather 集成:

 

如果您计划使用自定义传感器,则需要为 Data Capture Lab 创建一个 SSF 文件。可以在此处找到有关创建 SSF 文件的更多信息。[为本项目创建的SSF文件附后]

将生成的.bin 文件上传到 QuickFeather 后,它将开始通过 UART 传输数据[很高兴 QuickFeather 开发套件提供了一个 UART 到 USB 转换器。但是,由于我使用的是 SD 读卡器,因此在无法连接电缆的情况下,可以将数据保存到 SD 卡中]

可以从数据采集实验室查看传感器数据。

poYBAGNxigGAUGL9AAEWaXR2ssU530.png
图 6:数据采集实验室
 

在 POC 的这个阶段,考虑了四种不同的情景。

  • 事件 0:浊度 - 低 湍流 - 低
  • 事件 1:浊度 - 低 湍流 - 高
  • 事件 2:浊度 - 高 - 湍流 - 低
  • 事件 3:浊度 - 高 - 湍流 - 高

[高湍流通常意味着水流速度加快]

由于 Covid19 导致斯里兰卡目前处于封锁状态,我在从实际水体收集样本数据时遇到了困难。因此,大部分数据都是在家中使用受控环境获取的。

 
 
 
pYYBAGNxigSAJxTxAAMwqIdJPNg294.jpg
 
1 / 2图 7:收集数据
 

使用标签浏览器模式将片段和标签分配给捕获。

poYBAGNxigeAcN2EAAFVFUhOVis367.jpg
图 8 - 标签浏览器
 

分配标签后,捕获会自动上传到 SensiML 分析工作室。

在 Analytics Studio 中构建模型

生成模型的过程相当简单。

  • 在准备数据选项卡中,使用您的捕获创建一个新查询。确保标签正确显示。
  • 在构建模型选项卡中,选择您的查询和窗口大小。我使用的窗口大小为 100。
  • 模型构建成功后,您可以在不同的捕获上对其进行测试以检查其准确性。

分析工作室还允许您通过为您提供可视化和功能摘要等来探索创建的模型。

 
 
 
poYBAGNxigqAfAiIAAEkxCQsC-4805.png
 
1 / 8图 9 - 训练模型
 

一旦您对准确性感到满意,您就可以继续下载模型。

pYYBAGNxigyATfgIAADFOuAHv4M032.png
图 15 - 将知识包下载为库
 

下载的文件可以放在qf_ssi_ai_app/knowledgepack。下载的文件带有一个漂亮的脚本,可帮助您将所有文件复制到项目中。

注意类映射:1 是 event-0,2event- 1,3event- 2,4 是 event-3

复制知识包后,可以将SENSOR_SSSS_RECOG_ENABLED参数设置为 1,并且可以重新上传代码。

图 15 - 传感器准确预测事件 2,具有高浊度和低湍流:

pYYBAGNxig-AC7s4AACSu--YDPw138.png
图 15
 

图 16 - 当高浊度的水容器中引入少许湍流时,检测到事件 3:

poYBAGNxihOANypVAAC9BRd43tI935.jpg
图 16
 

未来的改进

  • 由于该 POC 中使用了低成本的浊度传感器,模拟读数的变化并不令人满意。这在事件 0 和 1 中特别观察到,其中检测的准确性相当低。需要使用更好的传感器或更好的放大威廉希尔官方网站 。
  • 由于只有很少的数据采集是针对实际水源进行的,因此现实世界的结果可能会有所不同。一旦解除锁定,就可以在实际水流上测试传感器。模型可能需要用新的捕获重新训练。
  • 由于事件检测需要与实际降雨模式进行比较,因此需要使用正确的时间戳将它们保存到 SD 卡上。需要更新 datasave.c 文件以使用连接到 quickfeather 板的外部 RTC。

结论

  • 将 Arduino 传感器库与 QuickFeather [稍作改动] 一起使用的能力开辟了一个充满可能性的世界。
  • SensiML 数据捕获实验室和分析工作室非常简单,我能够使用少量捕获生成一个相当准确的模型。这使您可以更多地关注预测结果及其影响。
  • 此 POC 的下一阶段将使用更灵敏的浊度传感器,以便可以增加检测到的组合(事件)的数量。
  • 在水体上测试传感器一段时间后,下一步是与该地区的实际降雨模式进行比较。这将深入了解河流的水质如何随着天气条件的变化而变化——即气候变化。
  • 放置在不同区域的这些传感器阵列将为处理厂的水工程师提供预测水质变化的能力。

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

评论(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:'浮动水质传感器开源分享',//标题 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);