主要内容

网络上的东西收集农业数据

这个例子展示了如何设置数据收集从三个传感器连接到一个微处理器板与罗拉®收音机。这种配置允许建立一个分布式传感器网络的大面积。传感器将数据发送到网络,然后转发到ThingSpeak进行分析和可视化。在这个例子中,您构建一个原型设备,连接到网络,并整合与ThingSpeak数据收集。这里显示的设备收集温度、土壤水分和GPS数据。

概述

示例包括三个主要步骤。网络集成的东西进一步分为若干子步骤。最相关的步骤是建筑设备。完成这个例子中,你需要一个ThingSpeak帐户和一个帐户在网络的事情。ThingSpeak,你创建一个新的通道。网络上的东西,您创建一个应用程序和注册一个设备。然后您创建一个有效载荷译码器和添加ThingSpeak转发数据的集成。

1)建立一个ThingSpeak渠道来收集数据

2)建立网络的事情

  • 创建应用程序

  • 注册设备

  • 创建负载格式

  • 添加集成

3)创建设备

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

  • 示意图和联系

4)项目设备

  • 编程设置

  • 代码

建立一个ThingSpeak渠道来收集数据

1)创建一个ThingSpeak通道,如图所示收集数据的新渠道。记录编写API键和通道ID为您的新通道。

2)导航到频道设置页面。设置字段标签,如下所示。

  • 场1 -计数器

  • 场2 -土壤水分

  • 场3 -温度F

3)点击节省通道底部保存您的设置。

配置的网络应用程序

创建一个帐户网络上的东西,然后登录事情网络控制台

创建应用程序

1)选择应用程序。

2)选择添加应用程序

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

注册一个设备

1)点击设备选项卡并注册一个设备。有关更多信息,请参见设备注册

2)创建一个设备ID。行,如果你的设备有一个输入设备。如果不是,选择左边的按钮设备行字段自动生成行。

3)Cick注册。浏览器返回你概述选项卡。

4)选择设置选项卡。

5)设置,选择ABP的激活方法。帮助调试,您可以禁用帧计数器检查在页面的底部。

6)记录设备地址,网络会话密钥,应用程序会话密钥。这些信息在你的设备是必要的代码。

创建负载格式化程序

载荷格式化程序使用字节发送到网关的应用程序组装一条消息。在这个例子中,所需的负载信息是ThingSpeak发送json编码的对象。

1)返回到应用程序视图使用顶部的导航菜单。然后点击负载格式选项卡。

2)在译码器界面,创建的代码将从你的设备发送的字节转换为一个JSON对象给ThingSpeak写信。的条件代码纬度处理的可能性,积极或消极的价值观。

函数解码器(b、港口){var counter = b [0] < < 8) | b [1];var水分= b [2] | b [3] < < 8;var temp = (b [4] [5] | b < < 8) / 100;var lat = (b [6] [7] | b < < 8 | b [8] < < 16 | (b [8] & 0 x80吗?0 xff < < 24: 0)) / 10000;var朗= (b [9] | b [10] < < 8 | b [11] < < 16 | (b [11] & 0 x80吗?0 xff < < 24: 0)) / 10000;返回{field1:计数器,field2:水分,field3: temp,纬度:纬度,经度:经度}}

添加集成

ThingSpeak转发数据,您必须有一个应用程序在网络注册设备和有效载荷格式化程序。创建一个ThingSpeak转发数据的集成。

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

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

3)点击集成选项卡。

4)选择ThingSpeak。

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

6)在授权领域,进入写API密匙的通道要存储你的数据。从可用的API密钥API密钥选项卡的ThingSpeak通道。

7)通道的ID字段,输入你想转发通道ID ThingSpeak通道数据。上可用的频道ID ThingSpeak频道的页面。

创建设备

用于创建传感器节点硬件

您可以使用各种罗拉设备支持LoRaWan协议连接到网络的事情。金宝app这个例子演示了使用以下硬件设置过程。

示意图和联系

连接传感器示意图所示。这张照片显示了一种可能的项目框中配置的传感器。在这个配置中,温度传感器在盒子里面可能不会完全反映了外部温度。你需要添加一个天线罗拉的收音机。

1)连接电源和地面连接GPS和温度传感器。不要将电源连接到水分传感器。

2)土壤水分传感器的输出连接到A0的模拟输入。

3)设置系统,使水分传感器电源关闭不使用的时候。湿敏元件功率销连接的销羽毛M0 11。不使用时关闭电源扩展了传感器寿命。

4)连接DH - 22传感器数据销PA-15羽毛M0,销5 Arduino的草图。

5)GPS板,连接TX RX的羽毛M0和RX TX。

6)使罗拉电台通过连接PA20 (GPIO销29日6)羽毛M0地面。

7)创建一个电源开关通过连接在销的一个开关。

项目设备

编程设置

1)下载最新Arduino IDE。

