arduino开发体验

背景

了解一下物联网的现状和开发过程。

甲醛浓度传感器制作

硬件准备

为了简单便宜,考虑使用成熟而廉价的arduino, uno版本30块左右。
但是考虑到后续接入网络的方便,选择商家的套装,包含了各种传感器和传输辅助部件。
甲醛浓度传感器为了简单,选择可直接从串口上报数据的商品。

硬件连接也比较简单,传感器商家会给接线图,照着接就可以了,如下图。

注意传感器的Tx接到arduno的Rx,Rx接到Tx就可以了。
另外,如果物联网板子只有一个串口并且串口已经被用来做与pc机器之间的连接(例如我的这个uno),不要将传感器的串口直接对接到板子的串口上(可以使用其他通用针脚,然后用软串口机制来读取数据)。
否则会因为相互干扰出现很多莫名其妙的问题。例如程序烧写失败,传感器读不出数据等等。

软件

arduino软件开发环境很成熟,可以直接选择最方便的Web方式进行开发。
https://create.arduino.cc/ 申请一个免费的账户,再到https://create.arduino.cc/getting-started/plugin/install 去下载连接uno的浏览器插件并安装,
然后启动插件(其实就是一个go语言编写的转发代理,安装后在桌面上有一个Arduino Create Agent 的图标可供快速启动)。
随后就可以进入https://create.arduino.cc/editor/ 的WebIde界面。
在这个主界面下,可以完成整套软件开发的过程,包括代码编写、编译、烧写,也可以查看串口的输出(和进行串口输入),如下图所示。

整个Ide界面比较直观,Example和Library中已经有大量代码,许多应用场景都有可以借鉴的示例。唯一个稍微有点隐晦的是,串口输入输出是在侧边菜单的Monitor中。

按照传感器厂商给出的说明,传感器的输出是8个byte的数据+1个byte的校验,可以使用如下的示例程序将传感器周期性上报的数据打印出来。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <SoftwareSerial.h>

SoftwareSerial mySerial(2, 4); // RX, TX (Rx和Tx针脚注意与接线图中的连线对应)

void setup()
{
Serial.begin(9600);
while (!Serial) {
}
Serial.println("Goodnight moon!");

mySerial.begin(9600);
}

void loop() {
int len = 9;
String result;
while (len)
{
if(mySerial.available())
{
String stringOne = String(mySerial.read(), HEX);
Serial.println(stringOne);
result += stringOne;
--len;
}
delay(1);
}
Serial.println(result.length());

for (int i=0;i<9;i++)
Serial.print(result[i]);
Serial.println(" Hello Arduino ");
delay(1000);

}

剩下的事情就是将收集到的数据上报到云端了,可参考https://create.arduino.cc/projecthub/133030/iot-cloud-getting-started-c93255 中的说明。这个步骤各个云供应商不完全一样,但是总体流程都差不多。大致都是需要将单板联网,然后将数据通过指定格式上报到云端,云端通过定义好的数据格式解析并展示。

总体感受

硬件

IOT的硬件成本已经比较低了。50块左右就能买到直接通过2g/4g网络连接到云端的物联网模块。通常IOT应用的数据量不大,数据流量现在也很便宜,所以持续维护的成本也不高。

软件

整个软件栈已经比较完整成熟了。大部分复杂的功能逻辑已经被很好地封装到厂商提供的API内了,并且从单板到云端都有大量示例可控借鉴。
甚至连商业模式都比较成熟了,如下图所示。arduino的收费模式设计得非常平衡,确保个人实验时可以访问绝大部分功能,感受到方便好用而愿意付费。而商业使用时又不太可能免费占便宜。

个人历程感受

纯软件开发做IOT应用,最困难和耗时的还是和硬件相关的琐碎部分。
本次体验中,分析和解决硬件串口冲突导致的各种问题(烧写失败,传感器无法输出)耗费了最主要的时间。其余的所有步骤总共加起来也没有耗费多少时间。