我不在的日子里,Code替我守护你——一盆坚强薄荷的广州生活记

本文涉及的产品
云原生多模数据库 Lindorm,多引擎 多规格 0-4节点
Lindorm AIGC体验服务,AIGC 体验服务
简介: 开发初衷:  学习物联网一段时间,做过若干练习,但都是从练习角度出发。现在依据实际情况做了个实物,因此就有了这款智能花盆。实现根据土壤湿度进行浇水,以维持在合适水平。

image.png

开发初衷:

  学习物联网一段时间,做过若干练习,但都是从练习角度出发。现在依据实际情况做了个实物,因此就有了这款智能花盆。实现根据土壤湿度进行浇水,以维持在合适水平。

主要功能:

  1、收集环境信息(土壤湿度,空气温湿度)上传至阿里物联网平台。
  2、当土壤湿度低于控制值下限时,自动浇水。
  3、可以通过安卓应用,设置土壤湿度控制值范围,以及手动浇水。

特点:

  由于这次开发板设计,加入蓝牙模块,以便配置终端的连网设置(WIFI),比过往做的练习(固定WIFI信息),更具产品性。
  这个想法是从家里的小米摄像头应用学习过来的,由于智能花盆是用WIFI网络联网,因此使用蓝牙模块进行WIFI网络配置(SSID,PWD),开发更方便。

设计背景

  土壤湿度受【灌浇程度,空气温湿度,日照时长,植物生长活跃度】等影响。传统滴灌系统,即使通过定时浇灌,也不一定能够给予植物最合适的土壤湿度环境。
  设计加入土壤湿度传感器,以获取准确湿度,进行定量水浇灌,以确保土壤保持合适湿度。

开发板设计

1. 系统框架示意图
image.png

2. 智能花盆连接图
image.png

3. 数据指令流向图
image.png
  说明:初次使用时,[用户]通过[安卓终端]运行应用程序,启动[蓝牙设备],与智能花盆的[蓝牙模块],进行配对。配对成功后,便可通过蓝牙通讯,向智能花盆发送WIFI的SSID以及PWD。

采购物料清单

名称 图片 数量 单价 总价 描述
nodeMCU nodeMCU.png 1 14 14 微处理器
人体红外感应 人体红外传感器.png 1 3 3 传感器
蓝牙模块 nodeMCU.png 1 7 7 通信模块
触摸传感模块 nodeMCU.png 2 1 2 传感器
空气温湿模块 nodeMCU.png 1 4 4 传感器
面包板 nodeMCU.png 3 2 6
杜邦线 nodeMCU.png N -- --
0.96'OLED显示屏 nodeMCU.png 1 11 11 输出模块
电容式土壤湿度模块 nodeMCU.png 1 8 8 传感器
直流潜水泵 nodeMCU.png 1 3 3 执行设备
自制花洒 nodeMCU.png 1 -- -- 自制.。。。 执行设备
单相继电器 nodeMCU.png 1 4 4 执行设备
薄荷 nodeMCU.png 1 4 4 坚强的薄荷一盆
合计 72

image.png

物联网平台

创建物模型
image.png
  上图说明:属性中的 土壤湿度以及空气温湿控限,是浮点型[上限]与[下限]组成的结构体。实际开发中,仅用到土壤湿度下限,以触发浇水。
  
  服务说明:
    浇水服务:响应平台进行浇水,主要用于手动浇水。
    设备参数设置:响应平台进行参数设置,主要用于设置终端运行参数[土壤湿度下限,浇水量]
    上传数据:响应平台,即时进行环境信息上传。
  事件说明:
    浇水事件:停用了,改用浇水时终端更新属性[浇水记录],使用0,1区分手动与自动浇水。

代码部分

代码就不贴出来了,仅仅把需要引用的包以及注意事项的作个描述。

一、设备终端开发
  说明:使用ArduinoIDE 对nodeMCU 进行代码编写以及烧写
  引用包说明:均在库管理器查询即可
image.png
终端功能说明:
  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秒后,自动关闭,作节能作用

image.png


  当人靠近智能花盆时(1.5米左右),经由[人体红外传感器]感应,自动点亮屏幕。
    信息显示内容:
      环境信息:土壤湿度(%),空气温度(℃),空气湿度(%)
      设备状态:WIFI网络状态(WIFI_OK),数据提交状态(POSTed)

  5、 触摸按键

image.png


    按键A:点亮屏幕
    按键B:手动上传数据

  6、 浇水

