20行代码DIY一个智能家居环境监测站-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5688|回复: 1

20行代码DIY一个智能家居环境监测站

[复制链接]
发表于 2018-8-14 16:00 | 显示全部楼层 |阅读模式
[md]1、准备清单
------

![这里写图片描述](https://img-blog.csdn.net/20180813170921616?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0VmZmljaWVuY3k5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
![这里写图片描述](https://img-blog.csdn.net/20180813170937495?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0VmZmljaWVuY3k5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

**- 开发板**

这里我选择的是一款叫做 NodeMCU 的开发板。这个是非常好用方便且便宜的物联网开发板,自带 USB 转串口芯片、WiFi 及多个 GPIO 接口,可连接多个传感器。硬件基于 ESP8266 构建,内置 WiFi 支持。

**- 传感器**
我对精度要求不是很高,所以选择一款廉价的温湿度传感器——DHT11。可以用来测试环境温湿度,该传感器的的温度测量范围为 0 ~ 50°C,误差为 2 °C;湿度测量范围为在 0°C时为30%-90%RH,环境温度为 25°C时,湿度测量范围为20%-90%RH,在50°C时,测量范围是20%-80%。

**- 云平台选择**
我的目的是要将数据报到云端,然后做个展示。这里为了方便,选择一个提供物联网平台的云服务。
在评估了百度天工物联网平台、阿里物联网套件、腾讯 IoT 套件后,决定选择[百度天工](https://cloud.baidu.com/solution/iot/index.html?track=cp:dsp%7Cpf:PC%7Cpp:baidutiangong%7Cpu:v2ex%7Cci:IOTBBS%7Ckw:2054513)。主要是两个方面的考虑:
•        百度天工支持标准的 [MQTT 接入](https://cloud.baidu.com/doc/IOT/IOTService/3A.5CMQTT.E5.8D.8F.E8.AE.AE.E6.98.AF.E4.BB.80.E4.B9.88.EF.BC.9F.html?track=cp:dsp%7Cpf:PC%7Cpp:MQTT%7Cpu:v2ex%7Cci:IOTBBS%7Ckw:2054514)
•        存储的过程无需编码提供现成的[可视化](https://cloud.baidu.com/doc/IOT/IOTService/3A.5CMQTT.E5.8D.8F.E8.AE.AE.E6.98.AF.E4.BB.80.E4.B9.88.EF.BC.9F.html?track=cp:dsp%7Cpf:PC%7Cpp:MQTT%7Cpu:v2ex%7Cci:IOTBBS%7Ckw:2054514)报表制作工具
小小的提醒:百度天工提供了[物接入](https://cloud.baidu.com/product/iot.html?track=cp:dsp%7Cpf:PC%7Cpp:wujieru%7Cpu:v2ex%7Cci:IOTBBS%7Ckw:2054515)和[物管理](https://cloud.baidu.com/product/iotdm.html?track=cp:dsp%7Cpf:PC%7Cpp:wuguanli%7Cpu:v2ex%7Cci:IOTBBS%7Ckw:2054516)两个接入入口,但实际上物接入是裸协议,物管理会方便很多;日志查询交互有点反人类,默认进去无内容,需要点一下搜索才出来,排查的时候以为没有报日志上来。

**- 云平台操作**
[点击这里查看平台官方文档](https://cloud.baidu.com/doc/IOTDM/ProductDescription.html?track=cp:dsp%7Cpf:PC%7Cpp:guanfangwendang%7Cpu:v2ex%7Cci:IOTBBS%7Ckw:2054517)
1.注册百度云天工账号并认证 天工-物联网平台 在左侧「产品服务」-「物联网服务」中,选择「[物接入](https://cloud.baidu.com/product/iot.html?track=cp:dsp%7Cpf:PC%7Cpp:wujieru%7Cpu:v2ex%7Cci:IOTBBS%7Ckw:2054515)」,购买一个月的套餐(根据情况选择消息条数,因为我上报的数据比较多,所以我这里选了200万条)。 随后,在左侧菜单选择[「物管理」](https://cloud.baidu.com/product/iotdm.html?track=cp:dsp%7Cpf:PC%7Cpp:wuguanli%7Cpu:v2ex%7Cci:IOTBBS%7Ckw:2054516)。进入物管理后,点击「新建物模型」。 填写「名称」、「添加属性」。这里的属性就是我们需要采集的上报的信息,所以这里我加了两个属性:
•        Temperature 温度 number类型
•        Humidity 湿度 number类型
![这里写图片描述](https://img-blog.csdn.net/20180813173113268?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0VmZmljaWVuY3k5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
2、详细步骤
------

- **开发系统选择**

这款开发版柯林斯请立即获取iTunes多种操作系统,如NodeMCU(LUA),ESPEasy(WebUI中),MicroPython,以及我们今天要使用的猫鼬OS(的NodeJS)。
不管是以上哪个固件,都可以跑通过MQTT。如在百度天工文档中,NodeMCU固件下的lua版本NodeMCU。
因为Mongoose OS刷系统不需要借助第三方工具,有一个web的控制台可以便于管理及调试,所以为了方便,我这次就选择了Mongoose OS的固件。

- **接线**

将传感器与板子之间使用杜邦线连接起来.DHT11一般包含3个接头,但根据生产商不同,标注和顺序有所不同,接线时请查看模块上的标注。我手上这颗是按如下顺序标注的:
* VCC(+、3.3v等)
* DATA(D、S、SIG 等)
* GND(-、G 等)
VCC 和 GND 可与板子上对应标注位连接;DATA 接到 GPIO 口即可。
因为 D4距离较近,于是 GPIO 口我就选了 D4 。
接线如图:
![这里写图片描述](https://img-blog.csdn.net/20180813171908938?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0VmZmljaWVuY3k5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
实物图:       
![这里写图片描述](https://img-blog.csdn.net/2018081317193287?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0VmZmljaWVuY3k5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

* **刷系统**

安装驱动
淘宝上可买到的 NodeMCU,所集成的 USB 转串口的芯片一般有 CP2102 和 CH340 两种,驱动下载地址分别为:CP2102 CH-340。
安装
随后,我们要下载 Mongoose OS。根据你的操作系统,在 MongooseOS 官网 选择对应方式进行安装。
我的是 macOS,所以直接使用以下命令安装。
curl -fsSL https://mongoose-os.com/downloads/mos/install.sh | /bin/bash~/.mos/bin/mos --help      
~/.mos/bin/mos
安装完成后,就会自动打开浏览器。这时候你会看到引导界面。
如果没有启动,可输入 cd .mos/bin/ 或者进入自定义的安装目录,执行 ./mos 来运行管理界面。(Windows 用户直接双击即可)
![这里写图片描述](https://img-blog.csdn.net/2018081317203616?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0VmZmljaWVuY3k5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

接下来是烧录固件。将板子用 Micro-USB 的数据线与电脑连接,在引导界面,选择板子对应的接口,点击 Select。
平台会默认选择(ESP8266),App 的部分我选择了 demo-js,后面我会在这个 App 基础上进行改动以将数据采集并上报。
WiFi 的部分填写你希望板子连接到的热点(注意:仅支持2.4G)。随后点击 Done 即可,这时板子上指示灯会以较快频率闪动。

- **采集并上报数据**

烧录完成后,即可在浏览器中看到代码编辑界面。系统启动后会执行init.js ,我们的代码足够少,所以这里我们就全部写到此文件。
![这里写图片描述](https://img-blog.csdn.net/20180813172113686?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0VmZmljaWVuY3k5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
代码如下
其中
pin 是按 ESP8266 的编号,我们上面接线的 D4 对应 ESP8266 2 号 GPIO 口,所以这里填的2。
$baidu/iot/shadow/xxxxxxxxxxx/update 中的 xxxxxxxxxxx 替换为你在前面百度天工中创建的物影子名称。
       
```
load('api_dht.js');
load('api_mqtt.js');
load('api_timer.js');// GPIO pin which has a DHT sensor data wire connected
let pin = 2;// Initialize DHT library
let dht = DHT.create(pin, DHT.DHT11);// This function reads data from the DHT sensor every 10 second
Timer.set(10000 )/* milliseconds */;
Timer.REPEAT, function() {  
        let t = dht.getTemp();
        let h = dht.getHumidity();
        if (isNaN(h) || isNaN(t))
                print('Failed to read data from sensor');
                return;
  }  
let data = {"reported":{ temperature:t, humidity:h }};  
let myData = JSON.stringify(data);  
let ok = MQTT.pub("$baidu/iot/shadow/xxxxxxxxxxx/update", myData, 1);  
print('Published:', ok ? 'yes' : 'no', ',message:', myData);  
print('Temperature:', t, '*C');  print('Humidity:', h, '%');
}, null);
```

你一定会好奇,前面的连接信息哪里去了。在MongooseOS里,MQTT的连接信息是写在配置文件的。点击MongooseOS浏览器界面左侧的DeviceConf,可看到MQTT配置界面。将前面的连接信息填写进来,点击左上角的Save即可!
![这里写图片描述](https://img-blog.csdn.net/20180813173606971?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0VmZmljaWVuY3k5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
  
再回到 Projects 的代码编写界面,点击那个长得像上传的图标,保存文件并传输到板子上重启。

这时,你就可以看到 Logs 里在打印温湿度信息,并显示上报成功(Yes)。如果为 no,可以配合本地 Log 及天工里「平台通用功能」-「日志」进行错误排查。
传输成功后,在天工「物影子详情」页面上就可以看到刚刚上报的数据了。
![这里写图片描述](https://img-blog.csdn.net/20180813172410424?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0VmZmljaWVuY3k5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
至此,就完成了数据采集到上报的全过程。

等一哈...一开始的第二张图不是有个好看的图么,难道是假的?
当然不是。接下来的部分不需要写代码了,直接在云平台上配置即可。

- **数据存储**

我展示的图表里,有实时值和折线图。其中折线图是过去一段时间的历史数据。所以,我们需要将数据存下来。在一开始,我想着把数据存到 MySQL 或者 MongoDB,在看了一些物联网平台,尤其是百度这个天工之后,发现「时序数据库 TSDB」是一个更好的选择。
随后发现,在天工里,我们上报到物影子的数据,如果需要简单存储到 TSDB,压根不用写代码。不过如果需要复杂的逻辑处理,好像还是要写代码,或者用一个叫规则引擎的服务。
扯远了,这次我们要存的东西比较简单,所以就用现成的功能了。在「物详情」页面(之前获取连接信息那有图),点击编辑,开启「存储配置」,把「不存储」改成「上报即存储」,选择需要存到哪个数据库(没有的话先创建个,默认配置就够用),度量名称填写 monitor ,点击保存即可。
![这里写图片描述](https://img-blog.csdn.net/2018081317245999?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0VmZmljaWVuY3k5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
这样存储的部分就配置好了,每次上报的数据,都会自动给存到 TSDB 里。可以在左侧导航选择「时序数据库」,点对应数据库的「查询面板」查看存进去的历史数据了。
六 做个好看的报表
数据存好了,接下来就是展示出来。
同样的,继续使用天工的一个叫「物可视」的功能。这也是我选用百度这套平台的主要原因之一。
这个功能的引导略少,我是看文档才了解怎么用,会了之后发现超级超级简单方便。
我以做一张我截图那种报表为例,来大概说一下步骤:
•        首先进到物可视,点创建「仪表盘」
•        进入后,顶上有俩标签,选择「数据表」
•        左侧新建数据表,因为我有俩仪表指针图和一个时序折线图,所以这一步我要创建两个数据表,一个时序数据库类型,一个物管理类型
•        创建完后,返回「仪表盘」。将需要的图拖动到空白处,点对应的图,右侧设置一下绑定数据,如下图
![这里写图片描述](https://img-blog.csdn.net/20180813172539807?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0VmZmljaWVuY3k5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
这里介绍了一小部分功能,需要展示更多的部分,可以再看看文档。
结束
至此,整个搭建到展示的过程完成。

一共花费为 20 元 = (NodeMCU板 14.5 元)+ (DHT11传感器 4.5元) + (时序数据库 1 元)

这是套最基础的温湿度采集上报系统,在此基础上,也可以做一些梗复杂的事情。比如加个红外,当温湿度到指定阈值,就触发开关空调;做个手机 App 或微信小程序,控制板子上的红外遥控……

场景还是很多的,就不一一引申了。[/md]
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 07:32 , Processed in 0.075629 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表