主要内容

收集农业数据的网络

此示例显示了如何从连接到微处理器板的三个传感器设置数据集合,其中包含Lora®收音机。该配置允许在大面积上创建分布式传感器网络。传感器将数据发送到网络网络,然后将其转发到用于分析和可视化的东西。在该示例中,您构建了原型设备,连接到事物网络,并将数据收集与ThingSpeak集成。这里显示的装置收集温度,土壤水分和GPS数据。

概述

该示例由三个主要步骤组成。网络集成的东西进一步分为几个子步骤。最漫长的步骤是构建设备。要完成该示例,您需要某些东西账户和物品网络的帐户。在意见,您创建一个新频道。在“内部网络”上,您可以创建一个应用程序并注册设备。然后,您创建了一个有效载荷解码器并将将数据转发到orithspeak的集成。

1)设置迹象显示频道以收集数据

2)设置网络网络

  • 创建应用程序

  • 注册设备

  • 创建有效载荷格式

  • 添加集成

3)创建设备

  • 用于创建传感器节点的硬件

  • 示意图和联系

4)程序设备

  • 编程设置

  • 代码

设置迹象通道以收集数据

1)创建一个东西频道,如图1所示在新频道中收集数据。记录“写入API”键和新频道的通道ID。

2)导航到频道设置页。将字段标签设置如下。

  • 字段1-柜台

  • 领域2-土壤湿度

  • 领域3-温度F.

3)点击保存频道在底部保存您的设置。

配置网络应用程序

创建一个帐户关于网络网络然后登录事情网络控制台

创建应用程序

1)选择应用程序。

2)选择添加应用程序

3)创建一个应用ID,然后添加一个描述。选择处理程序注册根据您的位置。

注册设备

1)点击设备标签并注册设备。有关更多信息,请参阅设备注册

2)创建设备ID。如果设备有一个,请输入设备EUI。如果没有,请选择左侧的按钮设备欧盟字段自动生成EUI。

3)Cick.登记。浏览器将您返回给您概述标签。

4)选择设置标签。

5)在“设置”中,为“激活方法”选择ABP。要帮助调试,您可以选择禁用框架柜台检查在页面的底部。

6)记录设备地址网络会话键, 和应用程序会话键。此信息在您的设备代码中是必需的。

创建有效载荷格式化器

有效载荷格式化器使用从网关发送到应用程序的字节来组装消息。在此示例中,所需的有效载荷消息是将被发送到Thingspeak的JSON编码对象。

1)使用顶部的导航菜单返回应用程序视图。然后点击有效载荷格式标签。

2)在解码器接口,创建代码将从设备发送的字节转换为JSON对象写入ThingSpeak。的条件代码拉特lon处理正面或负值的可能性。

function Decoder(b, port) {var counter = b[0] << 8) | b[1];Var湿度= b[2] | [3] << 8;Var temp= (b[4] | b[5] << 8)/100;var lat = (b [6] [7] | b < < 8 | b [8] < < 16 | (b [8] & 0 x80吗?0xFF << 24: 0)) / 10000;var朗= (b [9] | b [10] < < 8 | b [11] < < 16 | (b [11] & 0 x80吗?0xFF << 24: 0)) / 10000;返回{field1: counter, field2: moisture, field3: temp, latitude: lat, longitude: lon}}

添加集成

要将数据转发到符合案例,您必须在带有注册设备和有效载荷格式化程序的内容网络上具有应用程序。为转发数据创建一个邮件集成。

1)登录您的事情网络控制台

2)选择应用程序并选择要将数据转发给ThingSpeak的应用程序。

3)点击一体化标签。

4)选择截取。

5)在Process ID字段中,命名您的集成。

6)在“授权”字段中,输入要存储数据的频道的Write API密钥。API键可从中获取API键您的钟表的标签。

7)在“通道ID”字段中,输入要将数据转发到的邮件的通道ID。您的频道ID可在您的意见频道的页面上找到。

创建设备

用于创建传感器节点的硬件

您可以使用各种Lora设备,支持Lorawan协议,以便连接到网络网络。万博1manbetx此示例演示了使用以下硬件设置的过程。

示意图和联系

连接传感器,如原理图所示。该照片显示了项目盒中的传感器的可能配置。在这种配置中,盒内的温度传感器可能不完全反映外部温度。你需要添加天线到洛拉收音机。

1)连接GPS和温度传感器的电源和接地连接。请勿将电源连接到湿度传感器。

2)将土壤湿度传感器输出连接到A0处的模拟输入。

3)设置系统,使湿度传感器电源在不使用时关闭。湿度传感器电源销连接到羽毛M0上的GPIO引脚11。在不使用时关闭电源延长了传感器寿命。

4)将DH-22传感器数据引脚连接到羽毛M0上的PA-15,在Arduino草图中是引脚5。

