作者:HelloGitHub- Anthony
这里是 HelloGitHub 推出的讲解开源硬件开发平台 Arduino 的系列教程。
上一篇文章,我们介绍了如何安装 Arduino 支持库、DHT 11 温湿度传感器以及 OLED 屏幕的使用,并用 Arduino 制作了一个小型温湿度显示器。
在这个讲究 万物互联的时代,让咱们的 Arduino 温湿度也去"云上"玩玩,有个学名叫物联网。
物联网(IoT) 是由物理对象组成的网络,这些物理对象嵌入了传感器、软件和其他技术,以便可以通过互联网与其他设备和系统建立连接并交换数据。
是不是瞬间感觉高大上了一些,但是不用担心本期的知识超纲,因为高深的我也不会!
今天我们讲解:如何把上一期做的温湿度设备上云,通过物联网平台完成 实时数据上传和 远程控制设备。实现将 Arduino 设备测量的温湿度数据上传到物联网平台,然后接收平台发送指令控制设备上 LED 灯光开关。
你是否已经开始摩拳擦掌了呢?下面我们开始"上云"!
一、实现联网功能
1.1 模块介绍
首先,如果想要 Arduino 连接到物联网平台的服务器,必然需要先让设备能够连接到网络(比如家里的 WiFi),这里我们就需要用到 ESP-01(s) 模块,来实现这个功能。
其使用方法和前文介绍过的组件类似,只需要用到 VCC(3.3v)、GND、TX、RX 四根线,就能和 Arduino 进行通信。我这里使用的是 ESP-01+转接板,转接板实现了 5v->3.3v
的变压以及 Rx
和 Tx
接口的引出,方便后续使用。
大多数 ESP-01(s) 模块在出厂时,都已经内置了 AT 指令固件,在使用时只需要向模块发送 AT 指令即可进行网络连接、数据传输等操作。
关于什么是 AT 指令,简单来讲就是设备间一种 通信消息规范,更具体的定义和应用场景读者可以自行了解。
1.2 模块使用
ESP-01 模块接线方式如下:
- GND -> GND
- VCC -> 3.3v(单独模块) 5.5v(带转接板)
- Tx -> Rx
- Rx -> TX
用到的 AT 指令如下:
- AT+RST:重置模块
- AT+CWMODE=1:切换模式
- AT+CWQAP:断开 WiFi 连接
- AT+CWJAP="WiFi名","密码":连接 WiFi
- AT+CIPSTART="TCP","IP",端口:连接服务器
- AT+CIPMODE=1:切换到 TCP 透传模式
- AT+CIPSEND:开始发送数据
1.3 代码
Arduino 连接 WiFi 的代码:
#include
boolean at_exec(char *data, char *keyword, unsigned long time_out)
{
Serial.println(data);
Serial.flush();
delay(100); // 等待响应
unsigned long start = millis();
while (Serial.available() < strlen(keyword))
{
if (millis() - start > time_out)
return false;
}
if (Serial.find(keyword))
return true;
else
return false;
while (Serial.available())
Serial.read(); //清空串口缓存
}
void setup()
{
Serial.begin(115200);
while (!at_exec("AT+RST", "OK", 1000));
while (!at_exec("AT+CWMODE=1", "OK", 1000));
while (!at_exec("AT+CWQAP", "OK", 1000));
while (!at_exec("AT+CWJAP=\"HelloGithub\",\"PassWord\"", "WIFI CONNECTED", 2000));
while (!at_exec("AT+CIPSTART=\"TCP\",\"183.230.40.40\",1811", "CONNECT", 1000));
while (!at_exec("AT+CIPMODE=1", "OK", 500));
while (!at_exec("AT+CIPSEND", "OK", 500));
//Serial.println("*产品ID#鉴权信息#脚本名称*"); // 下文会将如何获取这部分信息
}
注意:
- 下载之前要断开 Arduino 和 ESP-01 的连接,否则可能会下载失败
- 执行
AT+CIPSEND
后,模块将不再响应 AT 指令,如果需要修改配置则必须断电重启模块 - 记得改
AT+CWJAP
的参数,对应 WiFi 用户名和密码
烧录后,连接模块重启 Arduino。如果在路由器管理界面的"已连接设备"页面,看到我们的 WiFi 设备,则表示成功!
二、物联网平台
这里我们使用的是 OneNet 物联网平台,它是由中国移动打造的物联网 PaaS 开放平台,通过这个平台可以轻松(免费)实现设备"上云"。
下面,将介绍从注册开始到完成设备上云,所需的所有云端配置步骤。
2.1 注册
打开 OneNet 官网,点击右上角的"注册"注册账号。
2.2 新建产品
完成注册登录账号后,点击右上角的"控制台"进入控制页面。
进入后点击 "全部产品服务"->"多协议接入":
在"多协议接入界面"选择 TCP 透传->添加产品:
在弹出的侧边栏填写相关信息,"产品行业"和"类别"随便填写即可,最后点击"确定"完成新建产品。
2.3 添加设备
找到刚刚创建的产品我的是 "HelloGitHub",然后点击左侧栏的"设备列表",在新出现的页面中点击"添加设备",填写完相关信息最后点击"添加",完成增添设备的操作。
2.4 编写数据解析脚本
接下来,我们配置云端的数据解析脚本,不用自己动手写直接下载官方脚本到本地改一改就能用。
在解压下载好的文件夹中,找到 sample.lua
文件里的 device_timer_init
函数(第 303 行),改成如下内容:
function device_timer_init(dev)
-- 定时发送开关灯指令 --
dev:timeout(0)
dev:add(10,"open","open")
dev:add(12,"close","close")
end
找到 device_data_analyze
函数(在文件的最后),修改为如下内容:
function device_data_analyze(dev)
local t={}
local a=0
local s = dev:size()
-- 我们定义 一次发送 十个 字节,分别为 温度 湿度 --
add_val(t,"Temperature",a,dev:bytes(1,5))
add_val(t,"Humidity",a,dev:bytes(6,5))
dev:response()
dev:send("received")
return s,to_json(t)
end
如果大家对脚本使用方法感兴趣的话,可以查看代码的注释和官网上接入文档,这里就不做过多讲解了。
2.5 上传脚本
将该文件保存后,回到刚刚打开过的"设备列表"点击"上传解析脚本"。
至此,云端配置完毕。
2.6 连接物联网平台
修改 1.3 的代码,将 "下文会将如何获取这部分信息" 这行代码改成:
Serial.println("*产品ID#ILoveHelloGitHub#HG*");
将云端配置完成后,获得的 产品 ID、 鉴权信息、 脚本名称等参数,替换到对应位置。( *产品ID#鉴权信息#脚本名称*
)
最后,重新烧录代码并重启 ESP-01 模块。稍等片刻,在云端刷新"设备列表"页面,看到我们的设备,证明设备成功连接上了物联网平台。
三、Arduino 上云
经过前面的铺垫,我们"上云"的旅程即将迎来最激动人心的部分。 将设备所在环境的温湿度数据上传到云端!
3.1 代码
既然是上传温湿度数据,就需要用到我们上期讲的 DHT11 模块(温湿度传感器),然后结合本期连接网络的代码,分分钟就可以完成啦。
但是为了增加项目的趣味性,我额外添加了个解析物联网平台发送命令,远程控制开关 LED 的函数。
代码片段如下:
void setup()
{
// 改成自己云端的参数
Serial.println("*产品ID#ILoveHelloGitHub#HG*");
}
// 根据从串口收到的 字符串 执行相应的指令
bool command_parse(String command){
...
if (command == "open")
{
digitalWrite(LED_BUILTIN, HIGH);
} else if (command == "close")
{
digitalWrite(LED_BUILTIN, LOW);
}
}
完整代码:https://github.com/HelloGitHub-Team/Article/blob/master/contents/Other/Arduino/3/code.cpp
最后,修改完整代码中的 WiFi 名和密码,以及 产品 ID 后,重新烧录代码即可。
3.2 上传温湿度数据
稍等片刻后,查看物联网平台的"设备信息",如果看到 Arduino 上传的室内温湿度信息,就证明我们的代码运行成功啦。
3.3 远程控制
下面演示如何通过物联网平台,远程控制灯的开关。
打开物联网平台,点击"设备界面"的"下发指令",在弹出的表单上选择"字符串"选项,输入 "open" 或 "close" 指令。
到这里,就完成了远程控制 Arduino 内置 LED 灯开/关的效果!
成功!撒花🎉
四、总结
这篇文章,结合 Arduino、传感器、WiFi 以及 OneNet 物联网平台,通过边做边讲的方式,讲述了一个设备从联网到上云的完整过程。虽然是入门级的教程,但是这些知识已经可以帮助你完成,诸如智能开关、自动喂食器等实用和有趣的项目。
不小看每一次小的进步,不积跬步无以至千里。
如果说移动互联网的浪潮已经过去,那么下一个浪潮中会不会有 物联网的影子呢?反正我觉得技多不压身,对此你怎么看?欢迎在评论区发表你的看法。
至此,整个 Arduino 系列教程,到这里就结束了。完结!再次撒花🎉
希望,HelloGitHub 的 Arduino 系列教程,能够勾起你对物联网的兴趣,毕竟兴趣才是最好的好老师。
本期的内容就是这些,这里是 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。
感谢您的阅读,如果觉得内容还不错,一定要记得点赞、留言、分享,我们下期见!
Original: https://www.cnblogs.com/xueweihan/p/16407461.html
Author: 削微寒
Title: 物联网?快来看 Arduino 上云啦
相关阅读
Title: UnixBench算分介绍【转】
关于如何用UnixBench,介绍文章很多,这里就不展开了。这里重点描述下它是如何算分的。
碰到很多客户,装好后,直接./Run,就把结果跑出来了,然后还只取最后一个分值,比谁高谁低。
下面列一下4C8G的结果:
Benchmark Run: 一 <span class="hljs-number">6月 <span class="hljs-number">25 <span class="hljs-number">2018 <span class="hljs-number">20:<span class="hljs-number">54:<span class="hljs-number">19 - <span class="hljs-number">21:<span class="hljs-number">22:<span class="hljs-number">54
<span class="hljs-number">4 CPUs <span class="hljs-keyword">in system; running <span class="hljs-number">4 parallel copies of tests
Dhrystone <span class="hljs-number">2 using register variables <span class="hljs-number">114984418.6 lps (<span class="hljs-number">10.0 s, <span class="hljs-number">7 samples)
Double-Precision Whetstone <span class="hljs-number">16614.2 MWIPS (<span class="hljs-number">11.6 s, <span class="hljs-number">7 samples)
Execl Throughput <span class="hljs-number">13645.3 lps (<span class="hljs-number">30.0 s, <span class="hljs-number">2 samples)
File Copy <span class="hljs-number">1024 bufsize <span class="hljs-number">2000 maxblocks <span class="hljs-number">751698.4 KBps (<span class="hljs-number">30.0 s, <span class="hljs-number">2 samples)
File Copy <span class="hljs-number">256 bufsize <span class="hljs-number">500 maxblocks <span class="hljs-number">230211.7 KBps (<span class="hljs-number">30.0 s, <span class="hljs-number">2 samples)
File Copy <span class="hljs-number">4096 bufsize <span class="hljs-number">8000 maxblocks <span class="hljs-number">1964420.6 KBps (<span class="hljs-number">30.0 s, <span class="hljs-number">2 samples)
Pipe Throughput <span class="hljs-number">5999380.0 lps (<span class="hljs-number">10.0 s, <span class="hljs-number">7 samples)
Pipe-based Context Switching <span class="hljs-number">1095000.2 lps (<span class="hljs-number">10.0 s, <span class="hljs-number">7 samples)
Process Creation <span class="hljs-number">34454.9 lps (<span class="hljs-number">30.0 s, <span class="hljs-number">2 samples)
Shell Scripts (<span class="hljs-number">1 concurrent) <span class="hljs-number">18218.1 lpm (<span class="hljs-number">60.0 s, <span class="hljs-number">2 samples)
Shell Scripts (<span class="hljs-number">8 concurrent) <span class="hljs-number">2493.1 lpm (<span class="hljs-number">60.0 s, <span class="hljs-number">2 samples)
System Call Overhead <span class="hljs-number">5643267.3 lps (<span class="hljs-number">10.0 s, <span class="hljs-number">7 samples)
System Benchmarks Index Values BASELINE RESULT INDEX
Dhrystone <span class="hljs-number">2 using register variables <span class="hljs-number">116700.0 <span class="hljs-number">114984418.6 <span class="hljs-number">9853.0
Double-Precision Whetstone <span class="hljs-number">55.0 <span class="hljs-number">16614.2 <span class="hljs-number">3020.8
Execl Throughput <span class="hljs-number">43.0 <span class="hljs-number">13645.3 <span class="hljs-number">3173.3
File Copy <span class="hljs-number">1024 bufsize <span class="hljs-number">2000 maxblocks <span class="hljs-number">3960.0 <span class="hljs-number">751698.4 <span class="hljs-number">1898.2
File Copy <span class="hljs-number">256 bufsize <span class="hljs-number">500 maxblocks <span class="hljs-number">1655.0 <span class="hljs-number">230211.7 <span class="hljs-number">1391.0
File Copy <span class="hljs-number">4096 bufsize <span class="hljs-number">8000 maxblocks <span class="hljs-number">5800.0 <span class="hljs-number">1964420.6 <span class="hljs-number">3386.9
Pipe Throughput <span class="hljs-number">12440.0 <span class="hljs-number">5999380.0 <span class="hljs-number">4822.7
Pipe-based Context Switching <span class="hljs-number">4000.0 <span class="hljs-number">1095000.2 <span class="hljs-number">2737.5
Process Creation <span class="hljs-number">126.0 <span class="hljs-number">34454.9 <span class="hljs-number">2734.5
Shell Scripts (<span class="hljs-number">1 concurrent) <span class="hljs-number">42.4 <span class="hljs-number">18218.1 <span class="hljs-number">4296.7
Shell Scripts (<span class="hljs-number">8 concurrent) <span class="hljs-number">6.0 <span class="hljs-number">2493.1 <span class="hljs-number">4155.1
System Call Overhead <span class="hljs-number">15000.0 <span class="hljs-number">5643267.3 <span class="hljs-number">3762.2
========
System Benchmarks Index Score <span class="hljs-number">3357.0</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
很多人就拿了3357那个分数去比了,但是上面那个单进程结果1362.9也有意义,但凡接触了这么多案例,没人关心过。多进程结果就是根据系统CPU核数,同时起多个进程的结果;单进程就是只起一个进程的结果,对于系统性能来说,两个结果都是有意义的。
话说回来,./Run 到底执行了什么?默认执行的是Index模块,它包含下面几个小程序:
<span class="hljs-string">"dhry2reg", <span class="hljs-string">"whetstone-double", <span class="hljs-string">"execl",
<span class="hljs-string">"fstime", <span class="hljs-string">"fsbuffer", <span class="hljs-string">"fsdisk", <span class="hljs-string">"pipe", <span class="hljs-string">"context1", <span class="hljs-string">"spawn", <span class="hljs-string">"shell1", <span class="hljs-string">"shell8",<span class="hljs-string">"syscall"</span></span></span></span></span></span></span></span></span></span></span></span>
对应的就是上面的结果的各个结果对应的case了。
翻看了下它的源代码,它的执行参数如下:./Run 模块 -i 迭代次数 -c 进程并发数 -q/-v (输出方式。
- 模块:有时候你只想测某一个小程序的结果,那你可以修改自己去新增一个模块,修改测试内容,这对于调试是非常方便的,也可以直接指定某个执行程序。
- 迭代次数:关于迭代次数,不能想当然的就理解成这就是要执行的次数了,默认框架分为两种迭代模式,一种是短迭代次数,默认 3次,一种是 长迭代次数,默认10 次。那输入的迭代次数就是默认的长迭代次数,短迭代次数=(迭代次数+1)/3,如果结果小于就是1. 程序配置好了,该选择哪个迭代次数。
- 进程并发数:如果你想进程并发数不是系统CPU数,那就可以通过这个调整;
- 输出方式:是静默还是详细输出方式;
每个小程序在执行的时候都需要指定迭代模式和执行时间以及并发情况,所有的进程一次执行的结果都是统一模式。
下面是单进程的一个举例:
Process Creation -- <span class="hljs-number">1 copy
==> <span class="hljs-string">"/opt/unixbench/UnixBench/pgms/spawn" <span class="hljs-number">30 <span class="hljs-number">2>&<span class="hljs-number">1 >> <span class="hljs-string">"/opt/unixbench/UnixBench/results/VM_0_13_centos-2018-06-25-05.log"
</span></span></span></span></span></span>
其中COUNT0,COUNT1,COUNT2是这么算出来的,每个进程的结果如:
COUNT|<span class="hljs-type">x|<span class="hljs-type">y|<span class="hljs-type">x</span></span></span>
经过解析,变成如下:
COU<span class="hljs-symbol">NT0 = x
COU<span class="hljs-symbol">NT1 = y
COU<span class="hljs-symbol">NT2 = z</span></span></span>
算分过程如下:
那如果并发执行多个呢?举例如下:
Shell Scripts (<span class="hljs-number">1 concurrent) -- <span class="hljs-number">4 copies
==> <span class="hljs-string">"/opt/unixbench/UnixBench/pgms/looper" <span class="hljs-number">60 <span class="hljs-string">"/opt/unixbench/UnixBench/pgms/multi.sh" <span class="hljs-number">1 <span class="hljs-number">2>&<span class="hljs-number">1 >> <span class="hljs-string">"/opt/unixbench/UnixBench/results/VM_0_13_centos-2018-06-25-05.log"
</span></span></span></span></span></span></span></span></span>
算分过程如下:
那文章开头多进程的图例分数举例:
综上对UnixBench的分数计算算是全面介绍了一边,附件有excel证明计算过程。
Original: https://www.cnblogs.com/sky-heaven/p/16426894.html
Author: sky-heaven
Title: UnixBench算分介绍【转】