diff --git a/Examples/1_LoRa_Sensor/1_LoRa_Sensor.ino b/Examples/1_LoRa_Sensor/1_LoRa_Sensor.ino index ab4b8f8..ae4835f 100644 --- a/Examples/1_LoRa_Sensor/1_LoRa_Sensor.ino +++ b/Examples/1_LoRa_Sensor/1_LoRa_Sensor.ino @@ -8,20 +8,23 @@ #include "fdrs_sensor.h" +#include "sensor_setup.h" + +FDRSLoRa FDRS(GTWY_MAC,READING_ID,MISO,MOSI,SCK,SS,RST,DIO0,BAND,SF); float data1; float data2; void setup() { - beginFDRS(); + FDRS.begin(); } void loop() { data1 = readHum(); - loadFDRS(data1, HUMIDITY_T); + FDRS.load(data1, HUMIDITY_T); data2 = readTemp(); - loadFDRS(data2, TEMP_T); - sendFDRS(); - sleepFDRS(10); //Sleep time in seconds + FDRS.load(data2, TEMP_T); + FDRS.send(); + FDRS.sleep(10); //Sleep time in seconds } float readTemp() { diff --git a/Examples/1_LoRa_Sensor/fdrs_sensor.h b/Examples/1_LoRa_Sensor/fdrs_sensor.h deleted file mode 100644 index d1ce82c..0000000 --- a/Examples/1_LoRa_Sensor/fdrs_sensor.h +++ /dev/null @@ -1,178 +0,0 @@ -// FARM DATA RELAY SYSTEM -// -// "fdrs_sensor.h" -// -// Developed by Timm Bogner (timmbogner@gmail.com) for Sola Gratia Farm in Urbana, Illinois, USA. -// -#include "sensor_setup.h" -#if defined(ESP8266) -#include -#include -#elif defined(ESP32) -#include -#include -#include -#endif -#ifdef USE_LORA -#include -#endif - -#ifdef GLOBALS -#define FDRS_BAND GLOBAL_BAND -#define FDRS_SF GLOBAL_SF -#else -#define FDRS_BAND BAND -#define FDRS_SF SF -#endif - -#ifdef DEBUG -#define DBG(a) (Serial.println(a)) -#else -#define DBG(a) -#endif - -#define STATUS_T 0 // Status -#define TEMP_T 1 // Temperature -#define TEMP2_T 2 // Temperature #2 -#define HUMIDITY_T 3 // Relative Humidity -#define PRESSURE_T 4 // Atmospheric Pressure -#define LIGHT_T 5 // Light (lux) -#define SOIL_T 6 // Soil Moisture -#define SOIL2_T 7 // Soil Moisture #2 -#define SOILR_T 8 // Soil Resistance -#define SOILR2_T 9 // Soil Resistance #2 -#define OXYGEN_T 10 // Oxygen -#define CO2_T 11 // Carbon Dioxide -#define WINDSPD_T 12 // Wind Speed -#define WINDHDG_T 13 // Wind Direction -#define RAINFALL_T 14 // Rainfall -#define MOTION_T 15 // Motion -#define VOLTAGE_T 16 // Voltage -#define VOLTAGE2_T 17 // Voltage #2 -#define CURRENT_T 18 // Current -#define CURRENT2_T 19 // Current #2 -#define IT_T 20 // Iterations - -#define MAC_PREFIX 0xAA, 0xBB, 0xCC, 0xDD, 0xEE // Should only be changed if implementing multiple FDRS systems. - -typedef struct __attribute__((packed)) DataReading { - float d; - uint16_t id; - uint8_t t; - -} DataReading; - -const uint16_t espnow_size = 250 / sizeof(DataReading); -uint8_t gatewayAddress[] = {MAC_PREFIX, GTWY_MAC}; -uint8_t gtwyAddress[] = {gatewayAddress[3], gatewayAddress[4], GTWY_MAC}; -uint8_t LoRaAddress[] = {0x42, 0x00}; - -uint32_t wait_time = 0; -DataReading fdrsData[espnow_size]; -uint8_t data_count = 0; - -void beginFDRS() { -#ifdef DEBUG - Serial.begin(115200); -#endif - DBG("FDRS Sensor ID " + String(READING_ID) + " initializing..."); - DBG(" Gateway: " + String (GTWY_MAC, HEX)); -#ifdef POWER_CTRL - DBG("Powering up the sensor array!"); - pinMode(POWER_CTRL, OUTPUT); - digitalWrite(POWER_CTRL, 1); -#endif - // Init ESP-NOW for either ESP8266 or ESP32 and set MAC address -#ifdef USE_ESPNOW - DBG("Initializing ESP-NOW!"); - WiFi.mode(WIFI_STA); - WiFi.disconnect(); -#if defined(ESP8266) - if (esp_now_init() != 0) { - return; - } - esp_now_set_self_role(ESP_NOW_ROLE_COMBO); - // Register peers - esp_now_add_peer(gatewayAddress, ESP_NOW_ROLE_COMBO, 0, NULL, 0); -#elif defined(ESP32) - if (esp_now_init() != ESP_OK) { - DBG("Error initializing ESP-NOW"); - return; - } - esp_now_peer_info_t peerInfo; - peerInfo.ifidx = WIFI_IF_STA; - peerInfo.channel = 0; - peerInfo.encrypt = false; - // Register first peer - memcpy(peerInfo.peer_addr, gatewayAddress, 6); - if (esp_now_add_peer(&peerInfo) != ESP_OK) { - DBG("Failed to add peer"); - return; - } -#endif - DBG(" ESP-NOW Initialized."); -#endif -#ifdef USE_LORA - DBG("Initializing LoRa!"); - DBG(BAND); - DBG(SF); -#ifndef __AVR__ - SPI.begin(SCK, MISO, MOSI, SS); -#endif - LoRa.setPins(SS, RST, DIO0); - if (!LoRa.begin(FDRS_BAND)) { - while (1); - } - LoRa.setSpreadingFactor(FDRS_SF); - DBG(" LoRa Initialized."); -#endif -} -void transmitLoRa(uint8_t* mac, DataReading * packet, uint8_t len) { -#ifdef USE_LORA - uint8_t pkt[5 + (len * sizeof(DataReading))]; - memcpy(&pkt, mac, 3); // - memcpy(&pkt[3], &LoRaAddress, 2); - memcpy(&pkt[5], packet, len * sizeof(DataReading)); - LoRa.beginPacket(); - LoRa.write((uint8_t*)&pkt, sizeof(pkt)); - LoRa.endPacket(); -#endif -} -void sendFDRS() { - DBG("Sending FDRS Packet!"); -#ifdef USE_ESPNOW - esp_now_send(gatewayAddress, (uint8_t *) &fdrsData, data_count * sizeof(DataReading)); - delay(5); - DBG(" ESP-NOW sent."); -#endif -#ifdef USE_LORA - transmitLoRa(gtwyAddress, fdrsData, data_count); - DBG(" LoRa sent."); -#endif - data_count = 0; -} -void loadFDRS(float d, uint8_t t) { - DBG("Data loaded. Type: " + String(t)); - if (data_count > espnow_size) sendFDRS(); - DataReading dr; - dr.id = READING_ID; - dr.t = t; - dr.d = d; - fdrsData[data_count] = dr; - data_count++; -} -void sleepFDRS(int sleep_time) { - DBG("Sleepytime!"); -#ifdef DEEP_SLEEP - DBG(" Deep sleeping."); -#ifdef ESP32 - esp_sleep_enable_timer_wakeup(sleep_time * 1000000); - esp_deep_sleep_start(); -#endif -#ifdef ESP8266 - ESP.deepSleep(sleep_time * 1000000); -#endif -#endif - DBG(" Delaying."); - delay(sleep_time * 1000); -} diff --git a/Examples/1_LoRa_Sensor/sensor_setup.h b/Examples/1_LoRa_Sensor/sensor_setup.h index db37706..bda26b9 100644 --- a/Examples/1_LoRa_Sensor/sensor_setup.h +++ b/Examples/1_LoRa_Sensor/sensor_setup.h @@ -9,8 +9,6 @@ #define READING_ID 1 //Unique ID for this sensor #define GTWY_MAC 0x04 //Address of the nearest gateway -//#define USE_ESPNOW -#define USE_LORA #define DEEP_SLEEP //#define POWER_CTRL 14 #define DEBUG diff --git a/Examples/2_ESPNOW_Sensor/2_ESPNOW_Sensor.ino b/Examples/2_ESPNOW_Sensor/2_ESPNOW_Sensor.ino index a3be1bc..81c8c7d 100644 --- a/Examples/2_ESPNOW_Sensor/2_ESPNOW_Sensor.ino +++ b/Examples/2_ESPNOW_Sensor/2_ESPNOW_Sensor.ino @@ -7,20 +7,23 @@ // #include "fdrs_sensor.h" +#include "sensor_setup.h" float data1; float data2; +FDRS_EspNow FDRS(GTWY_MAC,READING_ID); + void setup() { - beginFDRS(); + FDRS.begin(); } void loop() { - data1 = readHum(); - loadFDRS(data1, HUMIDITY_T); - data2 = readTemp(); - loadFDRS(data2, TEMP_T); - sendFDRS(); - sleepFDRS(10); //Sleep time in seconds + data1 = readHum(); + FDRS.load(data1, HUMIDITY_T); + data2 = readTemp(); + FDRS.load(data2, TEMP_T); + FDRS.send(); + FDRS.sleep(10); //Sleep time in seconds } float readTemp() { diff --git a/Examples/2_ESPNOW_Sensor/fdrs_sensor.h b/Examples/2_ESPNOW_Sensor/fdrs_sensor.h deleted file mode 100644 index d1ce82c..0000000 --- a/Examples/2_ESPNOW_Sensor/fdrs_sensor.h +++ /dev/null @@ -1,178 +0,0 @@ -// FARM DATA RELAY SYSTEM -// -// "fdrs_sensor.h" -// -// Developed by Timm Bogner (timmbogner@gmail.com) for Sola Gratia Farm in Urbana, Illinois, USA. -// -#include "sensor_setup.h" -#if defined(ESP8266) -#include -#include -#elif defined(ESP32) -#include -#include -#include -#endif -#ifdef USE_LORA -#include -#endif - -#ifdef GLOBALS -#define FDRS_BAND GLOBAL_BAND -#define FDRS_SF GLOBAL_SF -#else -#define FDRS_BAND BAND -#define FDRS_SF SF -#endif - -#ifdef DEBUG -#define DBG(a) (Serial.println(a)) -#else -#define DBG(a) -#endif - -#define STATUS_T 0 // Status -#define TEMP_T 1 // Temperature -#define TEMP2_T 2 // Temperature #2 -#define HUMIDITY_T 3 // Relative Humidity -#define PRESSURE_T 4 // Atmospheric Pressure -#define LIGHT_T 5 // Light (lux) -#define SOIL_T 6 // Soil Moisture -#define SOIL2_T 7 // Soil Moisture #2 -#define SOILR_T 8 // Soil Resistance -#define SOILR2_T 9 // Soil Resistance #2 -#define OXYGEN_T 10 // Oxygen -#define CO2_T 11 // Carbon Dioxide -#define WINDSPD_T 12 // Wind Speed -#define WINDHDG_T 13 // Wind Direction -#define RAINFALL_T 14 // Rainfall -#define MOTION_T 15 // Motion -#define VOLTAGE_T 16 // Voltage -#define VOLTAGE2_T 17 // Voltage #2 -#define CURRENT_T 18 // Current -#define CURRENT2_T 19 // Current #2 -#define IT_T 20 // Iterations - -#define MAC_PREFIX 0xAA, 0xBB, 0xCC, 0xDD, 0xEE // Should only be changed if implementing multiple FDRS systems. - -typedef struct __attribute__((packed)) DataReading { - float d; - uint16_t id; - uint8_t t; - -} DataReading; - -const uint16_t espnow_size = 250 / sizeof(DataReading); -uint8_t gatewayAddress[] = {MAC_PREFIX, GTWY_MAC}; -uint8_t gtwyAddress[] = {gatewayAddress[3], gatewayAddress[4], GTWY_MAC}; -uint8_t LoRaAddress[] = {0x42, 0x00}; - -uint32_t wait_time = 0; -DataReading fdrsData[espnow_size]; -uint8_t data_count = 0; - -void beginFDRS() { -#ifdef DEBUG - Serial.begin(115200); -#endif - DBG("FDRS Sensor ID " + String(READING_ID) + " initializing..."); - DBG(" Gateway: " + String (GTWY_MAC, HEX)); -#ifdef POWER_CTRL - DBG("Powering up the sensor array!"); - pinMode(POWER_CTRL, OUTPUT); - digitalWrite(POWER_CTRL, 1); -#endif - // Init ESP-NOW for either ESP8266 or ESP32 and set MAC address -#ifdef USE_ESPNOW - DBG("Initializing ESP-NOW!"); - WiFi.mode(WIFI_STA); - WiFi.disconnect(); -#if defined(ESP8266) - if (esp_now_init() != 0) { - return; - } - esp_now_set_self_role(ESP_NOW_ROLE_COMBO); - // Register peers - esp_now_add_peer(gatewayAddress, ESP_NOW_ROLE_COMBO, 0, NULL, 0); -#elif defined(ESP32) - if (esp_now_init() != ESP_OK) { - DBG("Error initializing ESP-NOW"); - return; - } - esp_now_peer_info_t peerInfo; - peerInfo.ifidx = WIFI_IF_STA; - peerInfo.channel = 0; - peerInfo.encrypt = false; - // Register first peer - memcpy(peerInfo.peer_addr, gatewayAddress, 6); - if (esp_now_add_peer(&peerInfo) != ESP_OK) { - DBG("Failed to add peer"); - return; - } -#endif - DBG(" ESP-NOW Initialized."); -#endif -#ifdef USE_LORA - DBG("Initializing LoRa!"); - DBG(BAND); - DBG(SF); -#ifndef __AVR__ - SPI.begin(SCK, MISO, MOSI, SS); -#endif - LoRa.setPins(SS, RST, DIO0); - if (!LoRa.begin(FDRS_BAND)) { - while (1); - } - LoRa.setSpreadingFactor(FDRS_SF); - DBG(" LoRa Initialized."); -#endif -} -void transmitLoRa(uint8_t* mac, DataReading * packet, uint8_t len) { -#ifdef USE_LORA - uint8_t pkt[5 + (len * sizeof(DataReading))]; - memcpy(&pkt, mac, 3); // - memcpy(&pkt[3], &LoRaAddress, 2); - memcpy(&pkt[5], packet, len * sizeof(DataReading)); - LoRa.beginPacket(); - LoRa.write((uint8_t*)&pkt, sizeof(pkt)); - LoRa.endPacket(); -#endif -} -void sendFDRS() { - DBG("Sending FDRS Packet!"); -#ifdef USE_ESPNOW - esp_now_send(gatewayAddress, (uint8_t *) &fdrsData, data_count * sizeof(DataReading)); - delay(5); - DBG(" ESP-NOW sent."); -#endif -#ifdef USE_LORA - transmitLoRa(gtwyAddress, fdrsData, data_count); - DBG(" LoRa sent."); -#endif - data_count = 0; -} -void loadFDRS(float d, uint8_t t) { - DBG("Data loaded. Type: " + String(t)); - if (data_count > espnow_size) sendFDRS(); - DataReading dr; - dr.id = READING_ID; - dr.t = t; - dr.d = d; - fdrsData[data_count] = dr; - data_count++; -} -void sleepFDRS(int sleep_time) { - DBG("Sleepytime!"); -#ifdef DEEP_SLEEP - DBG(" Deep sleeping."); -#ifdef ESP32 - esp_sleep_enable_timer_wakeup(sleep_time * 1000000); - esp_deep_sleep_start(); -#endif -#ifdef ESP8266 - ESP.deepSleep(sleep_time * 1000000); -#endif -#endif - DBG(" Delaying."); - delay(sleep_time * 1000); -} diff --git a/Examples/2_ESPNOW_Sensor/sensor_setup.h b/Examples/2_ESPNOW_Sensor/sensor_setup.h index d96882e..5f5766b 100644 --- a/Examples/2_ESPNOW_Sensor/sensor_setup.h +++ b/Examples/2_ESPNOW_Sensor/sensor_setup.h @@ -10,20 +10,4 @@ #define GTWY_MAC 0x03 //Address of the nearest gateway #define USE_ESPNOW -//#define USE_LORA #define DEEP_SLEEP -//#define POWER_CTRL 14 -#define DEBUG - -//LoRa Configuration -#define SCK 5 -#define MISO 19 -#define MOSI 27 -#define SS 18 -#define RST 14 -#define DIO0 26 -//433E6 for Asia -//866E6 for Europe -//915E6 for North America -#define BAND 915E6 -#define SF 7 diff --git a/Examples/ESPNOW_Stress_Test/fdrs_sensor.h b/Examples/ESPNOW_Stress_Test/fdrs_sensor.h deleted file mode 100644 index f3b0464..0000000 --- a/Examples/ESPNOW_Stress_Test/fdrs_sensor.h +++ /dev/null @@ -1,178 +0,0 @@ -// FARM DATA RELAY SYSTEM -// -// "fdrs_sensor.h" -// -// Developed by Timm Bogner (timmbogner@gmail.com) for Sola Gratia Farm in Urbana, Illinois, USA. -// -#include "sensor_setup.h" -#if defined(ESP8266) -#include -#include -#elif defined(ESP32) -#include -#include -#include -#endif -#ifdef USE_LORA -#include -#endif - -#ifdef GLOBALS -#define FDRS_BAND GLOBAL_BAND -#define FDRS_SF GLOBAL_SF -#else -#define FDRS_BAND BAND -#define FDRS_SF SF -#endif - -#ifdef DEBUG -#define DBG(a) (Serial.println(a)) -#else -#define DBG(a) -#endif - -#define STATUS_T 0 // Status -#define TEMP_T 1 // Temperature -#define TEMP2_T 2 // Temperature #2 -#define HUMIDITY_T 3 // Relative Humidity -#define PRESSURE_T 4 // Atmospheric Pressure -#define LIGHT_T 5 // Light (lux) -#define SOIL_T 6 // Soil Moisture -#define SOIL2_T 7 // Soil Moisture #2 -#define SOILR_T 8 // Soil Resistance -#define SOILR2_T 9 // Soil Resistance #2 -#define OXYGEN_T 10 // Oxygen -#define CO2_T 11 // Carbon Dioxide -#define WINDSPD_T 12 // Wind Speed -#define WINDHDG_T 13 // Wind Direction -#define RAINFALL_T 14 // Rainfall -#define MOTION_T 15 // Motion -#define VOLTAGE_T 16 // Voltage -#define VOLTAGE2_T 17 // Voltage #2 -#define CURRENT_T 18 // Current -#define CURRENT2_T 19 // Current #2 -#define IT_T 20 // Iterations - -#define MAC_PREFIX 0xAA, 0xBB, 0xCC, 0xDD, 0xEE // Should only be changed if implementing multiple FDRS systems. - -typedef struct __attribute__((packed)) DataReading { - float d; - uint16_t id; - uint8_t t; - -} DataReading; - -const uint16_t espnow_size = 250 / sizeof(DataReading); -uint8_t gatewayAddress[] = {MAC_PREFIX, GTWY_MAC}; -uint8_t gtwyAddress[] = {gatewayAddress[3], gatewayAddress[4], GTWY_MAC}; -uint8_t LoRaAddress[] = {0x42, 0x00}; - -uint32_t wait_time = 0; -DataReading fdrsData[espnow_size]; -uint8_t data_count = 0; - -void beginFDRS() { -#ifdef DEBUG - Serial.begin(115200); -#endif - DBG("FDRS Sensor ID " + String(READING_ID) + " initializing..."); - DBG(" Gateway: " + String (GTWY_MAC, HEX)); -#ifdef POWER_CTRL - DBG("Powering up the sensor array!"); - pinMode(POWER_CTRL, OUTPUT); - digitalWrite(POWER_CTRL, 1); -#endif - // Init ESP-NOW for either ESP8266 or ESP32 and set MAC address -#ifdef USE_ESPNOW - DBG("Initializing ESP-NOW!"); - WiFi.mode(WIFI_STA); - WiFi.disconnect(); -#if defined(ESP8266) - if (esp_now_init() != 0) { - return; - } - esp_now_set_self_role(ESP_NOW_ROLE_COMBO); - // Register peers - esp_now_add_peer(gatewayAddress, ESP_NOW_ROLE_COMBO, 0, NULL, 0); -#elif defined(ESP32) - if (esp_now_init() != ESP_OK) { - DBG("Error initializing ESP-NOW"); - return; - } - esp_now_peer_info_t peerInfo; - peerInfo.ifidx = WIFI_IF_STA; - peerInfo.channel = 0; - peerInfo.encrypt = false; - // Register first peer - memcpy(peerInfo.peer_addr, gatewayAddress, 6); - if (esp_now_add_peer(&peerInfo) != ESP_OK) { - DBG("Failed to add peer"); - return; - } -#endif - DBG(" ESP-NOW Initialized."); -#endif -#ifdef USE_LORA - DBG("Initializing LoRa!"); - DBG(BAND); - DBG(SF); -#ifndef __AVR__ - SPI.begin(SCK, MISO, MOSI, SS); -#endif - LoRa.setPins(SS, RST, DIO0); - if (!LoRa.begin(FDRS_BAND)) { - while (1); - } - LoRa.setSpreadingFactor(FDRS_SF); - DBG(" LoRa Initialized."); -#endif -} -void transmitLoRa(uint8_t* mac, DataReading * packet, uint8_t len) { -#ifdef USE_LORA - uint8_t pkt[5 + (len * sizeof(DataReading))]; - memcpy(&pkt, mac, 3); // - memcpy(&pkt[3], &LoRaAddress, 2); - memcpy(&pkt[5], packet, len * sizeof(DataReading)); - LoRa.beginPacket(); - LoRa.write((uint8_t*)&pkt, sizeof(pkt)); - LoRa.endPacket(); -#endif -} -void sendFDRS() { - DBG("Sending FDRS Packet!"); -#ifdef USE_ESPNOW - esp_now_send(gatewayAddress, (uint8_t *) &fdrsData, data_count * sizeof(DataReading)); - delay(5); - DBG(" ESP-NOW sent."); -#endif -#ifdef USE_LORA - transmitLoRa(gtwyAddress, fdrsData, data_count); - DBG(" LoRa sent."); -#endif - data_count = 0; -} -void loadFDRS(float d, uint8_t t) { - DBG("Data loaded. Type: " + String(t)); - if (data_count > espnow_size) sendFDRS(); - DataReading dr; - dr.id = READING_ID; - dr.t = t; - dr.d = d; - fdrsData[data_count] = dr; - data_count++; -} -void sleepFDRS(int sleep_time) { - DBG("Sleepytime!"); -#ifdef DEEP_SLEEP - DBG(" Deep sleeping."); -#ifdef ESP32 - esp_sleep_enable_timer_wakeup(sleep_time * 1000000); - esp_deep_sleep_start(); -#endif -#ifdef ESP8266 - ESP.deepSleep(sleep_time * 1000000); -#endif -#endif - DBG(" Delaying."); - delay(sleep_time * 1000); -} diff --git a/FDRS_Sensor2000/fdrs_sensor.h b/FDRS_Sensor2000/fdrs_sensor.h deleted file mode 100644 index d1ce82c..0000000 --- a/FDRS_Sensor2000/fdrs_sensor.h +++ /dev/null @@ -1,178 +0,0 @@ -// FARM DATA RELAY SYSTEM -// -// "fdrs_sensor.h" -// -// Developed by Timm Bogner (timmbogner@gmail.com) for Sola Gratia Farm in Urbana, Illinois, USA. -// -#include "sensor_setup.h" -#if defined(ESP8266) -#include -#include -#elif defined(ESP32) -#include -#include -#include -#endif -#ifdef USE_LORA -#include -#endif - -#ifdef GLOBALS -#define FDRS_BAND GLOBAL_BAND -#define FDRS_SF GLOBAL_SF -#else -#define FDRS_BAND BAND -#define FDRS_SF SF -#endif - -#ifdef DEBUG -#define DBG(a) (Serial.println(a)) -#else -#define DBG(a) -#endif - -#define STATUS_T 0 // Status -#define TEMP_T 1 // Temperature -#define TEMP2_T 2 // Temperature #2 -#define HUMIDITY_T 3 // Relative Humidity -#define PRESSURE_T 4 // Atmospheric Pressure -#define LIGHT_T 5 // Light (lux) -#define SOIL_T 6 // Soil Moisture -#define SOIL2_T 7 // Soil Moisture #2 -#define SOILR_T 8 // Soil Resistance -#define SOILR2_T 9 // Soil Resistance #2 -#define OXYGEN_T 10 // Oxygen -#define CO2_T 11 // Carbon Dioxide -#define WINDSPD_T 12 // Wind Speed -#define WINDHDG_T 13 // Wind Direction -#define RAINFALL_T 14 // Rainfall -#define MOTION_T 15 // Motion -#define VOLTAGE_T 16 // Voltage -#define VOLTAGE2_T 17 // Voltage #2 -#define CURRENT_T 18 // Current -#define CURRENT2_T 19 // Current #2 -#define IT_T 20 // Iterations - -#define MAC_PREFIX 0xAA, 0xBB, 0xCC, 0xDD, 0xEE // Should only be changed if implementing multiple FDRS systems. - -typedef struct __attribute__((packed)) DataReading { - float d; - uint16_t id; - uint8_t t; - -} DataReading; - -const uint16_t espnow_size = 250 / sizeof(DataReading); -uint8_t gatewayAddress[] = {MAC_PREFIX, GTWY_MAC}; -uint8_t gtwyAddress[] = {gatewayAddress[3], gatewayAddress[4], GTWY_MAC}; -uint8_t LoRaAddress[] = {0x42, 0x00}; - -uint32_t wait_time = 0; -DataReading fdrsData[espnow_size]; -uint8_t data_count = 0; - -void beginFDRS() { -#ifdef DEBUG - Serial.begin(115200); -#endif - DBG("FDRS Sensor ID " + String(READING_ID) + " initializing..."); - DBG(" Gateway: " + String (GTWY_MAC, HEX)); -#ifdef POWER_CTRL - DBG("Powering up the sensor array!"); - pinMode(POWER_CTRL, OUTPUT); - digitalWrite(POWER_CTRL, 1); -#endif - // Init ESP-NOW for either ESP8266 or ESP32 and set MAC address -#ifdef USE_ESPNOW - DBG("Initializing ESP-NOW!"); - WiFi.mode(WIFI_STA); - WiFi.disconnect(); -#if defined(ESP8266) - if (esp_now_init() != 0) { - return; - } - esp_now_set_self_role(ESP_NOW_ROLE_COMBO); - // Register peers - esp_now_add_peer(gatewayAddress, ESP_NOW_ROLE_COMBO, 0, NULL, 0); -#elif defined(ESP32) - if (esp_now_init() != ESP_OK) { - DBG("Error initializing ESP-NOW"); - return; - } - esp_now_peer_info_t peerInfo; - peerInfo.ifidx = WIFI_IF_STA; - peerInfo.channel = 0; - peerInfo.encrypt = false; - // Register first peer - memcpy(peerInfo.peer_addr, gatewayAddress, 6); - if (esp_now_add_peer(&peerInfo) != ESP_OK) { - DBG("Failed to add peer"); - return; - } -#endif - DBG(" ESP-NOW Initialized."); -#endif -#ifdef USE_LORA - DBG("Initializing LoRa!"); - DBG(BAND); - DBG(SF); -#ifndef __AVR__ - SPI.begin(SCK, MISO, MOSI, SS); -#endif - LoRa.setPins(SS, RST, DIO0); - if (!LoRa.begin(FDRS_BAND)) { - while (1); - } - LoRa.setSpreadingFactor(FDRS_SF); - DBG(" LoRa Initialized."); -#endif -} -void transmitLoRa(uint8_t* mac, DataReading * packet, uint8_t len) { -#ifdef USE_LORA - uint8_t pkt[5 + (len * sizeof(DataReading))]; - memcpy(&pkt, mac, 3); // - memcpy(&pkt[3], &LoRaAddress, 2); - memcpy(&pkt[5], packet, len * sizeof(DataReading)); - LoRa.beginPacket(); - LoRa.write((uint8_t*)&pkt, sizeof(pkt)); - LoRa.endPacket(); -#endif -} -void sendFDRS() { - DBG("Sending FDRS Packet!"); -#ifdef USE_ESPNOW - esp_now_send(gatewayAddress, (uint8_t *) &fdrsData, data_count * sizeof(DataReading)); - delay(5); - DBG(" ESP-NOW sent."); -#endif -#ifdef USE_LORA - transmitLoRa(gtwyAddress, fdrsData, data_count); - DBG(" LoRa sent."); -#endif - data_count = 0; -} -void loadFDRS(float d, uint8_t t) { - DBG("Data loaded. Type: " + String(t)); - if (data_count > espnow_size) sendFDRS(); - DataReading dr; - dr.id = READING_ID; - dr.t = t; - dr.d = d; - fdrsData[data_count] = dr; - data_count++; -} -void sleepFDRS(int sleep_time) { - DBG("Sleepytime!"); -#ifdef DEEP_SLEEP - DBG(" Deep sleeping."); -#ifdef ESP32 - esp_sleep_enable_timer_wakeup(sleep_time * 1000000); - esp_deep_sleep_start(); -#endif -#ifdef ESP8266 - ESP.deepSleep(sleep_time * 1000000); -#endif -#endif - DBG(" Delaying."); - delay(sleep_time * 1000); -} diff --git a/README.md b/README.md index b212a01..b4dd79d 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,11 @@ Using an assigned MAC address scheme allows for the whole system to be configure ## Getting Started +### Dependencies +[LoRa library](https://github.com/sandeepmistry/arduino-LoRa) + +The dependency can be removed by commenting out the `#define USE_LORA` in `fdrs_sensor.h` + ### [Sensors](https://github.com/timmbogner/Farm-Data-Relay-System/tree/main/FDRS_Sensor2000) Sensors gather data and send it to a gateway via ESP-NOW or LoRa. diff --git a/fdrs_sensor.cpp b/fdrs_sensor.cpp new file mode 100644 index 0000000..5e9ebf5 --- /dev/null +++ b/fdrs_sensor.cpp @@ -0,0 +1,185 @@ + +#include "fdrs_sensor.h" + + +const uint8_t prefix[] = {0xAA, 0xBB, 0xCC, 0xDD, 0xEE}; // Should only be changed if implementing multiple FDRS systems. + +uint8_t LoRaAddress[] = {0x42, 0x00}; + +uint32_t wait_time = 0; + + +FDRSBase::FDRSBase(uint8_t gtwy_mac,uint8_t reading_id): + _gtwy_mac(gtwy_mac), + _espnow_size(250 / sizeof(DataReading)), + _reading_id(reading_id), + _data_count(0) +{ + fdrsData = new DataReading[_espnow_size]; +} + +FDRSBase::~FDRSBase(){ + delete[] fdrsData; +} + +void FDRSBase::begin() { +#ifdef DEBUG + Serial.begin(115200); +#endif + DBG("FDRS Sensor ID " + String(READING_ID) + " initializing..."); + DBG(" Gateway: " + String (_gtwy_mac, HEX)); +#ifdef POWER_CTRL + DBG("Powering up the sensor array!"); + pinMode(POWER_CTRL, OUTPUT); + digitalWrite(POWER_CTRL, 1); +#endif + + init(); + + +} + +void FDRSBase::send(void) { + DBG("Sending FDRS Packet!"); + + if(_data_count == 0){ + return; + } + transmit(fdrsData,_data_count); + _data_count = 0; +} + +void FDRSBase::load(float data, uint8_t type) { + DBG("Data loaded. Type: " + String(t)); + if (_data_count > _espnow_size){ + send(); + } + DataReading dr; + dr.id = _reading_id; + dr.type = type; + dr.data = data; + fdrsData[_data_count] = dr; + _data_count++; +} + +void FDRSBase::sleep(int seconds){ + DBG("Sleepytime!"); +#ifdef DEEP_SLEEP + DBG(" Deep sleeping."); +#ifdef ESP32 + esp_sleep_enable_timer_wakeup(sleep_time * 1000000); + esp_deep_sleep_start(); +#endif +#ifdef ESP8266 + ESP.deepSleep(sleep_time * 1000000); +#endif +#endif + DBG(" Delaying."); + delay(seconds * 1000); +} + + +FDRS_EspNow::FDRS_EspNow(uint8_t gtwy_mac,uint8_t reading_id): + FDRSBase(gtwy_mac,reading_id) +{ + + memcpy(_gatewayAddress,MAC_PREFIX,5); + _gatewayAddress[5] = gtwy_mac; + + +} + + +void FDRS_EspNow::init(void){ + // Init ESP-NOW for either ESP8266 or ESP32 and set MAC address + + DBG("Initializing ESP-NOW!"); + WiFi.mode(WIFI_STA); + WiFi.disconnect(); +#if defined(ESP8266) + if (esp_now_init() != 0) { + return; + } + esp_now_set_self_role(ESP_NOW_ROLE_COMBO); + // Register peers + esp_now_add_peer(_gatewayAddress, ESP_NOW_ROLE_COMBO, 0, NULL, 0); +#elif defined(ESP32) + if(esp_now_init() != ESP_OK){ + DBG("Error initializing ESP-NOW"); + return; + + } + esp_now_peer_info_t peerInfo; + peerInfo.ifidx = WIFI_IF_STA; + peerInfo.channel = 0; + peerInfo.encrypt = false; + // Register first peer + memcpy(peerInfo.peer_addr, _gatewayAddress, 6); + if(esp_now_add_peer(&peerInfo) != ESP_OK) { + DBG("Failed to add peer"); + return; + } +#endif + DBG(" ESP-NOW Initialized."); + +} + +void FDRS_EspNow::transmit(DataReading *fdrsData, uint8_t _data_count){ + esp_now_send(_gatewayAddress, (uint8_t *) fdrsData, _data_count * sizeof(DataReading)); + delay(5); + DBG(" ESP-NOW sent."); +} + +#ifdef USE_LORA + +FDRSLoRa::FDRSLoRa(uint8_t gtwy_mac, + uint8_t reading_id,uint8_t miso,uint8_t mosi,uint8_t sck, + uint8_t ss,uint8_t rst,uint8_t dio0,uint32_t band,uint8_t sf): + FDRSBase(gtwy_mac,reading_id), + _miso(miso), + _mosi(mosi), + _sck(sck), + _ss(ss), + _rst(rst), + _dio0(dio0), + _band(band), + _sf(sf) +{ + _gatewayAddress[0] = prefix[3]; + _gatewayAddress[1] = prefix[4]; + _gatewayAddress[2] = gtwy_mac; +} + +void FDRSLoRa::init(void){ + + DBG("Initializing LoRa!"); + DBG(_band); + DBG(_sf); +#ifndef __AVR__ + SPI.begin(_sck, _miso, _mosi, _ss); +#endif + LoRa.setPins(_ss, _rst, _dio0); + if (!LoRa.begin(_band)) { + DBG("LoRa Initialize Failed."); + while (1); + } + LoRa.setSpreadingFactor(_sf); + DBG("LoRa Initialized."); +} + +void FDRSLoRa::buildPacket(uint8_t* mac, DataReading * packet, uint8_t len) { + uint8_t pkt[5 + (len * sizeof(DataReading))]; + memcpy(&pkt, mac, 3); // + memcpy(&pkt[3], &LoRaAddress, 2); + memcpy(&pkt[5], packet, len * sizeof(DataReading)); + LoRa.beginPacket(); + LoRa.write((uint8_t*)&pkt, sizeof(pkt)); + LoRa.endPacket(); +} + +void FDRSLoRa::transmit(DataReading *fdrsData, uint8_t _data_count){ + buildPacket(_gatewayAddress, fdrsData, _data_count); + DBG(" LoRa sent."); +} + +#endif diff --git a/fdrs_sensor.h b/fdrs_sensor.h new file mode 100644 index 0000000..3b891a4 --- /dev/null +++ b/fdrs_sensor.h @@ -0,0 +1,136 @@ +/* FARM DATA RELAY SYSTEM +* +* "fdrs_sensor.h" +* +* Developed by Timm Bogner (timmbogner@gmail.com) for Sola Gratia Farm in Urbana, Illinois, USA. +* Condensed and refactored to a single file pair by Binder Tronics (info@bindertronics.com). +*/ + +#ifndef __FDRS_SENSOR__H__ +#define __FDRS_SENSOR__H__ + +#define USE_LORA + +#if defined(ESP8266) +#include +#include +#elif defined(ESP32) +#include +#include +#include +#endif + +#ifdef USE_LORA +#include "LoRa.h" +#endif + +#ifdef GLOBALS +#define FDRS_BAND GLOBAL_BAND +#define FDRS_SF GLOBAL_SF +#else +#define FDRS_BAND BAND +#define FDRS_SF SF +#endif + +#ifdef DEBUG +#define DBG(a) (Serial.println(a)) +#else +#define DBG(a) +#endif + +#define STATUS_T 0 // Status +#define TEMP_T 1 // Temperature +#define TEMP2_T 2 // Temperature #2 +#define HUMIDITY_T 3 // Relative Humidity +#define PRESSURE_T 4 // Atmospheric Pressure +#define LIGHT_T 5 // Light (lux) +#define SOIL_T 6 // Soil Moisture +#define SOIL2_T 7 // Soil Moisture #2 +#define SOILR_T 8 // Soil Resistance +#define SOILR2_T 9 // Soil Resistance #2 +#define OXYGEN_T 10 // Oxygen +#define CO2_T 11 // Carbon Dioxide +#define WINDSPD_T 12 // Wind Speed +#define WINDHDG_T 13 // Wind Direction +#define RAINFALL_T 14 // Rainfall +#define MOTION_T 15 // Motion +#define VOLTAGE_T 16 // Voltage +#define VOLTAGE2_T 17 // Voltage #2 +#define CURRENT_T 18 // Current +#define CURRENT2_T 19 // Current #2 +#define IT_T 20 // Iterations + +extern const uint8_t prefix[5]; + +#define MAC_PREFIX prefix // Should only be changed if implementing multiple FDRS systems. + +#define ESP_GATEWAY_ADDRESS_SIZE 6 +#define LORA_GATEWAY_ADDRESS_SIZE 3 + +typedef struct __attribute__((packed)) DataReading { + float data; + uint16_t id; + uint8_t type; +} DataReading; + +class FDRSBase{ +public: + + FDRSBase(uint8_t gtwy_mac,uint8_t reading_id); + ~FDRSBase(); + + void begin(void); + void load(float data, uint8_t type); + void sleep(int seconds); + void send(); + +private: + + uint8_t _gtwy_mac; + const uint16_t _espnow_size; + uint8_t _reading_id; + uint8_t _data_count; + DataReading *fdrsData; + + virtual void init(void) = 0; + virtual void transmit(DataReading *fdrsData, uint8_t _data_count) = 0; +}; + + +class FDRS_EspNow: public FDRSBase{ +public: + + FDRS_EspNow(uint8_t gtwy_mac, uint8_t reading_id); + +private: + + uint8_t _gatewayAddress[ESP_GATEWAY_ADDRESS_SIZE]; + void transmit(DataReading *fdrsData, uint8_t _data_count) override; + void init(void) override; + +}; + +class FDRSLoRa: public FDRSBase{ +public: + + FDRSLoRa(uint8_t gtwy_mac, uint8_t reading_id,uint8_t miso,uint8_t mosi,uint8_t sck, uint8_t ss,uint8_t rst,uint8_t dio0,uint32_t band,uint8_t sf); + +private: + + uint8_t _gatewayAddress[LORA_GATEWAY_ADDRESS_SIZE]; + uint8_t _miso; + uint8_t _mosi; + uint8_t _sck; + uint8_t _ss; + uint8_t _rst; + uint8_t _dio0; + uint32_t _band; + uint8_t _sf; + + void buildPacket(uint8_t* mac, DataReading * packet, uint8_t len); + void transmit(DataReading *fdrsData, uint8_t _data_count) override; + void init(void) override; + +}; + +#endif \ No newline at end of file