5)对于GPS板,将Tx连接到羽毛M0和Rx至Tx上的Rx。

6)通过将羽毛M0上的PA20(引脚29,GPIO 6)连接到地,使LORA无线电能够实现。

7)通过将开关从EN引脚连接到地,通过将​​开关连接到地,创建电源开关。

程序设备

编程设置

1)下载最新的Arduino IDE。

2)下载Adafruit GPS库或者添加adafruit_gps.图书馆在图书馆经理。选择草图>包括库>管理库。搜索adafruit_gps.将其添加到已安装的库中。

3)下载Lorawan-In-C图书馆对于Arduino环境或添加LMIC.Hal / Hal.图书馆经理中的图书馆。选择草图>包括库>管理库。搜索LMIC.并选择Mcci Lorawan Lmic图书馆将其添加到已安装的库中。还添加了MCCI Arduino Lorawan库到图书馆经理。

4)创建应用程序。在Arduino IDE中打开一个新窗口并保存文件。添加代码部分中提供的代码。

代码

1)首先包括相应的库并初始化变量。

#include  #include  #include“dht.h”#include  #define dhtpin 5 #define gpserial serial1 #define shil_pin 14#定义lead_power_pin 11 #define gpsecho false //设置为“真实”如果要调试并收听原始​​的GPS句子#define payload_size 13//////ORAWANNWKSKEY,网络会话key static const progmem u1_tnwkskey [16] = {0x98,0xeb,0x1a,0xc5,0xf9,0x20,0x15,0xcd,0x12,0xe5,0x72,0xFF,0xCD,0xE2,0x94,0x46};// Lorawan Appskey,应用程序会话静态Const U1_T Progmem Appskey [16] = {0x50,0x28,0x4d,0xae,0x7e,0x41,0x53,0x7e,0xca,0x70,0xd2,0x26,0xcc,0x14,0x66,0x19};// Lorawan终端设备地址(DevAddr)静态Const U4_T DevAddr = 0x26021115;//回调仅用于过度激活。除非您使用空中激活,否则将这些变量留出。void os_getarteui(u1_t * buf){} voidos_getdeveui(u1_t * buf){} void os_getdevkey(u1_t * buf){} //有效载荷发送到TTN网关静态UINT8_T有效负载[PAYLOAD_SIZE];static osjob_t sendjob;//至少这几秒钟计划TX Const unsigned tx_interval = 60; //was 30 // Pin mapping for Adafruit Feather M0 LoRa const lmic_pinmap lmic_pins = { .nss = 8, .rxtx = LMIC_UNUSED_PIN, .rst = 4, .dio = {3, 6, LMIC_UNUSED_PIN}, .rxtx_rx_active = 0, .rssi_cal = 8, // LBT cal for the Adafruit Feather M0 LoRa, in dB. .spi_freq = 8000000, }; Adafruit_GPS GPS(&GPSSerial); // Connect to the GPS on the hardware port. DHT dht(DHTPIN, DHT22); // Connect to the temperature sensor. uint16_t counter = 0; int32_t myLatitude = -12345; // Initialize for testing before GPS finds a lock. int32_t myLongitude = 54321; // Initialize for testing. int myMoisture = 0; // 10 bit ADC value. float temperatureF = 1111;

2)使用设置启动温度传感器,GPS和LORA无线电的功能。

void setup(){serial.begin(115200);dht.begin();serial.println(“开始”);//为湿度传感器PINMODE(FALID_POWER_PIN,输出)设置电源引脚;DigitalWrite(Fail_Power_pin,低);gps.begin(9600);// 9600 NMEA是默认波特率。gps.sendcommand(pmtk_set_nmea_output_rmcgga);gps.sendcommand(pmtk_set_nmea_update_1hz);//设置1 Hz更新速率。 delay(1000); // Wait for GPS to initialize. // Ask for firmware version GPSSerial.println(PMTK_Q_RELEASE); // Initialize the LMIC. os_init(); // Reset the MAC state. Resetting discards the session and pending data transfers. LMIC_reset(); // Set static session parameters. uint8_t appskey[sizeof(APPSKEY)]; uint8_t nwkskey[sizeof(NWKSKEY)]; memcpy_P(appskey, APPSKEY, sizeof(APPSKEY)); memcpy_P(nwkskey, NWKSKEY, sizeof(NWKSKEY)); LMIC_setSession(0x13, DEVADDR, nwkskey, appskey); LMIC_selectSubBand(1); // Only use the correct The Things Network channels, disable the others. for (int c = 0; c < 72; c++) { if ((c < 8) || (c > 15)) { LMIC_disableChannel(c); } } LMIC_setClockError(MAX_CLOCK_ERROR * 1 / 100); // Disable link check validation LMIC_setLinkCheckMode(0); // TTN uses SF9 for its RX2 window. LMIC.dn2Dr = DR_SF9; // Set data rate and transmit power for uplink (note: txpow seems to be ignored by the library) LMIC_setDrTxpow(DR_SF7, 14); // Start job. processJob(&sendjob); }

3)使用环形函数启动LORA进程并解析GPS数据。

