7月25日晚,TEG王者荣耀大赛正式开打,首局比赛,“深圳湾一号业主”爆冷摧残了“祖国的花朵”。
作为“祖国的花朵”队的替补,我内心其实挺满意这个结果,但表面还是要和团队一样心如刀割。
“为什么这样对我们?你们平常不种花的吗?”
“没办法啊,房子太大,每天浇花得走好久。”
“哼!总有一天我会让你们明白!”
比赛失利后我打开了邮箱,突然看到了“IoT迷你赛”,内心的小宇宙悄悄地点燃。我可是“IoT小能手”呀,必须要让“深圳湾一号业主”明白,要让他们明白,房子再大也是可以轻松浇花的!
说干就干,小能手决定做一个物联网浇花器,随时随地打开微信小程序就可以查看盆栽的土壤情况,并且进行远程浇花。这样,长期出差的朋友,以及阳台路程达10分钟的业主们,都得以轻松呵护自己的花花草草。
总体系统架构先放这边,接下来具体说说。
小米曾经出了一款“花花草草检测仪”,可以检测光照、酸碱度、温湿度,采集数据指导小白用户如何更好地种花。这个产品是很好,但是它终于是单向的,只能检测,不能输出,就是说你看到小花快渴死了,但仍做不了什么。
所以小能手希望做一个能远程浇花的设备,不如就叫它“花花草草守护仪”。
另外结合网上热心网友的反馈,我决定砍掉光照、酸碱度、温度这几个非刚需的传感器,采用湿度传感器长期监控土壤的情况。
深圳湾一号的套均建筑面积得有三四百平了吧,这要是用普通的 WiFi,业主们肯定还是会受到覆盖不足的困扰。贴心的小能手自然想到了对策,那便是目前物联网领域最火的技术 LoRa,低功耗远距离,真是别墅物联网应用的不二之选。
而且南山整个区域,已被我大鹅厂做了LoRa网络覆盖,点此链接了解我鹅厂在LoRa产业下的功夫,业主们不用架设 LoRa 网关便可接入。
有了上面的初步构思之后,接下来描述详细设计方案及相应的实现。
硬件直接采用 Tencent OS EVB_MX 开发板,外加一个 LoRa 模组。外设部分,从网上购买了水泵和土壤湿度采集器。其中水泵只需要一个IO操作即可,湿度采集器可使用AD采集。
Tencent OS EVB_MX 引脚 | 接口 | 外设 |
---|---|---|
UART_PORT_0 | 串口 | LoRa 串口模组 |
PA0 | GPIO1 | 水泵 |
PC2 | AD1_IN3 | 土壤湿度传感器 |
硬件连接部分有个要注意的,在电源部分,水泵这种大功率设备如果直接接到开发板会引起电源波动,会影响 LoRa 射频的信号接收,因此我是单独给水泵再供电5V。
软件主体设计,是基于 Tencent OS Tiny。在通信侧,OS 现在帮大家实现了 异步的 AT 框架,以前开发者需要自己费力地去实现异步收发操作,现在可以很便利地操作 LoRa 模组。
at_event_t rhf76_at_event[] = {
{ "+CMSGHEX: PORT:", rhf76_incoming_data_process },
};
软件应用层代码如下,在这边我做了点优化,增加了应用层异步接收的。如代码所示的 McpsIndication 函数即 LoRa 应用层接收函数,开发者只需在这里解析自己的应用数据即可。
我的协议设计比较简单,且LoRa应用也建议使用精简的应用数据,我在发送时使用一个字节,采集土壤湿度的百分比;接收时也使用一个字节,0表示关泵,1表示开泵。
static void McpsIndication(uint8_t* data, uint8_t len)
{
printf("McpsIndication len=%d data[0]=%d\n", len, data[0]);
if (data[0] == 1) {
Flower_SetPump(ON);
} else {
Flower_SetPump(OFF);
}
}
void lorawan_demo(void)
{
int count = 1;
extern int rhf76_lora_init(hal_uart_port_t uart_port);
uint8_t humi;
rhf76_lora_init(HAL_UART_PORT_0);
tos_lora_module_recv_register(McpsIndication);
tos_lora_module_join();
while (1) {
if (count % 20 == 0) {
humi = Flower_ReadHumi();
printf("## Flower_ReadHumit is %d \r\n", humi);
tos_lora_module_send(&humi, 1);
}
count++;
osDelay(500);
}
}
外设部分,ADC / GPIO 操作也不难,具体代码见下方:
void Flower_SetPump(PUMP_Status_ENUM onoff)
{
HAL_GPIO_WritePin(PUMP_GPIO_Port, PUMP_Pin, onoff == ON ? GPIO_PIN_RESET : GPIO_PIN_SET );
}
uint8_t Flower_ReadHumi(void)
{
uint16_t advalue;
uint8_t humi;
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 50);
advalue = (uint16_t)HAL_ADC_GetValue(&hadc1);
humi = (4000 - advalue)/15;
if (humi > 100) {
humi = 100;
}
return humi;
}
对函数中的 AD 换算公式做个简单的说明,虽然我大鹅厂员工平均月薪七万二,但本能手还是勤俭节约,到网上买了十来块钱的土壤湿度传感器。这玩意不能探测绝对湿度,于是本能手做了一些实测,根据干燥空气以及浸没水中的 AD 数值情况,得到了一个简易的公式,来测量土壤的含水量 0% ~ 100%。
烧写固件后,整个版本开始周期性上报土壤湿度数据。
[10:36:59.591]收←◆## Flower_ReadHumit is 33
AT CMD:
AT+CMSGHEX="21"
[10:37:01.763]收←◆---------->+LOG: DEBUG 2112764 LORA RX, 500900000, SF12, 125KHz
[10:37:02.762]收←◆---------->+LOG: DEBUG 2113763 LORA RX, 505300000, SF12, 125KHz
[10:37:03.951]收←◆---------->+LOG: DEBUG 2114950 LORA RX, 60BB2509262083008DDE8D58, -32, 5
---------->+CMSGHEX: ACK Received
---------->+CMSGHEX: RXWIN2, RSSI -32, SNR 5.0
---------->+CMSGHEX: Done
终端设备通过LoRa模组及LoRa网关之后,数据便会到达 LoRa 核心网。腾讯的 LoRa 核心网目前在内测中,预计会在后面一两个月和公众见面,我就先不进行截图。
云平台服务采用 腾讯云物联网开发平台(IoT Explorer) ,尤其是其中的数据模板,应该是物联网从业者比较喜欢的一个功能,通过定义通用的数据模版,统一应用协议,将会极大减少应用开发的工作量。尤其是腾讯目前在智慧城市等领域的一些项目落地,更依赖这类归一化的应用协议,来增强应用系统的可复用性。
这边给“花花草草守护仪”定义了自己的数据模板。
LoRa 核心网 与 Explorer 协议桥接 是整个方案中工作量比较大的一环,需要实现一个 MQTT Relay,而且需要注意其中的应用数据转码,将 LoRa Payload 转化成 数据模板的应用协议。
这边选择了基于 iot-sdk 来做具体的开发,如下方日志所展示的,LoRa Explorer Bridge 向 LoRa 核心网订阅了相关 topic,一旦收到数据后,会做转码处理,并发送给 IoT Explorer。
OS 已经帮助大家做好了现成的小程序 DEMO,目录为 TencentOS_tiny/tools/Mini_Program/,因此我就偷个懒在上面修改下,主要功能是实现开泵浇水以及土壤湿度的查看。
再添加一个动图。
深圳湾一号的伙伴们,大声告诉我,现在是不是可以来养花啦?
不管外界各种 OS 的新闻满天飞,我还是很看好 Tencent OS tiny,它是众多嵌入式设备接入腾讯云 IoT 系列产品的重要载体。除了上文提到的 OS 的异步 AT 框架,我还听 OS 的伙伴讲到他们后续将推出的 FOTA、低功耗管理 等功能,这些都是比较刚需的功能,相信会有更多 IoT 从业者来使用 Tencent OS tiny。
关于 LoRa 部分,目前 OS 已经帮开发者完全打通了,我也在 lora_demo 上贡献了一点代码,主要是增加了异步的 LoRa 应用接收处理,后面的伙伴开发 LoRa 应用应该会更轻松一点。
IoT Explorer 使用下来,对其中的数据模板印象深刻。通过定义通用的数据模版,统一应用协议,将会极大减少应用开发的工作量。尤其是腾讯目前在智慧城市等领域的一些项目落地,更依赖这类归一化的应用协议,来增强应用系统的可复用性。目前公开的数据模版貌似只有智能灯,相信随着品类丰富,应用开发会更简单。
另外对 IoT Explorer 有个小建议,目前是提供 HTTP API,而一些报警类的应用需要再通知到其他一些应用端,例如小程序。目前的做法只能进行重复查询,这样比较消耗网络资源。建议后续能提供 MQTT,尤其是 MQTT over websocket,这样小程序之类的就可以直接收到一些紧急的上行消息。
最后推荐大家关注两个腾讯 IoT 的公众号,可以及时地了解腾讯 IoT 的动向。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。