image.png


    自动执行:
      当检测到的实时土壤湿度低于控制下限时,自动按定义浇水量进行浇水。
      逻辑说明:
        ● 每次自动浇水至少相隔15分钟。避免浇水后土壤湿度未及时提升,在下一次湿度下限判断时,造成连续触发浇水。
        ● 实质控制范围是大于 0 少于等于控制下限,因为有时接触不良的时候,会出现测量土壤湿度为0,造成误浇水,影响运行。考虑实际运行时,不可能出现土壤湿度为 0 的情况,因此作这个逻辑判断。
    手动执行:
      响应来自平台的浇水服务调用。

  7、 运行参数维护
    响应来自平台的属性修改
    土壤湿度控制下限 以及 浇水量
    逻辑说明:
      对属性修改完成后,通过 nodeMCU 的 SPIFFS 进行数值保存持久化。以 确保智能花盆在断电重启后,或者断网时,仍然能以最后配置的属性运行。

二、后台开发
  1、在阿里租用一台ECS云服务器。
  2、使用ASP.NET MVC3 开发一个后台,通过TCP/IP以处理安卓终端与阿里物联网平台数据交互
  相关的开发指引,阿里这边相当详细,不作过多描述。

三、安卓开发
  功能说明:
  1、蓝牙配置WIFI
    a) 通过安卓设备蓝牙模块与智能花盆蓝牙模块匹配

image.png


    逻辑说明:大抵逻辑在上面设备终端已经说明,仅作简单描述了
      安卓扫描周边蓝牙设备,并筛选出指定设备名的列表。通过应用配对码连接完成后,保存来自终端设备的三元组信息。凭此三元组信息与平台交互,以访问及控制终端设备。完成应用与终端匹配的工作。
      连接蓝牙时,安卓默认是弹出框,让用户输入配对码。但是这个配对码是用于保护终端设备蓝牙访问安全性,因此需要进行代码隐藏弹出框,并自动配对码发送。
      保存本地的三元组信息,目前是以明文保存,进一步开发时,应该是需要加密保存。
    b) 发送需要连接WIFI网络的SSID以及PWD
      逻辑说明:大抵逻辑在上面设备终端已经说明,仅作简单描述了
      安卓应用对终端设备的操作,必须按定义的命令头及指令关键字进行。
      目前发送SSID以及PWD,都是需要手动填写,其实是可以自动发送SSID以及PWD的,但是我未能找到这方面的代码。

  2、智能花盆控制端

image.png


    a) 运行状态显示:定时刷新由花盆每15分钟上传到平台的运行数据
      土壤湿度   空气温度   空气湿度
    b) 运行参数设置:
      ● 土壤湿度下限    单位:百分比
      ● 浇水量       单位:秒
    c) 更新环境信息
      逻辑说明
      由安卓终端通过后台执行物联网平台接口,调用智能花盆服务,即时上传运行数据到物联网平台
    d) 浇水
      逻辑说明
      逻辑上同,仅调用智能花盆不同服务实现手动即时浇水。

四、整体运行(所在地:广州)
  代码部分其实好早已经完成开发,但是为了获取稳定数据,花了很长很长时间调试

image.png


上图说明:整月的运行情况已经逐渐趋向稳定,其实从12月开始,已经在试运行收集数据,但是遇到大坑,后续会提到,直到1月才有令我产生信心的数据。

image.png


上图说明:放大1月下半月数据,已经趋向稳定,检测土壤湿度达下限时(60%),自动浇水,能看到土壤湿度拉高的情况。而1-21数据出现异常数据,是由于家里出现停电造成没法自动浇水,从而超过监控土壤湿度下限。
运行参数:土壤湿度下限:60% 浇水量:4.5秒

image.png


上图说明:浇水记录(0:自动浇水,1:手动浇水)

image.png


上图说明:空气温度与空气湿度历史数据

总结

遇到的大坑:
  一、关于传感器:

image.png


    这是第一大坑,千万别选购左图这边土壤湿度传感器,我已经玩坏3-4个,基本上2天就腐蚀掉引脚的金属涂层,由于这种传感器的问题,白花了我1个月的时候找原因,都快到要放弃这次设计的地步了,最后才发现是传感器问题。后更换新款的传感器,目前约1月余,传感器尚算稳定使用。

  二、关于与阿里物联网交互数据,在ArudinoIDE对nodeMCU进行代码烧写时,当需要进行交互时,会出现异常。
  最终在demo版块的前辈文章中找到方法,十分感谢。
  https://dev.iot.aliyun.com/demo/detail/169050
  附上前辈文章链接
  具体修改内容

image.png


  AliyunMqttArduino库依赖于Crypto库和PubSubClient库,用于MQTT连接
  修改了PubSubClient库的MQTT最大包长为256和心跳频率为60s

  三、关于LED显示屏
    网上大多Arduino应用LED案例,大多引用U8glib.h 包,但是实际烧录到nodeMCU的时候,会报错,直到我改用U8g2lib.h 包。

  四、关于蓝牙模块
    由于蓝牙模块,占用nodeMCU的RX/TX引脚,所以在代码烧写时,先不要给蓝牙模块上电,否则会出现烧写不上的情况。