void循环()//遍历又一次{os_runloop_once();char c = gps.read();if(gpsecho){if(c){serial.print(c);如果收到句子,请解析if(gps.newnmeareceed()){if(!gps.parse(gps.lastnmea()))//也将newnmeareceived()标志设置为false return;}}

4)getsensordata.功能打开湿度传感器的电源并读取其数据,然后关闭电源。它还读取温度传感器并检查来自GPS设备的信息。如果有GPS修复,则此功能会更新位置信息。

void getsensordata(){digitalwrite(leave_power_pin,高);延迟(1000);mymoisture = analogread(污垢_pin);DigitalWrite(Fail_Power_pin,低);温度f = dht.readtemperature(true);serial.println(“湿度”+弦(MyMoisture)+“Temp”+ String(温度F));if(gps.fix){serial.print(“地点:”);serial.print(gps.latitudedegrees * 100,4);serial.print(“break”);serial.print(gps.lat); Serial.print( ", " ); Serial.print( GPS.longitudeDegrees * 100 , 4 ); Serial.println( GPS.lon ); myLatitude = GPS.latitudeDegrees * 10000; myLongitude = GPS.longitudeDegrees * 10000; } }

5)使用onevent.从Lora收音机处理事件的功能。该函数更新串行监视器,调度下一个传输,然后接收消息。

void nonevent(ev_tev){serial.print(os_gettime());serial.print(“:”);切换(ev){case ev_scan_timeout:serial.println(f(“ev_scan_timeout”));休息;案例ev_beacon_found:serial.println(f(“ev_beacon_found”));休息;案例ev_beacon_missed:serial.println(f(“ev_beacon_missed”));休息;案例ev_beacon_tracked:serial.println(f(“ev_beacon_tracked”));休息; case EV_JOINING: Serial.println(F("EV_JOINING")); break; case EV_JOINED: Serial.println(F("EV_JOINED")); break; case EV_JOIN_FAILED: Serial.println(F("EV_JOIN_FAILED")); break; case EV_REJOIN_FAILED: Serial.println(F("EV_REJOIN_FAILED")); break; case EV_TXCOMPLETE: Serial.println(F("EV_TXCOMPLETE (includes waiting for RX windows)")); if (LMIC.txrxFlags & TXRX_ACK) Serial.println(F("Received ack")); if (LMIC.dataLen) { Serial.println(F("Received ")); Serial.println(LMIC.dataLen); Serial.println(F(" bytes of payload")); } // Schedule next transmission os_setTimedCallback(&sendjob, os_getTime() + sec2osticks(TX_INTERVAL), do_send); break; case EV_LOST_TSYNC: Serial.println(F("EV_LOST_TSYNC")); break; case EV_RESET: Serial.println(F("EV_RESET")); break; case EV_RXCOMPLETE: // data received in ping slot Serial.println(F("EV_RXCOMPLETE")); break; case EV_LINK_DEAD: Serial.println(F("EV_LINK_DEAD")); break; case EV_LINK_ALIVE: Serial.println(F("EV_LINK_ALIVE")); break; case EV_TXSTART: Serial.println(F("EV_TXSTART")); break; default: Serial.print(F("Unknown event: ")); Serial.println((unsigned)ev); break; } }

6)processJob功能将传感器数据转换为在LORA无线电上发送的位。

void processJob(osjob_t *j) {getSensorData();如果(LMIC。opmode & OP_TXRXPEND) //检查当前是否有TX/RX作业正在运行。{系列。println (F(“OP_TXRXPEND,不发送”));} else{有效负载[0]=字节(计数器);有效载荷[1]=计数器>>8;负载[2]=字节(myMoisture);有效载荷[3]= myMoisture >> 8;int shiftTemp = int(温度f * 100); // Convet temperature float to integer for sending and save two places. payload[4] = byte(shiftTemp); payload[5] = shiftTemp >> 8; payload[6] = byte(myLatitude); payload[7] = myLatitude >> 8; payload[8] = myLatitude >> 16; payload[9] = byte(myLongitude); payload[10] = myLongitude >> 8; payload[11] = myLongitude >> 16; LMIC_setTxData2(1, payload, sizeof(payload) - 1, 0); // Prepare upstream data transmission at the next possible time. counter++; Serial.println(String(counter)); } // Next TX is scheduled after TX_COMPLETE event.

要了解如何在您的意外创建详细的可视化仪表板,请参阅创建定制的东西常客视图