×

oneM2M电位器/按钮/LCD与NodeMCU (ESP8266)

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

张磊

分享资料个

描述

1.高层架构

pYYBAGNxjUCAFY-8AADaeKHZ4z4209.png
 

2.先决条件

运行此演示需要以下工具。

  • 所选 oneM2M 平台的运行时环境(参见第 3 节):
    - Java 运行时环境 (JRE >= 1.8),如果你使用Eclipse OM2M
    -
    Python 3 环境,如果你使用ACME
    - NodeJS 环境,如果你使用KETI Mobius
  • Arduino IDE 1.8.9(或更高版本)
  • 您最喜欢的用于开发 IoT 应用程序的 IDE
  • 物联网应用程序的Node.js 环境Python 环境
  • 邮递员(可选)

3.下载项目

从主存储库下载必要的资源:

https://github.com/oneM2M-教程

该存储库包括不同的项目:

  • oneM2M-IoT-Device : NodeMCU Sketch(es)
  • oneM2M-IoT-Application :用 Node.js 和 Python 编写的物联网应用程序
  • oneM2M-IoT-Device-Simulator :用于模拟各种物联网传感器和执行器的 Node.js 程序

您还需要实现 oneM2M 平台。存在不同的平台,我们可以引用一些:

  • Eclipse OM2M :Java 中的开源实现(链接
  • ACME :Python 中的开源实现(链接
  • KETI Mobius :Node.js 中的开源实现(链接

对于本教程,将使用ACME实现。平台的安装、配置和运行请参考官方文档。

https://github.com/ankraft/ACME-oneM2M-CSE

4.启动oneM2M兼容的物联网平台

4.1。配置 IoT 平台 (ACME)

默认配置可用于本地演示。物联网平台将监听 8080 端口。每次重启后数据库都会重置。

如果需要,您可以通过编辑文件来更改物联网平台的配置:acme.ini ”。

4.2. 启动 IoTPlatform (ACME)

物联网平台可以通过以下方式启动:

python3 acme.py

您应该在日志末尾看到“CSE 已启动”。

4.3. 登录 ACME 网页界面

在浏览器中打开以下 URL 访问 ACME IoT 平台网页界面:http: //127.0.0.1 :8080/

poYBAGNxjUKANJTJAAAe1SM5sNg023.png
 

使用默认配置,输入发起人“ CAdmin” ,然后输入“ Connect

然后您将能够看到 oneM2M 资源树:

pYYBAGNxjUSAN69oAABlwkpL98w379.png
 

5. 连接您的物联网设备

NodeMCU 源代码位于“oneM2M-IoT-Device”文件夹中。

5.1。原理图

使用以下组件将电位器、4 位显示器、按钮、LCD 显示器连接到 NodeMCU 板:

  • 面包板
  • NodeMCU板
  • 电位器
  • 按钮
  • 4 位 7 段显示器 (TM1637)
  • 液晶显示器 (2x16)
poYBAGNxjUeAeINZAAGiXmdmkZE991.png
 

5.2. 为 NodeMCU 开发设置 Arduino IDE

如果尚未安装,请从以下链接下载并安装 Arduino ID

注意:我们不建议在此演示中使用 Arduino Web 编辑器,因为不支持 NodeMCU 板。

插入时,如果未检测到 NodeMCU 端口,则需要使用以下链接手动下载并安装 USB 驱动程序:https ://github.com/nodemcu/nodemcu-devkit/tree/master/Drivers

5.3. 为 Arduino IDE 添加 NodeMCU 板支持

首先,打开 Arduino IDE,转到“文件”>“首选项”条目。

在“其他板管理器 URL”文本框中复制以下 URL :

pYYBAGNxjUmAanmoAAA9oyLKnFM386.png
 

单击“确定”关闭“首选项”对话框。

完成上述步骤后,进入“工具”>“Board:...” ,然后选择“Board Manager”

pYYBAGNxjO6ASnWsAAB7mEamYSo463.png
 

输入文本框“esp8266” ,然后导航到“esp8266 by esp8266 community”并“安装”Arduino 软件。

pYYBAGNxjU-AM83WAAA3o3LZW-g630.png
 

转到“工具”>“板...” ,然后选择“NodeMCU 1.0”板。

完成上述所有过程后,您就可以使用 Arduino IDE 对 NodeMCU 板进行编程了。

5.5. 配置 NodeMCU 草图

在您的 Arduino IDE 中打开草图“ NodeMCU_PotentiometerSensor-DisplayActuator.ino ”。

设置你的WIFI参数

  • char* WIFI_SSID = "FILL_THE_WIFI_SSID";
  • char* WIFI_PSWD = "FILL_THE_WIFI_PSWD";

在您的网络中设置 ACME IoT 平台的 IP 地址:

  • String CSE_IP = "X.X.X.X";

5.6. 编译 NodeMCU 草图

单击验证按钮以编译草图。

poYBAGNxjVGAHb8zAAAC4Izm5Rk201.png
 

编译输出:

pYYBAGNxjPSAVZiTAAAgqEmOl-w962.png
 

5.7. 将草图上传到NodeMU 板

单击上传按钮将草图上传到 NodeMCU 板。

pYYBAGNxjVaAbxIgAAAC45AZZ4Y023.png
 

上传输出:

pYYBAGNxjPiABXw1AAAtwSd7TuA077.png
 

5.8. 使用串行监视器调试代码执行

单击按钮打开 Arduino 串行监视器以显示 NodeMCU 控制台。

poYBAGNxjVqAK7dYAAAF0n7TVOo475.png
 

然后在打开串行监视器后从下拉列表中选择 115200。

5.9. 在 ACME Web 界面上查看 IoT 设备资源

您应该会看到“PotentiometerSensor”应用实体资源,其中包含在 oneM2M Web 界面上创建的“DESCRIPTOR”和“DATA”容器。

您还应该看到在 oneM2M Web 界面上创建的带有“DESCRIPTOR”、“DATA”和“COMMAND”容器的“DisplayActuator”应用程序实体资源。

pYYBAGNxjV2ACVARAAF44Y00td8154.png
 

6. 连接您的 IoT 应用程序

电位器监控和显示管理应用源码以NodeJS和Python提供。文件夹中提供了源代码:

  • "oneM2M-IoT-Application/nodejs/onem2m-monitor.js"
  • "oneM2M-IoT-Application/python/onem2m-monitor.py"

6.1。配置应用程序

您可以使用提供的两个应用程序之一:NodeJSPython

6.1。选项 A = NodeJS IoT 应用程序

使用您喜欢的文本编辑器打开文件nodejs / config/default.json 。并编辑必要的配置参数。

设置 ACME 平台的 IP 地址(变量“ monitorIP ”)。如果您在同一台计算机上运行 ACME 平台和应用程序,则可以保留 localhost (127.0.0.1)。

6.1。选项 B = Python IoT 应用程序

使用您喜欢的文本编辑器打开文件python/default.json 。并编辑必要的配置参数。

设置oneM2M平台的IP地址(变量“monitorIP )。如果您在同一台机器上运行 oneM2M 平台和应用程序,则可以保留 localhost (127.0.0.1)。

6.2. 启动应用程序

6.2. 选项 A = NodeJS IoT 应用程序

在终端上,使用npm工具安装以下 Node.js 模块(安装 Node.js 时默认安装):

> npm install express
> npm install request
> npm install body-parser
> npm install request
> npm install yargs
> npm install config

使用以下命令启动 Node.js oneM2M IoT 应用程序:

> node onem2m-monitor.js -s Potentiometer -a Display

6.2. 选项 B = Python IoT 应用程序

在终端上,使用pip工具安装以下 Python 模块(可以在安装 Python 时安装):

> pip install requests
> pip install flask

使用以下命令启动 Python oneM2M IoT 应用程序:

> python onem2m-monitor.py -s Potentiometer -a Display

6.3. 在 ACME Web 界面上查看 IoT 应用程序资源

您应该会看到Monitor在 oneM2M Web 界面上创建的“ ”应用程序实体 (AE) 资源。还要检查下订阅资源的创建PotentiometerSensor/DATA

pYYBAGNxjV-AfiDrAAF_StiMUZw330.png
 

7. 示范

当您改变电位器的位置时,它的值会直接复制到 4 位显示器上。

当您按下按钮时,电位器的值会通过 WiFi 发送到远程 CSE。然后将该值通知给监控应用程序。

根据接收到的值,监视器应用程序将通过 CSE 向 LCD 屏幕发送特定消息。

如果该值低于 512 (分别高于 512 ),则监视器应用程序将发送“Value is LOW” (分别为“Value is HIGH” )以显示在 LCD 屏幕上。

 
 
 
pYYBAGNxjWSAC1hgAAajmSw68uo180.jpg
 
1 / 3
 
poYBAGNxjWeAJypzAACS8KeyhdY742.jpg
 

8. 更进一步

如果您有第二个 NodeMCU,您可以将传感器和执行器拆分到两个 NodeMCU 设备上。

8.1 架构

poYBAGNxjWmAVbIGAAEdXxqOcLA712.png
 

8.2 原理图

pYYBAGNxjW2AI5foAAIQQmVaaY8820.png
 

8.3 NodeMCU 草图

您可以在文件夹中找到拆分为两个新草图的原始草图代码:

"oneM2M-IoT-Device/PotentiometerSensor_DisplayActuator"

NodeMCU 1(仅限传感器)

  • "PotentiometerSensor/PotentiometerSensor.ino"

NodeMCU 2(仅限执行器)

  • "DisplayActuator/DisplayActuator.ino"

8.4 物联网应用

感谢 oneM2M 标准,您可以使用相同的 IoT 应用程序而无需进行任何更改 :-)


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

评论(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:'oneM2M电位器/按钮/LCD与NodeMCU (ESP8266)',//标题 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);