查看: 2352|回复: 1

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

[复制链接]

该用户从未签到

发表于 2018-8-14 16:00 | 显示全部楼层 |阅读模式

1、准备清单

这里写图片描述
这里写图片描述

- 开发板

这里我选择的是一款叫做 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 套件后,决定选择百度天工。主要是两个方面的考虑:
•   百度天工支持标准的 MQTT 接入
•   存储的过程无需编码提供现成的可视化报表制作工具
小小的提醒:百度天工提供了物接入物管理两个接入入口,但实际上物接入是裸协议,物管理会方便很多;日志查询交互有点反人类,默认进去无内容,需要点一下搜索才出来,排查的时候以为没有报日志上来。

- 云平台操作
点击这里查看平台官方文档
1.注册百度云天工账号并认证 天工-物联网平台 在左侧「产品服务」-「物联网服务」中,选择「物接入」,购买一个月的套餐(根据情况选择消息条数,因为我上报的数据比较多,所以我这里选了200万条)。 随后,在左侧菜单选择「物管理」。进入物管理后,点击「新建物模型」。 填写「名称」、「添加属性」。这里的属性就是我们需要采集的上报的信息,所以这里我加了两个属性:
•   Temperature 温度 number类型
•   Humidity 湿度 number类型
这里写图片描述
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 。
    接线如图:
    这里写图片描述
    实物图:
    这里写图片描述

  • 刷系统

安装驱动
淘宝上可买到的 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 用户直接双击即可)
这里写图片描述

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

  • 采集并上报数据

烧录完成后,即可在浏览器中看到代码编辑界面。系统启动后会执行init.js ,我们的代码足够少,所以这里我们就全部写到此文件。
这里写图片描述
代码如下
其中
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即可!
这里写图片描述

再回到 Projects 的代码编写界面,点击那个长得像上传的图标,保存文件并传输到板子上重启。

这时,你就可以看到 Logs 里在打印温湿度信息,并显示上报成功(Yes)。如果为 no,可以配合本地 Log 及天工里「平台通用功能」-「日志」进行错误排查。
传输成功后,在天工「物影子详情」页面上就可以看到刚刚上报的数据了。
这里写图片描述
至此,就完成了数据采集到上报的全过程。

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

  • 数据存储

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

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

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

场景还是很多的,就不一一引申了。

您需要登录后才可以回帖 登录 | 立即注册  

本版积分规则

热门推荐

【项目】基于Arduino Nano的多功能桌面感应垃圾桶
【项目】基于Arduino Nano
基于Arduino Nano的多功能桌面感应垃圾桶随着大学生活不断往前迈进,宿舍桌面上的杂物
智能物联网花盆
智能物联网花盆
打坏了一个费时5小时 3D打印的花盆,耗时22小时 下载:Kittenblock软件,安装、运
呼吸灯实验
呼吸灯实验
本文节选自《Arduino程序设计基础》 之前的章节已经介绍了多种方法控制LED,但单是开
为开发板 Generic ESP8266 Module 编译时出错
为开发板 Generic ESP8266
第一次尝试Arduino UNO软串口通信,编译一直通不过,错误信息 “开发板 generic (平
Arduino Uno 无法上传程序
Arduino Uno 无法上传程序
原来可以正常使用的Arduino Uno 板子突然不能上传程序了,硬件驱动正常,TX和RX指示灯
Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
快速回复 返回顶部 返回列表