本帖最后由 yongruru 于 2018-8-21 13:35 编辑
根据网络容量大小本文提出两种网络方案。第一种针对小型网络10个节点以内,使用MESH网络,主机轮询从机通信。第二种针对10个节点以上网络,采用LoRaWAN网络。下面逐个对两种方案的结构拓扑、优点和限制、设计细节、功能演示等几个方面深入研究。
一、基于lora无线通信构建的MESH网络,实现局域物联网。
结构拓扑
设计概述 系统分为主机和从机,主机由主控、显示和lora通信模块组成,从机由主控、通信模块和多种传感器组成。工作流程为,从机采集传感器数据存储,主机轮训从机,当被询问到时,根据命令上传传感器数据或者控制IO口输出。主机收到从机数据后处理显示。
优点和限制 优点:1通信逻辑简单,使用现成模块更加简单。2成本低,sx1276相较网关价格有数量级差距。 限制:1网络容量低,随着网络容量增加,轮训的时间变长,实时性变差2增加新节点需要修改主机程序。
电路设计 MCU最小系统,我用的芯片是Microchip的ATSAMC21 电池充电电路,充电电压4.2v,给锂离子电池充电。芯片 EAT6003 电源管理,一个给MCU供电,另一个给传感器供电,由MCU控制是否供电,控制功耗。 传感器电路,两路I2C、两路UART、两路ADC。分别是空气质量CCS811、气压BMP180、GPS模块(备用,可应用于农场都能场景)、lora通信模块、TEMT光敏电阻、NTC热敏电阻。
硬件搭建 8.18补充 一个主机,依次询问两个从机,间隔为2s。 软件设计 8.18补充 主程序流程图,关键函数 - /**
- 项目:21IC
- 角色:中心设备
- 功能:询问从机,控制IO
- */
- #include <asf.h>
- #include "my_driver/my_driver.h"
- int main (void)
- {
- system_init(); //时钟
- delay_init(); //延时
- my_io_init(); //io初始化
- sercom_lora_init(); //lora串口
- sercom_test_init(); //测试串口
- system_interrupt_enable_global(); //开中断
- while(1)
- {
- ask_slave(); //询问从机2s中一次
- }
- }
- void ask_slave(void)
- {
- //发送给终端03
- static uint8_t i;
- for (i=0;i<16;i++)
- {
- usart_write_wait(&usart_lora,test_cmd_ASK_03[i]);
- }
- write_2s=2000;
- while(write_2s)
- {
- delay_ms(1);
- write_2s--;
- recieve_lora();
- }
- //需要添加从机再添加上述代码
- //发送给终端05
- for (i=0;i<16;i++)
- {
- usart_write_wait(&usart_lora,test_cmd_ASK_05[i]);
- }
- write_2s=2000;
- while(write_2s)
- {
- delay_ms(1);
- write_2s--;
- recieve_lora();
- }
- }
- static void recieve_lora(void)
- {
- if (cmd_flag)
- {
- cmd_flag=0;
- static uint8_t i;
- for (i=1;i<cmd_count-2;i++)
- {
- usart_write_wait(&usart_test,cmd_message[i]);
- }
- }
- }
从程序流程图,关键函数 - #include <asf.h>
- #include "my_driver/my_driver.h"
- int main (void)
- {
- system_init(); //时钟
- delay_init(); //延时函数
- my_io_init(); //LED
- tc_100ms_init(); //100ms
- sercom_test_init(); //调试串口
- sercom_lora_init(); //lora通信的串口
- sercom_i2c_init(); //I2C初始化
- system_interrupt_enable_global(); //开中断
- adc_ntc_init();
- adc_light_init();
- bmp180_init();
- ccs811_init(); //空气质量传感器初始化
- while(1)
- {
- task_senser(); //读各种传感器的值
- answer_host(); //收到主机询问,回复传感器值
- }
- }
- void task_senser(void)
- {
- if (task_count>10)
- {
- task_count=0;
- read_ALG();
- read_light();
- read_ntc();
- read_UT_UP();
- port_pin_toggle_output_level(LED_1);
- }
- }
- void answer_host(void)
- {
- //判断串口是否有数据
- if (cmd_flag)
- {
- cmd_flag=0;
- //解释命令
- if(hand_center("#ASK[ DISCUZ_CODE_5 ]quot;))
- {
- pack_message(); //按模块格式封装数据
- send_message(); //发送封装数据
- port_pin_toggle_output_level(LED_3);
- }
- }
- }
功能演示 8月18日补充
主机测试串口输出03和05两个设备上传的不同数据。
8月19日更新,为主机加入了屏幕显示,将串口打印的代码,改成在屏幕显示即可。
可以显示co2的值和累计曲线。
二、基于loraWAN无线网络,实现局域物联网
结构拓扑
设计概述 节点采集传感器信息,上报给网关。网关发送给应用服务器,应用服务器做出显示。本方案中,网关和应用服务器都部署在linux电脑上,实物上是一个,对外输出HDMI接口做显示。
优点和限制 优点:1网络容量大。2添加节点简单。3节点功耗更低 限制:1网关成本高。2LoraWAM网络复杂,需要多方面知识
传感器部分和方案一相同,只是在无线通信的时候换成带LoRaWAN的协议栈的模块。服务器通过网关收到节点数据后,再写个web程序展示出来。 具体设计见3楼。
说明:今天刚看见这个活动,还有一周的时间。所以不打算购买器件和制作电路板,有什么器件用什么,没有器件而不能实现的功能也不在纠结,争取能将两个方案制作出来,这才是最重要的。其中MCU采集传感器部分是相同的,通信部分和显示部分会有区别。两个方案的通信部分我计划做完。显示会做方案一的,方案二只在终端显示节点原始数据,不做进一步处理了。希望能够按计划完成^_^
说明2:两种方案使用的模块通信距离都可以达到1公里以上(直线距离)。可以说是远距离低功耗的无线通信方案,有一定的应用价值。
|