Skip to content

Commit 9be20b2

Browse files
committed
finish arduino 3
1 parent 97be358 commit 9be20b2

33 files changed

+375
-341
lines changed

Diff for: README.md

+3-2
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,9 @@
8585
1. [开源的 Web 框架哪个快?我在 GitHub 找到了答案](contents/Other/web-frameworks/content.md)
8686
2. [这款打怪升级的像素小游戏,7 年前在 GitHub 社区出生,如今在谷歌商店有 8 万人给了满分](contents/Other/shattered-pixel-dungeon/content.md)
8787
3. [想做钢铁侠?听说很多大佬都是用它入门的](contents/Other/Arduino/)
88-
- [Arduino 第一篇](contents/Other/Arduino/1/content.md)
89-
- [Arduino 第二篇](contents/Other/Arduino/2/content.md)
88+
- [Arduino 第一篇](contents/Other/Arduino/1/content.md)
89+
- [Arduino 第二篇](contents/Other/Arduino/2/content.md)
90+
- [Arduino 第三篇](contents/Other/Arduino/3/content.md)
9091

9192
## 贡献者
9293

Diff for: contents/Other/Arduino/3/code.cpp

+90
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
#include <Arduino.h>
2+
#include "DHT.h"
3+
4+
// DHT11 DATA 引脚连接的数字引脚编号
5+
#define DHT_DATA_PIN 8
6+
#define UPDATE_INTERVAL 10*1000
7+
DHT dht11(DHT_DATA_PIN, DHT11, 1);
8+
float t, h;
9+
unsigned long start;
10+
11+
String get_data()
12+
{
13+
char c[100];
14+
15+
h = dht11.readHumidity();
16+
t = dht11.readTemperature();
17+
// sprintf 在 Arduino 中无法转换浮点数
18+
dtostrf(t, 2, 2, c);
19+
dtostrf(h, 2, 2, c+5);
20+
return String(c);
21+
}
22+
23+
boolean at_exec(char *data, char *keyword, unsigned long time_out)
24+
{
25+
Serial.println(data);
26+
Serial.flush();
27+
delay(100); // 等待响应
28+
unsigned long start = millis();
29+
30+
while (Serial.available() < strlen(keyword))
31+
{
32+
if (millis() - start > time_out)
33+
return false;
34+
}
35+
if (Serial.find(keyword))
36+
return true;
37+
else
38+
return false;
39+
40+
while (Serial.available())
41+
Serial.read(); //清空串口缓存
42+
}
43+
void setup()
44+
{
45+
Serial.begin(115200);
46+
dht11.begin();
47+
pinMode(LED_BUILTIN, OUTPUT);
48+
while (!at_exec("AT+RST", "OK", 1000));
49+
while (!at_exec("AT+CWMODE=1", "OK", 1000));
50+
while (!at_exec("AT+CWQAP", "OK", 1000));
51+
while (!at_exec("AT+CWJAP=\"HelloGithub\",\"PassWord\"", "WIFI CONNECTED", 2000));
52+
while (!at_exec("AT+CIPSTART=\"TCP\",\"183.230.40.40\",1811", "CONNECT", 1000));
53+
while (!at_exec("AT+CIPMODE=1", "OK", 500));
54+
while (!at_exec("AT+CIPSEND", "OK", 500));
55+
Serial.println("*产品ID#ILoveHelloGitHub#HG*");
56+
start = millis();
57+
}
58+
59+
// 根据从串口收到的 字符串 执行相应的指令
60+
bool command_parse(String command){
61+
command.trim();
62+
command.toLowerCase();
63+
if (command == "open")
64+
{
65+
digitalWrite(LED_BUILTIN, HIGH);
66+
}else if (command == "close")
67+
{
68+
digitalWrite(LED_BUILTIN, LOW);
69+
}
70+
else if (command == "received");
71+
}
72+
73+
void loop()
74+
{
75+
// 定时上报消息
76+
if (millis() - start > UPDATE_INTERVAL)
77+
{
78+
String data = get_data();
79+
Serial.println(data);
80+
start = millis();
81+
}
82+
// 收到消息进行解析
83+
if (Serial.available()){
84+
delay(10); // 等待全部数据接收完毕
85+
command_parse(Serial.readString());
86+
while (Serial.available())
87+
Serial.read(); //清空串口缓存
88+
}
89+
90+
}

Diff for: contents/Other/Arduino/3/content.md

