开发初衷:
学习物联网一段时间,做过若干练习,但都是从练习角度出发。现在依据实际情况做了个实物,因此就有了这款智能花盆。实现根据土壤湿度进行浇水,以维持在合适水平。
主要功能:
1、收集环境信息(土壤湿度,空气温湿度)上传至阿里物联网平台。
2、当土壤湿度低于控制值下限时,自动浇水。
3、可以通过安卓应用,设置土壤湿度控制值范围,以及手动浇水。
特点:
由于这次开发板设计,加入蓝牙模块,以便配置终端的连网设置(WIFI),比过往做的练习(固定WIFI信息),更具产品性。
这个想法是从家里的小米摄像头应用学习过来的,由于智能花盆是用WIFI网络联网,因此使用蓝牙模块进行WIFI网络配置(SSID,PWD),开发更方便。
设计背景
土壤湿度受【灌浇程度,空气温湿度,日照时长,植物生长活跃度】等影响。传统滴灌系统,即使通过定时浇灌,也不一定能够给予植物最合适的土壤湿度环境。
设计加入土壤湿度传感器,以获取准确湿度,进行定量水浇灌,以确保土壤保持合适湿度。
开发板设计
1. 系统框架示意图
2. 智能花盆连接图
3. 数据指令流向图
说明:初次使用时,[用户]通过[安卓终端]运行应用程序,启动[蓝牙设备],与智能花盆的[蓝牙模块],进行配对。配对成功后,便可通过蓝牙通讯,向智能花盆发送WIFI的SSID以及PWD。
采购物料清单
名称 | 图片 | 数量 | 单价 | 总价 | 描述 |
---|---|---|---|---|---|
nodeMCU | 1 | 14 | 14 | 微处理器 | |
人体红外感应 | 1 | 3 | 3 | 传感器 | |
蓝牙模块 | 1 | 7 | 7 | 通信模块 | |
触摸传感模块 | 2 | 1 | 2 | 传感器 | |
空气温湿模块 | 1 | 4 | 4 | 传感器 | |
面包板 | 3 | 2 | 6 | ||
杜邦线 | N | -- | -- | ||
0.96'OLED显示屏 | 1 | 11 | 11 | 输出模块 | |
电容式土壤湿度模块 | 1 | 8 | 8 | 传感器 | |
直流潜水泵 | 1 | 3 | 3 | 执行设备 | |
自制花洒 | 1 | -- | -- | 自制.。。。 执行设备 | |
单相继电器 | 1 | 4 | 4 | 执行设备 | |
薄荷 | 1 | 4 | 4 | 坚强的薄荷一盆 | |
合计 | 72 |
物联网平台
创建物模型
上图说明:属性中的 土壤湿度以及空气温湿控限,是浮点型[上限]与[下限]组成的结构体。实际开发中,仅用到土壤湿度下限,以触发浇水。
服务说明:
浇水服务:响应平台进行浇水,主要用于手动浇水。
设备参数设置:响应平台进行参数设置,主要用于设置终端运行参数[土壤湿度下限,浇水量]
上传数据:响应平台,即时进行环境信息上传。
事件说明:
浇水事件:停用了,改用浇水时终端更新属性[浇水记录],使用0,1区分手动与自动浇水。
代码部分
代码就不贴出来了,仅仅把需要引用的包以及注意事项的作个描述。
一、设备终端开发
说明:使用ArduinoIDE 对nodeMCU 进行代码编写以及烧写
引用包说明:均在库管理器查询即可
终端功能说明:
1、 蓝牙通讯:
设备与安卓应用APP匹配,以及WIFI网络配置
逻辑说明
● 先通过USB转串口方法,对蓝牙模块进行初始化,比如
主从模式:主 波特率:9600
蓝牙名称:Smart_Pot 配对码:8888
● 定义属于自己一套的命令头,命令关键字进行通信,以保障通信准确性,私密性。比如
命令头:+SP:
命令关键字:ConnectIOT(连接终端)
SSID:(WIFI的 SSID内容头) PWD:(WIFI的PWD内容头)等等
● 连接成功后,终端会把烧录好的三元组信息向安卓终端发送并保存,以确保应用与设备之间 一对一的管理关系。
2、 WIFI联网:
智能花盆通电启动或重启后,自动联网。
逻辑说明:
● 通过蓝牙接收到的WIFI配网信息(SSID,PWD)进行联网,联网成功后,ESP8266将自动保 存SSID以及PWD信息,即使断电亦不会丢失。
● 通过WIFI包提供的网络状态检查指令,在WIFI断网时进行重新连接,实现WIFI断网重连。
3、 数据采集及上传物联网平台:空气温度,湿度,土壤湿度
每15分钟,上传数据至物联网平台
逻辑说明:
● 空气温湿度直接改写Arduino提供的示例即可。
● 土壤湿度传感器,需要在纯水以及空气中进行一次湿度数据获取湿度100%~0%的电压范围。
● 土壤湿度除了每15分钟上传一次外,在达到控制下限浇水时,马上上传一次,以获取准确的下限触发时间点。
4、 LED显示屏:亮屏30秒后,自动关闭,作节能作用
当人靠近智能花盆时(1.5米左右),经由[人体红外传感器]感应,自动点亮屏幕。
信息显示内容:
环境信息:土壤湿度(%),空气温度(℃),空气湿度(%)
设备状态:WIFI网络状态(WIFI_OK),数据提交状态(POSTed)
5、 触摸按键
按键A:点亮屏幕
按键B:手动上传数据
6、 浇水
自动执行:
当检测到的实时土壤湿度低于控制下限时,自动按定义浇水量进行浇水。
逻辑说明:
● 每次自动浇水至少相隔15分钟。避免浇水后土壤湿度未及时提升,在下一次湿度下限判断时,造成连续触发浇水。
● 实质控制范围是大于 0 少于等于控制下限,因为有时接触不良的时候,会出现测量土壤湿度为0,造成误浇水,影响运行。考虑实际运行时,不可能出现土壤湿度为 0 的情况,因此作这个逻辑判断。
手动执行:
响应来自平台的浇水服务调用。
7、 运行参数维护
响应来自平台的属性修改
土壤湿度控制下限 以及 浇水量
逻辑说明:
对属性修改完成后,通过 nodeMCU 的 SPIFFS 进行数值保存持久化。以 确保智能花盆在断电重启后,或者断网时,仍然能以最后配置的属性运行。
二、后台开发
1、在阿里租用一台ECS云服务器。
2、使用ASP.NET MVC3 开发一个后台,通过TCP/IP以处理安卓终端与阿里物联网平台数据交互
相关的开发指引,阿里这边相当详细,不作过多描述。
三、安卓开发
功能说明:
1、蓝牙配置WIFI
a) 通过安卓设备蓝牙模块与智能花盆蓝牙模块匹配
逻辑说明:大抵逻辑在上面设备终端已经说明,仅作简单描述了
安卓扫描周边蓝牙设备,并筛选出指定设备名的列表。通过应用配对码连接完成后,保存来自终端设备的三元组信息。凭此三元组信息与平台交互,以访问及控制终端设备。完成应用与终端匹配的工作。
连接蓝牙时,安卓默认是弹出框,让用户输入配对码。但是这个配对码是用于保护终端设备蓝牙访问安全性,因此需要进行代码隐藏弹出框,并自动配对码发送。
保存本地的三元组信息,目前是以明文保存,进一步开发时,应该是需要加密保存。
b) 发送需要连接WIFI网络的SSID以及PWD
逻辑说明:大抵逻辑在上面设备终端已经说明,仅作简单描述了
安卓应用对终端设备的操作,必须按定义的命令头及指令关键字进行。
目前发送SSID以及PWD,都是需要手动填写,其实是可以自动发送SSID以及PWD的,但是我未能找到这方面的代码。
2、智能花盆控制端
a) 运行状态显示:定时刷新由花盆每15分钟上传到平台的运行数据
土壤湿度 空气温度 空气湿度
b) 运行参数设置:
● 土壤湿度下限 单位:百分比
● 浇水量 单位:秒
c) 更新环境信息
逻辑说明
由安卓终端通过后台执行物联网平台接口,调用智能花盆服务,即时上传运行数据到物联网平台
d) 浇水
逻辑说明
逻辑上同,仅调用智能花盆不同服务实现手动即时浇水。
四、整体运行(所在地:广州)
代码部分其实好早已经完成开发,但是为了获取稳定数据,花了很长很长时间调试
上图说明:整月的运行情况已经逐渐趋向稳定,其实从12月开始,已经在试运行收集数据,但是遇到大坑,后续会提到,直到1月才有令我产生信心的数据。
上图说明:放大1月下半月数据,已经趋向稳定,检测土壤湿度达下限时(60%),自动浇水,能看到土壤湿度拉高的情况。而1-21数据出现异常数据,是由于家里出现停电造成没法自动浇水,从而超过监控土壤湿度下限。
运行参数:土壤湿度下限:60% 浇水量:4.5秒
上图说明:浇水记录(0:自动浇水,1:手动浇水)
上图说明:空气温度与空气湿度历史数据
总结
遇到的大坑:
一、关于传感器:
这是第一大坑,千万别选购左图这边土壤湿度传感器,我已经玩坏3-4个,基本上2天就腐蚀掉引脚的金属涂层,由于这种传感器的问题,白花了我1个月的时候找原因,都快到要放弃这次设计的地步了,最后才发现是传感器问题。后更换新款的传感器,目前约1月余,传感器尚算稳定使用。
二、关于与阿里物联网交互数据,在ArudinoIDE对nodeMCU进行代码烧写时,当需要进行交互时,会出现异常。
最终在demo版块的前辈文章中找到方法,十分感谢。
https://dev.iot.aliyun.com/demo/detail/169050
附上前辈文章链接
具体修改内容
AliyunMqttArduino库依赖于Crypto库和PubSubClient库,用于MQTT连接
修改了PubSubClient库的MQTT最大包长为256和心跳频率为60s
三、关于LED显示屏
网上大多Arduino应用LED案例,大多引用U8glib.h 包,但是实际烧录到nodeMCU的时候,会报错,直到我改用U8g2lib.h 包。
四、关于蓝牙模块
由于蓝牙模块,占用nodeMCU的RX/TX引脚,所以在代码烧写时,先不要给蓝牙模块上电,否则会出现烧写不上的情况。
不足之处:
一、传感器取值目前为瞬间值,应该记录若干值,去除最高,最底,取平均值为妥。
二、目前开发板,使用杜邦线连接传感器,偶尔会接触不良,后续应该焊到板子上。
三、上图储水罐应该加个水位传感器,有助提示进行加水。
四、由于本人对园艺并不熟悉,没法真正掌握植物的合适土壤湿度范围。后续能对安卓进一步开发,通过拍照上传至智能服务平台(Bai度AI -- 植物识别)进行植株识别,返回植物名称,以及大数据提供光照时长,温度湿度建议等等,更完善系统。
未能解决问题:
当通过笔记本USB口给nodeMCU供电的时候,通电即运作。但是通过插座供电时,总是需要按一次nodeMCU上的RST按钮才运作,向大家请教这个问题。
总结:
从稳定的运行数据能看到,自动浇水的间隔并没有绝对固定,可以对比当天的空气温湿度,反应植物的生长旺盛情况对土壤湿度的影响,亦体现智能花盆基于实际土壤湿度进行浇水的实际性。
过往已经做过NB-IoT的练习,有空会造一个Arduino + 移远BC26的版本。
最后的最后,至2020-2-1,智能花盆运作2个月,未曾人工浇水,薄荷~还活着。
本人首次发文分享,不足不完善之处,万请指出,感谢。