【IOT应用创新大赛】基于 EVB_MX_Plus 的盆栽土壤监测

2020-05-15 11:06:06 浏览数 (1)

0x00.前言

还记得推上的那张曲线图嘛,越临近deadline效率越高(雾

注:因社区编辑器限制,完整文章详见:【IOT应用创新大赛】基于 EVB_MX_Plus 的盆栽土壤监测

0x01.简介

其实这阵子一直盯着专栏看投稿文章的方向性,印象里上周直至昨天还只有4篇,今天突然就多了数十篇,看完大佬们已经提交的文章,感觉好多都是LoRa相关的

虽然当初比赛申请的时候并不知道RoLa是什么,但是看完大佬们的文章也算是明白了它的基本使用方法吧,传输距离比WiFi远多了可是印象里最深刻的一点了

最后说回自己申请的32板子,虽然是个半内行人但是拿到手也能看出这是一块好板子,拿到手之后真是爱不释手hhh

而且还能脱离数据线仅使用锂电池供电(毕竟主打的低功耗MCU),不过某天晚上测试过一次不到8h就没电了(推测主要原因是OLED的耗电量巨大……即使关闭OLED显示再等到早上起来同样会没电)

0x02.EVB_MX_Plus

配套的联网模块使用ESP8266模组,这个用的再熟悉不过了,也赠送了RoLa模组,但是在公开的覆盖图上并没有看到市内有覆盖,因此暂时仍旧使用前者

另外的拓展E51模块足够使用,也没有额外购买其他型号的(

板子拿到手的那个周末就照着例程成功对接上了,见EVB_MX_Plus 对接腾讯云物联网开发平台,不得不说物联网开发平台是真的方便(除了因自己没看好烧错例程无法对接之外),demo程序可以实现云端控制灯的开关(顺便吐槽下这个灯真是巨亮无比)

然后去看板子上的其他传感器:温、湿、光应有尽有,另外在例程里也看到了DHT11的适配,估计找个PIN接上就也能使用了

作为个人业余开发者,并没有接触过工业(商业)产品的经验。所以觉得应该致力于解决贴近自己现实生活中的需求

对于老生常谈的温湿度监控已经基于NodeMCU DHT11实现,这里就围绕着另一个「课题」进行方案落地

去年tb上买了一盆文竹,但是因为种种原因(懒)要么是好几天没浇水,要么是一浇就浇多了…… 本来刚拿到手的时候是绿绿的,到了现在已经变黄了,惨……

因此决定监测植物的湿度,于是立即去tb购买传感器等相关配件

虽然确实是用了红包省钱卡5元无门槛红包,但是其实也不是很贵的样子

6.946.94

拿到手后首先来看土壤湿度传感器,这个传感器说到底还是国内的厂子自己生产的,引出的两根线接到另外一块比较器板子上

型号选的是4 PIN的,即除了输入的电源和地之外,输出既有A也有D,数字量D其实是依赖于LM358来比较电压大小,因此可以手动调节板子上的滑动变阻器来改变开始输出的阈值

同时板子上除了电源有LED指示之外,另一个LED正是和D口状态同步的,这里毕竟要看数值,因此选择A口怼到开发板的ADC1上来测量其实际电压

电压拿到手之后还需要映射到湿度范围上,虽然实际关系可能不是近似于线性,但是这里还是当做线性处理了

相对湿度的计算方法很简单,放空气中是4V0%)左右,插水里面是1V100%)左右