+282
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,282 @@
1+
# 物联网?快来看 Arduino 上云啦!
2+
3+
![](images/cover.jpeg)
4+
5+
作者:HelloGitHub-**Anthony**
6+
7+
这里是 HelloGitHub 推出的讲解开源硬件开发平台 **Arduino** 的系列教程。
8+
9+
- [第一篇:Arduino 介绍和开发环境搭建](https://mp.weixin.qq.com/s/VcJv_n9QgcIW4fQJy73R1w)
10+
- [第二篇:制作温湿度显示器](https://mp.weixin.qq.com/s/4DCZbG50NEXOyE15rSa3XQ)
11+
12+
上一篇文章,我们介绍了如何安装 Arduino 支持库、DHT 11 温湿度传感器以及 OLED 屏幕的使用,并用 Arduino 制作了一个小型温湿度显示器。
13+
14+
在这个讲究**万物互联**的时代,也让咱们的 Arduino 温湿度去“云上”玩玩,有个学名叫物联网。
15+
16+
> 物联网(IoT) 是由物理对象组成的网络,这些物理对象嵌入了传感器、软件和其他技术,以便可以通过互联网与其他设备和系统建立连接并交换数据。
17+
18+
是不是瞬间感觉高大上了一些,但是不用担心本期的知识超纲,因为高深的我也不会!
19+
20+
今天我们讲解:如何把上一期做的温湿度设备上云,通过物联网平台完成**实时数据上传****远程控制设备**。实现将 Arduino 设备测量的温湿度数据上传到物联网平台,然后接收平台发送指令控制设备上 LED 灯光开关。
21+
22+
你是否已经开始摩拳擦掌了呢?下面我们开始“上云”!
23+
24+
## 一、实现联网功能
25+
26+
### 1.1 模块介绍
27+
28+
首先,如果想要 Arduino 连接到物联网平台的服务器,必然需要先让设备能够连接到网络(比如家里的 WiFi),这里我们就需要用到 **ESP-01(s)** 模块,来实现这个功能。
29+
30+
其使用方法和前文介绍过的组件类似,只需要用到 VCC(3.3v)、GND、TX、RX 四根线,就能和 Arduino 进行通信。我这里使用的是 ESP-01+转接板,转接板实现了 `5v->3.3v` 的变压以及 `Rx``Tx` 接口的引出,方便后续使用。
31+
32+
![](images/1.png)
33+
34+
大多数 ESP-01(s) 模块在出厂时,都已经内置了 **AT** 指令固件,在使用时只需要向模块发送 AT 指令即可进行网络连接、数据传输等操作。
35+
36+
> 关于什么是 AT 指令,简单来讲就是设备间一种**通信消息规范**,更具体的定义和应用场景读者可以自行了解。
37+
38+
### 1.2 模块使用
39+
40+
ESP-01 模块接线方式如下:
41+
42+
- GND -> GND
43+
- VCC -> 3.3v(单独模块) 5.5v(带转接板)
44+
- Tx -> Rx
45+
- Rx -> TX
46+
47+
用到的 AT 指令如下:
48+
49+
- AT+RST:重置模块
50+
- AT+CWMODE=1:切换模式
51+
- AT+CWQAP:断开 WiFi 连接
52+
- AT+CWJAP="WiFi名","密码":连接 WiFi
53+
- AT+CIPSTART="TCP","IP",端口:连接服务器
54+
- AT+CIPMODE=1:切换到 TCP 透传模式
55+
- AT+CIPSEND:开始发送数据
56+
57+
### 1.3 代码
58+
59+
Arduino 连接 WiFi 的代码:
60+
61+
```c
62+
#include <Arduino.h>
63+
64+
boolean at_exec(char *data, char *keyword, unsigned long time_out)
65+
{
66+
Serial.println(data);
67+
Serial.flush();
68+
delay(100); // 等待响应
69+
unsigned long start = millis();
70+
71+
while (Serial.available() < strlen(keyword))
72+
{
73+
if (millis() - start > time_out)
74+
return false;
75+
}
76+
if (Serial.find(keyword))
77+
return true;
78+
else
79+
return false;
80+
81+
while (Serial.available())
82+
Serial.read(); //清空串口缓存
83+
}
84+
85+
void setup()
86+
{
87+
Serial.begin(115200);
88+
while (!at_exec("AT+RST", "OK", 1000));
89+
while (!at_exec("AT+CWMODE=1", "OK", 1000));
90+
while (!at_exec("AT+CWQAP", "OK", 1000));
91+
while (!at_exec("AT+CWJAP=\"HelloGithub\",\"PassWord\"", "WIFI CONNECTED", 2000));
92+
while (!at_exec("AT+CIPSTART=\"TCP\",\"183.230.40.40\",1811", "CONNECT", 1000));
93+
while (!at_exec("AT+CIPMODE=1", "OK", 500));
94+
while (!at_exec("AT+CIPSEND", "OK", 500));
95+
//Serial.println("*产品ID#鉴权信息#脚本名称*"); // 下文会将如何获取这部分信息
96+
}
97+
```
98+
99+
**注意:**
100+
101+
- 下载之前要断开 Arduino 和 ESP-01 的连接,否则可能会下载失败
102+
- 执行 `AT+CIPSEND` 后,模块将不再响应 AT 指令,如果需要修改配置则必须断电重启模块
103+
- 记得改 `AT+CWJAP` 的参数,对应 WiFi 用户名和密码
104+
105+
烧录后,连接模块重启 Arduino。如果在路由器管理界面的“已连接设备”页面,看到我们的 WiFi 设备,则表示成功!
106+
107+
![](images/2.png)
108+
109+
110+
## 二、物联网平台
111+
112+
这里我们使用的是 OneNet 物联网平台,它是由中国移动打造的物联网 PaaS 开放平台,通过这个平台可以轻松(免费)实现设备”上云“。
113+
114+
![](images/3.png)
115+
116+
下面,将介绍从注册开始到完成设备上云,所需的所有云端配置步骤。
117+
118+
### 2.1 注册
119+
120+
打开 [OneNet 官网](https://open.iot.10086.cn/),点击右上角的“注册”注册账号。
121+
122+
![](images/4.png)
123+
124+
### 2.2 新建产品
125+
126+
完成注册登录账号后,点击右上角的“控制台”进入控制页面。
127+
128+
进入后点击 “全部产品服务”->“多协议接入”:
129+
130+
![](images/5.png)
131+
132+
在“多协议接入界面”选择 TCP 透传->添加产品:
133+
134+
![](images/6.png)
135+
136+
在弹出的侧边栏填写相关信息,“产品行业”和“类别”随便填写即可,最后点击“确定”完成新建产品。
137+
138+
![](images/7.png)
139+
140+
141+
### 2.3 添加设备
142+
143+
找到刚刚创建的产品我的是 “HelloGitHub”,然后点击左侧栏的“设备列表”,在新出现的页面中点击“添加设备”,填写完相关信息最后点击“添加”,完成增添设备的操作。
144+
145+
![](images/8.png)
146+
147+
### 2.4 编写数据解析脚本
148+
149+
接下来,我们配置云端的数据解析脚本,不用自己动手写直接下载[官方脚本](https://open.iot.10086.cn/doc/v5/develop/detail/495)到本地改一改就能用。
150+
151+
![](images/9.png)
152+
153+
在解压下载好的文件夹中,找到 `sample.lua` 文件里的 `device_timer_init` 函数(第 303 行),改成如下内容:
154+
155+
```lua
156+
function device_timer_init(dev)
157+
-- 定时发送开关灯指令 --
158+
dev:timeout(0)
159+
dev:add(10,"open","open")
160+
dev:add(12,"close","close")
161+
end
162+
```
163+
164+
找到 `device_data_analyze` 函数(在文件的最后),修改为如下内容:
165+
166+
```lua
167+
function device_data_analyze(dev)
168+
local t={}
169+
local a=0
170+
local s = dev:size()
171+
-- 我们定义 一次发送 十个 字节,分别为 温度 湿度 --
172+
add_val(t,"Temperature",a,dev:bytes(1,5))
173+
add_val(t,"Humidity",a,dev:bytes(6,5))
174+
dev:response()
175+
dev:send("received")
176+
return s,to_json(t)
177+
end
178+
```
179+
180+
如果大家对脚本使用方法感兴趣的话,可以查看代码的注释和官网上接入文档,这里就不做过多讲解了。
181+
182+
### 2.5 上传脚本
183+
184+
将该文件保存后,回到刚刚打开过的“设备列表”点击“上传解析脚本”。
185+
186+
![](images/10.png)
187+
188+
![](images/11.png)
189+
190+
至此,云端配置完毕。
191+
192+
193+
### 2.6 连接物联网平台
194+
195+
修改 1.3 的代码,将 **“下文会将如何获取这部分信息”** 这行代码改成:
196+
197+
```
198+
Serial.println("*产品ID#ILoveHelloGitHub#HG*");
199+
```
200+
201+
将云端配置完成后,获得的**产品 ID****鉴权信息****脚本名称**等参数,替换到对应位置。(`*产品ID#鉴权信息#脚本名称*`
202+
203+
最后,重新烧录代码并重启 ESP-01 模块。稍等片刻,在云端刷新“设备列表”页面,看到我们的设备,证明设备成功连接上了物联网平台。
204+
205+
![](images/12.png)
206+
207+
208+
## 三、Arduino 上云
209+
210+
经过前面的铺垫,我们“上云”的旅程即将迎来最激动人心的部分。**将设备所在环境的温湿度数据上传到云端!**
211+
212+
### 3.1 代码
213+
214+
既然是上传温湿度数据,就需要用到我们[上期](https://mp.weixin.qq.com/s/4DCZbG50NEXOyE15rSa3XQ)讲的 DHT11 模块(温湿度传感器),然后结合本期连接网络的代码,分分钟就可以完成啦。
215+
216+
但是为了增加项目的趣味性,我额外添加了个解析物联网平台发送命令,远程控制开关 LED 的函数。
217+
218+
代码片段如下:
219+
220+
```c++
221+
void setup()
222+
{
223+
// 改成自己云端的参数
224+
Serial.println("*产品ID#ILoveHelloGitHub#HG*");
225+
}
226+
227+
// 根据从串口收到的 字符串 执行相应的指令
228+
bool command_parse(String command){
229+
...
230+
if (command == "open")
231+
{
232+
digitalWrite(LED_BUILTIN, HIGH);
233+
} else if (command == "close")
234+
{
235+
digitalWrite(LED_BUILTIN, LOW);
236+
}
237+
}
238+
```
239+
240+
> 完整代码:https://github.com/HelloGitHub-Team/Article/blob/master/contents/Other/Arduino/3/code.cpp
241+
242+
最后,修改完整代码中的 **WiFi 名和密码**,以及 **产品 ID** 后,重新烧录代码即可。
243+
244+
245+
### 3.2 上传温湿度数据
246+
247+
稍等片刻后,查看物联网平台的“设备信息”,如果看到 Arduino 上传的室内温湿度信息,就证明我们的代码运行成功啦。
248+
249+
![](images/13.png)
250+
251+
252+
### 3.3 远程控制
253+
254+
下面演示如何通过物联网平台,远程控制灯的开关。
255+
256+
打开物联网平台,点击“设备界面”的“下发指令”,在弹出的表单上选择“字符串”选项,输入 “open” 或 “close” 指令。
257+
258+
![](images/14.png)
259+
260+
到这里,就完成了远程控制 Arduino 内置 LED 灯开/关的效果!
261+
262+
![](images/15.png)
263+
264+
成功!撒花🎉
265+
266+
## 四、总结
267+
268+
这篇文章,结合 Arduino、传感器、WiFi 以及 OneNet 物联网平台,通过边做边讲的方式,讲述了一个设备从联网到上云的完整过程。虽然是入门级的教程,但是这些知识已经可以帮助你完成,诸如智能开关、自动喂食器等实用和有趣的项目。
269+
270+
不小看每一次小的进步,不积跬步无以至千里。
271+
272+
如果说移动互联网的浪潮已经过去,那么下一个浪潮中会不会有**物联网**的影子呢?反正我觉得技多不压身,对此你怎么看?欢迎在评论区发表你的看法。
273+
274+
---
275+
276+
至此,整个 Arduino 系列教程,到这里就结束了。完结!再次撒花🎉
277+
278+
希望,HelloGitHub 的 **Arduino** 系列教程,能够勾起你对物联网的兴趣,毕竟兴趣才是最好的好老师。
279+
280+
本期的内容就是这些,这里是 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。
281+
282+
感谢您的阅读,如果觉得内容还不错,一定要记得点赞、留言、分享,我们下期见!

Diff for: contents/Other/Arduino/3/images/1.png

1.6 MB
Loading

Diff for: contents/Other/Arduino/3/images/11.png

19.5 KB
Loading

Diff for: contents/Other/Arduino/3/images/14.png

42.4 KB
Loading

Diff for: contents/Other/Arduino/3/images/15.png

1.82 MB
Loading

Diff for: contents/Other/Arduino/3/images/2.png

92.9 KB
Loading

Diff for: contents/Other/Arduino/3/images/3.png

415 KB
Loading

Diff for: contents/Other/Arduino/3/images/7.png

109 KB
Loading

Diff for: contents/Other/Arduino/3/images/8.png

273 KB
Loading

Diff for: contents/Other/Arduino/3/images/cover.jpeg

1.23 MB
Loading

0 commit comments

Comments
 (0)