2)下载Adafruit GPS图书馆或添加的Adafruit_GPS图书馆在图书馆的经理。选择草图>包括图书馆>管理库。搜索Adafruit_GPS将它添加到您的安装库。

3)下载LoraWan-in-C图书馆Arduino环境或添加lmic哈尔/哈尔图书馆在图书馆的经理。选择草图>包括图书馆>管理库。搜索lmic并选择移动的“LoRaWAN LMIC图书馆将它添加到您的安装库。还添加了移动的Arduino LoRaWan库库管理器。

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

代码

1)首先包括适当的库和初始化变量。

# include < lmic。h > # include <哈尔/哈尔。h > # include < SPI。双氢睾酮h > # include "。h”# include < Adafruit_GPS。h > # define DHTPIN 5 # define GPSSerial Serial1 # define SOIL_PIN 14 # define SOIL_POWER_PIN 11 # define GPSECHO假/ /设置为“真正的”如果你想调试和听原始GPS句子# define PAYLOAD_SIZE 13 / /发送的字节数+ 2 / / LoRaWAN NwkSKey,网络会话密钥静态常量PROGMEM u1_t NwkSKey [16] = {0 x98, 0 xeb 0 x1a 0 xc5, 0 xf9 0 x20, 0 x15 0 xcd 0 x12 0 xe5 0 x72 0 xff, 0 xcd 0 xe2 0 x94 0 x46};/ / LoRaWAN AppSKey、应用程序会话密钥静态常量u1_t PROGMEM AppSKey [16] = {x4d x28 0×50 0, 0, 0机加区,0 xea, 0 x41 0 x53 0 x7e 0 xca 0 x70、0 xd2 0 x26 0 xcc, 0 x14, 0 x66 0 x19};/ / LoRaWAN终端设备地址(DevAddr)静态常量u4_t DevAddr = 0 x26021115;/ /回调函数只用于无线激活。离开这些变量空,除非你使用了空气激活。空白os_getArtEui (u1_t * buf){}无效os_getDevEui (u1_t * buf){}无效os_getDevKey (u1_t * buf){} / /负载发送到TTN网关静态uint8_t载荷(PAYLOAD_SIZE);静态osjob_t sendjob; // Schedule TX at least this many seconds 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,罗拉收音机。

无效的设置(){Serial.begin (115200);dht.begin ();以“开始”);/ /设置湿度传感器pinMode电力销(SOIL_POWER_PIN、输出);digitalWrite (SOIL_POWER_PIN、低);GPS.begin (9600);/ / 9600 n mea是默认的波特率。GPS.sendCommand (PMTK_SET_NMEA_OUTPUT_RMCGGA);GPS.sendCommand (PMTK_SET_NMEA_UPDATE_1HZ);/ /设置一个1赫兹更新率。 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)使用循环函数来启动罗拉过程和解析GPS数据。

无效循环()/ /运行一遍又一遍地{os_runloop_once ();字符c = GPS.read ();如果(GPSECHO) {(c){并(c);}}/ /如果收到一个句子,解析它如果(GPS.newNMEAreceived()){如果(! GPS.parse (GPS.lastNMEA())) / /还设置newNMEAreceived()标记为false返回;}}

4)GetSensorData函数打开湿度传感器和读取数据,然后将关机。它还读取温度传感器和检查来自GPS设备的信息。如果有一个GPS修复,这个函数更新位置信息。

空白GetSensorData () {digitalWrite (SOIL_POWER_PIN、高);延迟(1000);myMoisture = analogRead (SOIL_PIN);digitalWrite (SOIL_POWER_PIN、低);双氢睾酮temperatureF =。readTemperature(真正的);系列。println(“水分”+字符串(myMoisture) +“临时工”+字符串(temperatureF));如果(GPS.fix){系列。打印(“位置:”); 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从罗拉无线电函数来处理事件。功能更新连续监控,安排下一个传输和接收消息。

空白onEvent (ev_t ev){并(os_getTime ());系列。打印(“:”);开关(ev){案例EV_SCAN_TIMEOUT:以(F (“EV_SCAN_TIMEOUT”));打破;案例EV_BEACON_FOUND:以(F (“EV_BEACON_FOUND”));打破;案例EV_BEACON_MISSED:以(F (“EV_BEACON_MISSED”));打破;案例EV_BEACON_TRACKED:以(F (“EV_BEACON_TRACKED”)); break; 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将传感器数据转换为比特罗拉广播发送。

空白processJob (osjob_t * j) {getSensorData ();如果(LMIC。opmode & OP_TXRXPEND) / /检查是否有当前TX / RX工作运行。{系列。println (F (“OP_TXRXPEND,不发送”));其他}{负载[0]=字节(柜台);有效载荷柜台[1]= > > 8;负载[2]=字节(myMoisture);负载[3]= myMoisture > > 8;int shiftTemp = int (temperatureF * 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.

学习如何创建一个详细的可视化ThingSpeak油页岩仪表板,明白了创建自定义ThingSpeak通道视图