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
元无门槛红包,但是其实也不是很贵的样子
拿到手后首先来看土壤湿度传感器
,这个传感器说到底还是国内的厂子自己生产的,引出的两根线接到另外一块比较器板子上
型号选的是4 PIN
的,即除了输入的电源和地之外,输出既有A
也有D
,数字量D
其实是依赖于LM358
来比较电压大小,因此可以手动调节板子上的滑动变阻器来改变开始输出的阈值
同时板子上除了电源有LED
指示之外,另一个LED
正是和D
口状态同步的,这里毕竟要看数值,因此选择A
口怼到开发板的ADC1
上来测量其实际电压
电压拿到手之后还需要映射到湿度范围上,虽然实际关系可能不是近似于线性,但是这里还是当做线性处理了
相对湿度的计算方法很简单,放空气中是4V
(0%
)左右,插水里面是1V
(100%
)左右
即: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_ID
和SECRET_KEY
……这个还是得拿CAM
单独建个只读API
密钥
也可以使用腾讯连连
,从官方控制台配好UI
之后直接扫码就可以使用了,非常方便
这里的构想是通过数据同步
将数据存储至私有库中,并使用Grafana
之类的可视化工具查看
数据同步
即将设备通过MQTT
上报的数据以HTTP
形式发送至自己的云主机上,通过Flask
开一个接口接收并存储至MySQL
就搞定了
此构想其他项目已实现,暂未此处已实装
示例Flask
代码,上传接口未做来源验证,后期可以自行加个token
做双方校验
@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
获取到的数据为数据来源,直接写个读MySQL
的shell
就ok
了
有这个command_line
就可以任意对接了,爽到(
方案二:连接到云上MQTT
……
此构想其他项目已实现,暂未此处已实装
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
打开家庭可以同步看到传感器的状态,这里有个坑就是温度
传感器可以显示,但是湿度
不行,解决方法是自定义属性
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
群里都是巨佬,瑟瑟发抖……
未完待续……