即:soil_humi = (4000 - adValue) / 30;(请无视混用了下划线驼峰命名法

然后就是小水泵了,这玩楞直接插5V流速实在是太快了(主要还是花盆太小了),而且不清楚能不能加上负反馈调节(学过的《自动控制原理》还略有印象)

1m长的水管拿到手发现巨长,于是拿小刀割出20cm,足够使用了

回头去翻商品详情发现了这么一段话,没错绝对湿度值并不适用于土壤

这水泵电流120mA,直接拿单片机GPIO口是驱动不了的,可以选择外接一个三极管搞定,并且不能长时间工作因为会影响到板子的供电?实测不大一会mqtt通信就报错断开了,串口输出还能看到路径乱码???

目前的解决方法是,每次只接通3s之后就断开,这个水量也足够一次短暂的补充了(花盆小

最后的水位传感器,是准备放在储水容器之中来测量剩余可用水量,目前并未实装(原因不仅在于需要寻找空余的GPIO口,更在于又需要找5V供电……

虽然买了一堆传感器可以直接把状态数据推到云上,但是每多一个传感器就需要多一处供电啊(

当然了,这个同样是输出模拟值,需要从GPIO口进行ADC采集来读取其电压值来判定水位线,基本思路是一样的

0x03.代码

gh

说到底还是C51的基础不够,搞一个编译pass都得排半天的错

编译通过!编译通过!

0x04.腾讯云物联网开发平台

来上云吧,进入控制台,印象里早在公测的时候就申请到了名额

比较实用的还有数据开发功能,可以实现自己的逻辑

输出部分的APP 推送暂时还用不上,因此选择公众号推送方式,即报警消息通过微信服务号推送给自己

处理部分的数据过滤其实就是判定条件,比如湿度低于70%触发等等

输入部分的设备数据即传感器读取的湿度数据,设备事件即通过event上报的事件,同理设备状态也是类似的(都是在读传感器嘛

EVB_MX_Plus出厂的开关位置控制了USB接口插到PC上为串口使用由CH340驱动,烧录是用了另外的接口因此互不影响(这板子设计的真是妙啊

另外,如果接上ST-Link的话,就无法使用物理开关控制断电了,它会强制供电,烧录完成之后可以按下板子上的复位键来重启,就不需要拔插ST-Link

而只接USB线就可以使用物理开关,并且会给板子上的锂电池充电

0x05.连线图

完整图完整图

0x06.小程序

源码自带小程序端,照着模板不到半小时就能预览出来(顺便发现代码里明文SECRET_IDSECRET_KEY……这个还是得拿CAM单独建个只读API密钥

v0.2v0.2

也可以使用腾讯连连,从官方控制台配好UI之后直接扫码就可以使用了,非常方便

这里的构想是通过数据同步将数据存储至私有库中,并使用Grafana之类的可视化工具查看

数据同步即将设备通过MQTT上报的数据以HTTP形式发送至自己的云主机上,通过Flask开一个接口接收并存储至MySQL就搞定了

此构想其他项目已实现,暂未此处已实装

示例Flask代码,上传接口未做来源验证,后期可以自行加个token做双方校验

代码语言:txt复制
@api.route('/IOT/flower', methods=['GET', 'POST'])
def IOT_flower():
    if 'upload' in request.args:
        data = json.loads(request.get_data(as_text=True))
        seq = data.get('seq')
        timestamp = data.get('timestamp')
        topic = data.get('topic')
        productid = data.get('productid')
        devicename = data.get('devicename')
        brightness = data.get('payload').get('params').get('brightness')
        humidity = data.get('payload').get('params').get('humidity')
        temperature = data.get('payload').get('params').get('temperature')
        soil_humi = data.get('payload').get('params').get('soil_humi')
        light_switch = data.get('payload').get('params').get('light_switch')
        motor_switch = data.get('payload').get('params').get('motor_switch')
        return upload(seq, timestamp, topic, productid, devicename, brightness, humidity, temperature, soil_humi,
                      light_switch, motor_switch)
    elif 'devicename' in request.args:
        devicename = request.args['devicename']
        if devicename:
            return get_multidata_from_mysql(devicename)
        else:
            return bad_request('参数值为空')
    else:
        return bad_request('非法参数')

即可用https://lab.yuangezhizao.cn/api/v0.0.1/IOT/flower?devicename=dev001接口进行访问

Grafana里选好数据源就也可以进行可视化了

0x08.HomeAssistant

这里的构想是接入HomeAssistant,可使用其进行查看,并配置HomeKit对接IOS家庭,即可用Siri语音控制

方案一:结合上面的数据同步,数据就触手可及了,自有源也不必担心消耗过多的请求量

HomeAssistant里有一种sensor平台是command_line,即把执行shell获取到的数据为数据来源,直接写个读MySQLshellok

有这个command_line就可以任意对接了,爽到(

方案二:连接到云上MQTT……

此构想其他项目已实现,暂未此处已实装

代码语言:txt复制
sensor:
  - platform: command_line
    name: soil_humi
    command: python3 -c "import requests; print(requests.get('https://lab.yuangezhizao.cn/api/v0.0.1/IOT/flower?devicename=dev001').json()['data']['soil_humi'])"
    unit_of_measurement: "%"

  - platform: command_line
    name: yuangezhizao's room temperature
    command: python3 -c "import requests; print(requests.get('https://lab.yuangezhizao.cn/api/v0.0.1/IOT/flower?devicename=dev001').json()['data']['temperature'])"
    unit_of_measurement: "°C"

  - platform: command_line
    name: yuangezhizao's room humidity
    command: python3 -c "import requests; print(requests.get('https://lab.yuangezhizao.cn/api/v0.0.1/IOT/flower?devicename=dev001').json()['data']['humidity'])"
    unit_of_measurement: "%"

  - platform: command_line
    name: brightness
    command: python3 -c "import requests; print(requests.get('https://lab.yuangezhizao.cn/api/v0.0.1/IOT/flower?devicename=dev001').json()['data']['brightness'])"
    unit_of_measurement: "lx"

0x09.HomeKit

打开家庭可以同步看到传感器的状态,这里有个坑就是温度传感器可以显示,但是湿度不行,解决方法是自定义属性

代码语言:txt复制
sensor.soil_humi:
  friendly_name: 土壤湿度
  device_class: humidity

sensor.brightness:
  friendly_name: 光照强度

sensor.yuangezhizao_s_room_humidity_2:
  friendly_name: 房间湿度
  device_class: humidity

sensor.yuangezhizao_s_room_temperature_2:
  friendly_name: 房间温度

也可以召唤Siri

0x09.后记

总的来说收获还是巨大的(wx群里都是巨佬,瑟瑟发抖……

未完待续……

0 人点赞