不足之处:
  一、传感器取值目前为瞬间值,应该记录若干值,去除最高,最底,取平均值为妥。

  二、目前开发板,使用杜邦线连接传感器,偶尔会接触不良,后续应该焊到板子上。

image.png


  三、上图储水罐应该加个水位传感器,有助提示进行加水。

  四、由于本人对园艺并不熟悉,没法真正掌握植物的合适土壤湿度范围。后续能对安卓进一步开发,通过拍照上传至智能服务平台(Bai度AI -- 植物识别)进行植株识别,返回植物名称,以及大数据提供光照时长,温度湿度建议等等,更完善系统。

未能解决问题:

image.png


  当通过笔记本USB口给nodeMCU供电的时候,通电即运作。但是通过插座供电时,总是需要按一次nodeMCU上的RST按钮才运作,向大家请教这个问题。

总结:

  从稳定的运行数据能看到,自动浇水的间隔并没有绝对固定,可以对比当天的空气温湿度,反应植物的生长旺盛情况对土壤湿度的影响,亦体现智能花盆基于实际土壤湿度进行浇水的实际性。
  过往已经做过NB-IoT的练习,有空会造一个Arduino + 移远BC26的版本。

  最后的最后,至2020-2-1,智能花盆运作2个月,未曾人工浇水,薄荷~还活着。
  本人首次发文分享,不足不完善之处,万请指出,感谢。


天佑中华,武汉加油!

相关实践学习
钉钉群中如何接收IoT温控器数据告警通知
本实验主要介绍如何将温控器设备以MQTT协议接入IoT物联网平台,通过云产品流转到函数计算FC,调用钉钉群机器人API,实时推送温湿度消息到钉钉群。
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
目录
相关文章
|
4月前
|
关系型数据库 MySQL 测试技术
外包干了3天,技术退步明显.......
【7月更文挑战第12天】
34 2
|
6月前
|
搜索推荐 开发工具 图形学
想做某类型游戏却找不到对应的教程,可以这么办!
想做某类型游戏却找不到对应的教程,可以这么办!
33 0
|
缓存 Java 数据管理
新来了个技术总监,居然要我做一个 IP 属地功能。。不服就干!
新来了个技术总监,居然要我做一个 IP 属地功能。。不服就干!
281 0
新来了个技术总监,居然要我做一个 IP 属地功能。。不服就干!
工作三年,小胖连 Clone 源码都没读过?真的菜!(上)
哈喽,我是狗哥。这是 Java 源码剖析的第三篇。克隆这个知识点在工作中使用不多,很容易被人忽略。但是面试中的面试官就很常问,因此小伙伴们还是要了解下。
工作三年,小胖连 Clone 源码都没读过?真的菜!(上)
工作三年,小胖连 String 源码都没读过?真的菜!(上)
工作三年,小胖连 String 源码都没读过?真的菜!
工作三年,小胖连 String 源码都没读过?真的菜!(上)
|
XML 缓存 JSON
工作三年,小胖连 String 源码都没读过?真的菜!(下)
工作三年,小胖连 String 源码都没读过?真的菜!
工作三年,小胖连 String 源码都没读过?真的菜!(下)
|
Java
编写Java程序,车站只剩 50 张从武汉到北京的车票,现有 3 个窗口售卖,用程序模拟售票的过程
编写Java程序,车站只剩 50 张从武汉到北京的车票,现有 3 个窗口售卖,用程序模拟售票的过程
250 0
编写Java程序,车站只剩 50 张从武汉到北京的车票,现有 3 个窗口售卖,用程序模拟售票的过程
|
存储 安全 关系型数据库
完蛋,公司被一条 update 语句干趴了!
不要小看一条 update 语句,在生产机上使用不当可能会导致业务停滞,甚至崩溃。 当我们要执行 update 语句的时候,确保 where 条件中带上了索引列,并且在测试机确认该语句是否走的是索引扫描,防止因为扫描全表,而对表中的所有记录加上锁。 我们可以打开 MySQL 里的 sql_safe_updates 参数,这样可以预防 update 操作时 where 条件没有带上索引列。 如果发现即使在 where 条件中带上了列索引列,优化器走的还是全标扫描,这时我们就要使用 force index([index_name]) 可以告诉优化器使用哪个索引。
完蛋,公司被一条 update 语句干趴了!
|
存储 JSON Java
工作三年,小胖连 Clone 源码都没读过?真的菜!(下)
工作三年,小胖连 Clone 源码都没读过?真的菜!
|
编解码 Go C#
来到阿里云后,SRS大神杨成立说:“终于可以不用装大神了”
提及SRS,杨成立说其实是个意外,没有大的梦想,没有宏伟的计划,只不过是好玩而已。
13411 0