×

喂机器开源硬件

消耗积分:2 | 格式:zip | 大小:0.28 MB | 2023-01-30

贾大林

分享资料个

描述

所以你想构建一个很酷的 -AI-ML 东西,但你没有整天坐下来为你的模型制作数据样本。好吧,自动化那件事我的朋友。

我这样做是为了在 Edge Impulse 中为我的模型获取更好的数据。我将它连接到Github 存储库中的示例代码的温度传感器,但这只是一个示例,EdgeImpulse.py 模块可以在您的项目中单独使用您的传感器。

获取代码

在新目录中删除此命令:

git clone https://github.com/cameronbunce/ESP32-Edge-Impulse.git

边缘脉冲

您需要在 上创建一个Edge Impulse 帐户并为初学者克隆我的项目(或者如果您已经熟悉 Edge Impulse,可以随意创建自己的项目)。对于您自己的项目,您将获得自己的 API 密钥。从项目主页单击顶部的键。单击右侧的“添加新的 API 密钥”。给它起一个傻乎乎的名字,然后选择“Ingestion”的角色,点击“Create”并复制这个key。将此密钥粘贴到您本地的 secret_stub.py 副本中并将其另存为 secret.py,然后返回 API 密钥下方的 HMAC 密钥的 API 页面。这也包含在您制作的新秘密文件中,它用于签署您上传到 API 的文件。

poYBAGPXHmWAQNs4AADMtVbrWr4649.png

硬件设置

从通用的 ESP32 开始,如果您愿意,可以使用面包板、穿孔板或定制 PCB。将 DS18B20 传感器连接到 Vcc 和 Gnd,并使用 4.7k 欧姆上拉电阻将数据连接到 ESP32 引脚 2。您可以更改它,但此处的代码中使用了 Pin 2。我们将在下面查看您可以更改的位置。

软件设置

我为最新的 Pip3 版本更新了 Python3,并下载了 esptool.py 和 adafruit-ampy。如果您没有类似的东西,您可能还需要 Thonny 或 Mu。

pip3 install esptool pip3 install adafruit-ampy

我正在使用来自https://micropython.org/download/esp32/的每晚构建的 MicroPython,因为它有一个内置的包管理器,我们将使用它。我在此使用的文件是 esp32-20221220-unstable-v1.19.1-782-g699477d12.bin 但可能有更新的文件可用。

我们首先清理威廉希尔官方网站 板,我的 Mac 将我的设备称为 tty.usbserial-0001,但你的可能会有所不同。通过终端使用 `ls /dev | 检查这个 grep tty` 在连接你的开发板之前和之后。

 

esptool.py --chip esp32 -p /dev/tty.usbserial-0001 erase_flash

 

然后我们将 MicroPython 的固件写入设备。

 

esptool.py --chip esp32 -p /dev/tty.usbserial-0001 --baud 460800 write_flash -z 0x1000 esp32-20221220-unstable-v1.19.1-782-g699477d12.bin

 

现在我们需要上网。您可以将所有命令都输入到 Mu REPL 窗口中,这是一种很好的学习方式,但我们可以在这里做一件事,让我们的未来更轻松。如果您在上面开始填写您的 secret.py 文件,那么您现在要填写其余部分。否则,现在我们需要一个名为 secret.py 的文件中的 ssid 和密码部分并加载到 ESP32 上。所以制作你的 secret.py 文件并至少填写:

 

ssid = "MySSID" password = "Sup3r5ecr3tP4ssword"

 

并使用 ampy 将该文件提交给董事会

 

ampy -p /dev/tty.usbserial-0001 put /path/to/secret.py

 

现在在 Mu 中,您可以将以下内容粘贴到选项卡中,打开 REPL,然后按运行。您的 ESP32 将使用存储在秘密文件中的 SSID 和密码连接到您的家庭网络,然后它将使用该连接使用 mip(它是 pip 的 Micropython 版本)下拉 HMAC 库。HMAC 是我们将用来对上传到 Edge Impulse 的消息进行签名的库。

 

import network, mip, secret wlan = network.WLAN(network.STA_IF) wlan.active(True) if not wlan.isconnected(): wlan.connect(secret.ssid, secret.password) while not wlan.isconnected(): pass mip.install('hmac')

 

使用完整的 secret.py 文件,并将 DS18B20 传感器连接到 Pin 2,EdgeImpluse_DS18B20_example.py在 Tests and Examples 文件夹中查看。在第 16 行,我们看到以下内容。

 

import json, time, hmac, hashlib import ubinascii, network, ds18x20, onewire, secret import urequests as requests from machine import Pin, WDT debug = True SensorPin = 2 # a DS18B20 attached on pin 2

 

如果您使用了不同的引脚,您可以将 SensorPin 连接到您使用的引脚。调试消息将打印到串行接口,因此您可以观察以这种方式上传的任何问题。有了那个集合,我们将把它放在板上,但将它重命名为main.py以便板子运行。

 

ampy -p /dev/tty.usbserial-0001 put EdgeImpluse_DS18B20_example.py main.py

 

完成后(`ampy...put...` 对我来说需要大约 16 秒),您可以在 Mu 中打开 REPL 并观察出现的调试消息。一个样本是10个读数,间隔10秒,上传也需要一点时间,所以程序运行一个周期在2分钟左右。它不循环。

如果您的上传没有出现错误,并且数据显示在 Edge Impulse 中,那么您就可以开始使用存储库的主目录了。

LongRunning.py在 ESP32 上使用深度睡眠来节省电池电量,并在需要时间隔一整天读取读数。让我们看看在哪里可以找到这些时期的控件。

 

interval = 600000 # 10 minutes SensorPin = 2 ReadingBatch = 145 # 24 hours of readings with interval = 10 minutes being 144

 

SensorPin跟以前一样,就是没有debug?我们将任何重要消息写入 ESP32 上的闪存。当我们将处理器置于深度睡眠状态时,我们必须确保我们需要的任何信息都在闪存中,因此传感器读数和消息(“未找到 SSID”或来自 API 的任何非 200 响应)在写入文件之前我们去睡觉。它们巧妙地称为message.txt和values.json并且应该允许我们上传数据,即使我们在现场用完电池或拉电。

 

ampy -p /dev/tty.usbserial-0001 put DS18B20Reader.py ampy -p /dev/tty.usbserial-0001 put EdgeImpulse.py ampy -p /dev/tty.usbserial-0001 put LongRunning.py main.py

 

请注意:深度睡眠中的 ESP32 设备确实没有响应。

如果你需要中断程序来恢复它,你会想要阻止它返回到main.py ,所以将以下代码放在 Mu 或 Thonny 中并重新启动设备。按 Control-C 跳转到 REPL,然后运行:

 

import os os.remove("main.py")

 

然后您可以检查消息并查看正在发生的情况并根据需要进行更新。DevLog.md文件中提供了其他故障排除和我到目前为止的整个过程。

您现在拥有一台自动数据馈送机来构建更好的 ML 模型。发挥你的力量,成就非凡。

 

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

评论(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);