From d9cc01a8afd553ad3f2e744eea4562d66002719f Mon Sep 17 00:00:00 2001 From: Scobber Date: Fri, 12 Jul 2019 22:43:39 +1000 Subject: [PATCH] Fixed Cayenne LPP gps pos implementation --- main/.vscode/arduino.json | 6 +- main/.vscode/c_cpp_properties.json | 8 +- main/configuration.h | 2 +- main/credentials.h | 12 +- main/dataformats.h | 68 ------- main/gps.ino | 56 ++++++ main/lmic_project_config.h | 2 +- main/main.ino | 302 +++++++++++++---------------- main/ttn.ino | 9 + 9 files changed, 215 insertions(+), 250 deletions(-) delete mode 100644 main/dataformats.h diff --git a/main/.vscode/arduino.json b/main/.vscode/arduino.json index 0980dd7..5122000 100644 --- a/main/.vscode/arduino.json +++ b/main/.vscode/arduino.json @@ -1,4 +1,6 @@ { - "board": "arduino:avr:yun", - "sketch": "main.ino" + "board": "esp32:esp32:ttgo-lora32-v1", + "sketch": "main.ino", + "configuration": "FlashFreq=80,UploadSpeed=921600,DebugLevel=none", + "port": "COM8" } \ No newline at end of file diff --git a/main/.vscode/c_cpp_properties.json b/main/.vscode/c_cpp_properties.json index bf15620..3dbecbf 100644 --- a/main/.vscode/c_cpp_properties.json +++ b/main/.vscode/c_cpp_properties.json @@ -3,12 +3,14 @@ { "name": "Win32", "includePath": [ + "C:\\Users\\Scott\\AppData\\Local\\Arduino15\\packages\\esp32\\tools\\**", + "C:\\Users\\Scott\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\1.0.2\\**", + "C:\\Users\\Scott\\AppData\\Local\\Arduino15\\packages\\esp8266\\tools\\**", + "C:\\Users\\Scott\\AppData\\Local\\Arduino15\\packages\\esp8266\\hardware\\esp8266\\2.5.2\\**", "C:\\Program Files (x86)\\Arduino\\tools\\**", "C:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\**" ], - "forcedInclude": [ - "C:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\cores\\arduino\\Arduino.h" - ], + "forcedInclude": [], "intelliSenseMode": "msvc-x64", "compilerPath": "C:/Program Files (x86)/Microsoft Visual Studio/2017/Professional/VC/Tools/MSVC/14.14.26428/bin/Hostx64/x64/cl.exe", "cStandard": "c11", diff --git a/main/configuration.h b/main/configuration.h index 8dfec33..6081750 100644 --- a/main/configuration.h +++ b/main/configuration.h @@ -43,7 +43,7 @@ void ttn_register(void (*callback)(uint8_t message)); #define DEBUG_PORT Serial // Serial debug port #define SERIAL_BAUD 115200 // Serial debug baud rate #define SLEEP_BETWEEN_MESSAGES 0 // Do sleep between messages -#define SEND_INTERVAL 30000 // Sleep for these many millis +#define SEND_INTERVAL 10000 // Sleep for these many millis #define MESSAGE_TO_SLEEP_DELAY 5000 // Time after message before going to sleep #define LOGO_DELAY 5000 // Time to show logo on first boot #define LORAWAN_PORT 10 // Port the messages will be sent to diff --git a/main/credentials.h b/main/credentials.h index b9e746d..2631902 100644 --- a/main/credentials.h +++ b/main/credentials.h @@ -13,12 +13,12 @@ Credentials file #ifdef USE_ABP // LoRaWAN NwkSKey, network session key - static const u1_t PROGMEM NWKSKEY[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + static const u1_t PROGMEM NWKSKEY[16] = { 0xD1, 0x8A, 0x1F, 0x4D, 0x74, 0x69, 0x46, 0xE9, 0x20, 0x8F, 0x05, 0xE8, 0xFC, 0xB4, 0x5F, 0xC5 }; // LoRaWAN AppSKey, application session key - static const u1_t PROGMEM APPSKEY[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + static const u1_t PROGMEM APPSKEY[16] = { 0x42, 0x42, 0xD0, 0xA2, 0xAB, 0xA8, 0x23, 0x93, 0x19, 0x80, 0x9F, 0x90, 0xB3, 0xB4, 0x82, 0x34 }; // LoRaWAN end-device address (DevAddr) // This has to be unique for every node - static const u4_t DEVADDR = 0x00000000; + static const u4_t DEVADDR = 0x26041F5B; #endif @@ -28,15 +28,15 @@ Credentials file // first. When copying an EUI from ttnctl output, this means to reverse // the bytes. For TTN issued EUIs the last bytes should be 0x00, 0x00, // 0x00. - static const u1_t PROGMEM APPEUI[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + static const u1_t PROGMEM APPEUI[8] = { 0x70, 0xB3, 0xD5, 0x7E, 0xD0, 0x01, 0xE9, 0x44 }; // This should also be in little endian format, see above. - static const u1_t PROGMEM DEVEUI[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + static const u1_t PROGMEM DEVEUI[8] = { 0xCB, 0xBE, 0xEB, 0x0A, 0xDD, 0xEA, 0xDB, 0xEE }; // This key should be in big endian format (or, since it is not really a // number but a block of memory, endianness does not really apply). In // practice, a key taken from ttnctl can be copied as-is. // The key shown here is the semtech default key. - static const u1_t PROGMEM APPKEY[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + static const u1_t PROGMEM APPKEY[16] = { 0x0B, 0xF2, 0xAC, 0xB0, 0x6A, 0xFF, 0x27, 0x1E, 0x89, 0x65, 0x7C, 0xBD, 0x99, 0x9F, 0x7F, 0xE9 }; #endif diff --git a/main/dataformats.h b/main/dataformats.h deleted file mode 100644 index 0ddc888..0000000 --- a/main/dataformats.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - -Packet Processor - -*/ - -#pragma once - - -#ifdef USE_CAYENNE - // CAYENNE DF - static uint8_t txBuffer[11] = {0x03, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - void buildPacket(uint8_t txBuffer[11]) - { - LatitudeBinary = ((_gps.location.lat() + 90) / 180.0) * 16777215; - LongitudeBinary = ((_gps.location.lng() + 180) / 360.0) * 16777215; - int32_t Height = gps.altitude.meters() * 100; - - sprintf(t, "Lat: %f", _gps.location.lat()); - Serial.println(t); - sprintf(t, "Lng: %f", _gps.location.lng()); - Serial.println(t); - sprintf(t, "Alt: %f", _gps.altitude.meters()); - Serial.println(t); - - txBuffer[2] = ( LatitudeBinary >> 16 ) & 0xFF; - txBuffer[3] = ( LatitudeBinary >> 8 ) & 0xFF; - txBuffer[4] = LatitudeBinary & 0xFF; - - txBuffer[5] = ( LongitudeBinary >> 16 ) & 0xFF; - txBuffer[6] = ( LongitudeBinary >> 8 ) & 0xFF; - txBuffer[7] = LongitudeBinary & 0xFF; - - txBuffer[8] = Height >> 16; - txBuffer[9] = Height >> 8; - txBuffer[10] = Height; - } -#else -uint8_t txBuffer[9]; - -void buildPacket(uint8_t txBuffer[9]) -{ - LatitudeBinary = ((_gps.location.lat() + 90) / 180.0) * 16777215; - LongitudeBinary = ((_gps.location.lng() + 180) / 360.0) * 16777215; - - sprintf(t, "Lat: %f", _gps.location.lat()); - Serial.println(t); - - sprintf(t, "Lng: %f", _gps.location.lng()); - Serial.println(t); - - txBuffer[0] = ( LatitudeBinary >> 16 ) & 0xFF; - txBuffer[1] = ( LatitudeBinary >> 8 ) & 0xFF; - txBuffer[2] = LatitudeBinary & 0xFF; - - txBuffer[3] = ( LongitudeBinary >> 16 ) & 0xFF; - txBuffer[4] = ( LongitudeBinary >> 8 ) & 0xFF; - txBuffer[5] = LongitudeBinary & 0xFF; - - altitudeGps = _gps.altitude.meters(); - txBuffer[6] = ( altitudeGps >> 8 ) & 0xFF; - txBuffer[7] = altitudeGps & 0xFF; - - hdopGps = _gps.hdop.value()/10; - txBuffer[8] = hdopGps & 0xFF; -} - -#endif diff --git a/main/gps.ino b/main/gps.ino index 874ef09..9adbe4c 100644 --- a/main/gps.ino +++ b/main/gps.ino @@ -62,5 +62,61 @@ static void gps_loop() { _gps.encode(_serial_gps.read()); } } +#ifdef USE_CAYENNE + // CAYENNE DF + void buildPacket(uint8_t txBuffer[11]) + { + LatitudeBinary = ((_gps.location.lat() + 90) / 180.0) * 16777215; + LongitudeBinary = ((_gps.location.lng() + 180) / 360.0) * 16777215; + int32_t Height = _gps.altitude.meters() * 100; + sprintf(t, "Lat: %f", _gps.location.lat()); + Serial.println(t); + sprintf(t, "Lng: %f", _gps.location.lng()); + Serial.println(t); + sprintf(t, "Alt: %f", _gps.altitude.meters()); + Serial.println(t); + + txBuffer[2] = ( LatitudeBinary >> 16 ) & 0xFF; + txBuffer[3] = ( LatitudeBinary >> 8 ) & 0xFF; + txBuffer[4] = LatitudeBinary & 0xFF; + txBuffer[5] = ( LongitudeBinary >> 16 ) & 0xFF; + txBuffer[6] = ( LongitudeBinary >> 8 ) & 0xFF; + txBuffer[7] = LongitudeBinary & 0xFF; + + txBuffer[8] = Height >> 16; + txBuffer[9] = Height >> 8; + txBuffer[10] = Height; + } +#else +uint8_t txBuffer[9]; + +void buildPacket(uint8_t txBuffer[9]) +{ + LatitudeBinary = ((_gps.location.lat() + 90) / 180.0) * 16777215; + LongitudeBinary = ((_gps.location.lng() + 180) / 360.0) * 16777215; + + sprintf(t, "Lat: %f", _gps.location.lat()); + Serial.println(t); + + sprintf(t, "Lng: %f", _gps.location.lng()); + Serial.println(t); + + txBuffer[0] = ( LatitudeBinary >> 16 ) & 0xFF; + txBuffer[1] = ( LatitudeBinary >> 8 ) & 0xFF; + txBuffer[2] = LatitudeBinary & 0xFF; + + txBuffer[3] = ( LongitudeBinary >> 16 ) & 0xFF; + txBuffer[4] = ( LongitudeBinary >> 8 ) & 0xFF; + txBuffer[5] = LongitudeBinary & 0xFF; + + altitudeGps = _gps.altitude.meters(); + txBuffer[6] = ( altitudeGps >> 8 ) & 0xFF; + txBuffer[7] = altitudeGps & 0xFF; + + hdopGps = _gps.hdop.value()/10; + txBuffer[8] = hdopGps & 0xFF; +} + +#endif diff --git a/main/lmic_project_config.h b/main/lmic_project_config.h index 43b68e7..77cd6ca 100644 --- a/main/lmic_project_config.h +++ b/main/lmic_project_config.h @@ -6,7 +6,7 @@ // inside the project_config folder. // Make sure only one of the following is defined (CFG_us915 or CFG_eu868) -#define CFG_us915 1 +#define CFG_aus915 1 //#define CFG_eu868 1 #define CFG_sx1276_radio 1 diff --git a/main/main.ino b/main/main.ino index 13d6581..8e8e021 100644 --- a/main/main.ino +++ b/main/main.ino @@ -1,29 +1,28 @@ /* -Main module + Main module -# Modified by Kyle T. Gabriel to fix issue with incorrect GPS data for TTNMapper + # Modified by Kyle T. Gabriel to fix issue with incorrect GPS data for TTNMapper -Copyright (C) 2018 by Xose Pérez + Copyright (C) 2018 by Xose Pérez -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. -You should have received a copy of the GNU General Public License -along with this program. If not, see . + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #include "configuration.h" -#include -#include "dataformats.h" +#include "rom/rtc.h" // Message counter, stored in RTC memory, survives deep sleep @@ -31,202 +30,167 @@ RTC_DATA_ATTR uint32_t count = 0; // ----------------------------------------------------------------------------- // Submodules // ----------------------------------------------------------------------------- -#ifdef USE_GPS 1 #include -uint32_t LatitudeBinary, LongitudeBinary; -uint16_t altitudeGps; -uint8_t hdopGps; -char t[32]; // used to sprintf for Serial output - -TinyGPSPlus _gps; -HardwareSerial _serial_gps(GPS_SERIAL_NUM); - -void gps_time(char * buffer, uint8_t size) { - snprintf(buffer, size, "%02d:%02d:%02d", _gps.time.hour(), _gps.time.minute(), _gps.time.second()); -} - -float gps_latitude() { - return _gps.location.lat(); -} - -float gps_longitude() { - return _gps.location.lng(); -} - -float gps_altitude() { - return _gps.altitude.meters(); -} - -float gps_hdop() { - return _gps.hdop.hdop(); -} - -uint8_t gps_sats() { - return _gps.satellites.value(); -} - -void gps_setup() { - _serial_gps.begin(GPS_BAUDRATE, SERIAL_8N1, GPS_RX_PIN, GPS_TX_PIN); -} - -static void gps_loop() { - while (_serial_gps.available()) { - _gps.encode(_serial_gps.read()); - } -} +#ifdef USE_CAYENNE + // CAYENNE DF + static uint8_t txBuffer[11] = {0x03, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; +#else + uint8_t txBuffer[9]; #endif + // ----------------------------------------------------------------------------- // Application // ----------------------------------------------------------------------------- void send() { - char buffer[40]; - snprintf(buffer, sizeof(buffer), "Latitude: %10.6f\n", gps_latitude()); - screen_print(buffer); - snprintf(buffer, sizeof(buffer), "Longitude: %10.6f\n", gps_longitude()); - screen_print(buffer); - snprintf(buffer, sizeof(buffer), "Error: %4.2fm\n", gps_hdop()); - screen_print(buffer); + char buffer[40]; + snprintf(buffer, sizeof(buffer), "Latitude: %10.6f\n", gps_latitude()); + screen_print(buffer); + snprintf(buffer, sizeof(buffer), "Longitude: %10.6f\n", gps_longitude()); + screen_print(buffer); + snprintf(buffer, sizeof(buffer), "Error: %4.2fm\n", gps_hdop()); + screen_print(buffer); - buildPacket(txBuffer); + buildPacket(txBuffer); - #if LORAWAN_CONFIRMED_EVERY > 0 - bool confirmed = (count % LORAWAN_CONFIRMED_EVERY == 0); - #else - bool confirmed = false; - #endif +#if LORAWAN_CONFIRMED_EVERY > 0 + bool confirmed = (count % LORAWAN_CONFIRMED_EVERY == 0); +#else + bool confirmed = false; +#endif - ttn_cnt(count); - ttn_send(txBuffer, sizeof(txBuffer), LORAWAN_PORT, confirmed); + ttn_cnt(count); + ttn_send(txBuffer, sizeof(txBuffer), LORAWAN_PORT, confirmed); - count++; + count++; } void sleep() { - #if SLEEP_BETWEEN_MESSAGES +#if SLEEP_BETWEEN_MESSAGES - // Show the going to sleep message on the screen - char buffer[20]; - snprintf(buffer, sizeof(buffer), "Sleeping in %3.1fs\n", (MESSAGE_TO_SLEEP_DELAY / 1000.0)); - screen_print(buffer); + // Show the going to sleep message on the screen + char buffer[20]; + snprintf(buffer, sizeof(buffer), "Sleeping in %3.1fs\n", (MESSAGE_TO_SLEEP_DELAY / 1000.0)); + screen_print(buffer); - // Wait for MESSAGE_TO_SLEEP_DELAY millis to sleep - delay(MESSAGE_TO_SLEEP_DELAY); + // Wait for MESSAGE_TO_SLEEP_DELAY millis to sleep + delay(MESSAGE_TO_SLEEP_DELAY); - // Turn off screen - screen_off(); + // Turn off screen + screen_off(); - // Set the user button to wake the board - sleep_interrupt(BUTTON_PIN, LOW); + // Set the user button to wake the board + sleep_interrupt(BUTTON_PIN, LOW); - // We sleep for the interval between messages minus the current millis - // this way we distribute the messages evenly every SEND_INTERVAL millis - uint32_t sleep_for = (millis() < SEND_INTERVAL) ? SEND_INTERVAL - millis() : SEND_INTERVAL; - sleep_millis(sleep_for); + // We sleep for the interval between messages minus the current millis + // this way we distribute the messages evenly every SEND_INTERVAL millis + uint32_t sleep_for = (millis() < SEND_INTERVAL) ? SEND_INTERVAL - millis() : SEND_INTERVAL; + sleep_millis(sleep_for); - #endif +#endif } void callback(uint8_t message) { - if (EV_JOINING == message) screen_print("Joining TTN...\n"); - if (EV_JOINED == message) screen_print("TTN joined!\n"); - if (EV_JOIN_FAILED == message) screen_print("TTN join failed\n"); - if (EV_REJOIN_FAILED == message) screen_print("TTN rejoin failed\n"); - if (EV_RESET == message) screen_print("Reset TTN connection\n"); - if (EV_LINK_DEAD == message) screen_print("TTN link dead\n"); - if (EV_ACK == message) screen_print("ACK received\n"); - if (EV_PENDING == message) screen_print("Message discarded\n"); - if (EV_QUEUED == message) screen_print("Message queued\n"); + if (EV_JOINING == message) screen_print("Joining TTN...\n"); + if (EV_JOINED == message) screen_print("TTN joined!\n"); + if (EV_JOIN_FAILED == message) screen_print("TTN join failed\n"); + if (EV_REJOIN_FAILED == message) screen_print("TTN rejoin failed\n"); + if (EV_RESET == message) screen_print("Reset TTN connection\n"); + if (EV_LINK_DEAD == message) screen_print("TTN link dead\n"); + if (EV_ACK == message) screen_print("ACK received\n"); + if (EV_PENDING == message) screen_print("Message discarded\n"); + if (EV_QUEUED == message) screen_print("Message queued\n"); - if (EV_TXCOMPLETE == message) { - screen_print("Message sent\n"); - sleep(); - } - - if (EV_RESPONSE == message) { - - screen_print("[TTN] Response: "); - - size_t len = ttn_response_len(); - uint8_t data[len]; - ttn_response(data, len); - - char buffer[6]; - for (uint8_t i=0; i SEND_INTERVAL) { - if (0 < gps_hdop() && gps_hdop() < 50 && gps_latitude() != 0 && gps_longitude() != 0) { - last = millis(); - first = false; - send(); - } else { - if (first) { - screen_print("Waiting GPS lock\n"); - first = false; - } - if (millis() > GPS_WAIT_FOR_LOCK) { - sleep(); - } - } + // Send every SEND_INTERVAL millis + static uint32_t last = 0; + static bool first = true; + if (0 == last || millis() - last > SEND_INTERVAL) { + if (0 < gps_hdop() && gps_hdop() < 50 && gps_latitude() != 0 && gps_longitude() != 0) { + last = millis(); + first = false; + Serial.println("TRANSMITTING"); + send(); + } else { + if (first) { + screen_print("Waiting GPS lock\n"); + first = false; + } + if (millis() > GPS_WAIT_FOR_LOCK) { + sleep(); + } } + } } diff --git a/main/ttn.ino b/main/ttn.ino index 84af1de..31472cb 100644 --- a/main/ttn.ino +++ b/main/ttn.ino @@ -155,6 +155,14 @@ void ttn_join() { // https://github.com/TheThingsNetwork/gateway-conf/blob/master/US-global_conf.json LMIC_selectSubBand(1); + #elif defined(CFG_au915) + Serial.println("AU_915"); + // NA-US channels 0-71 are configured automatically + // but only one group of 8 should (a subband) should be active + // TTN recommends the second sub band, 1 in a zero based count. + // https://github.com/TheThingsNetwork/gateway-conf/blob/master/US-global_conf.json + LMIC_selectSubBand(1); + #endif // If using a mono-channel gateway disable all channels @@ -210,6 +218,7 @@ void ttn_send(uint8_t * data, uint8_t data_size, uint8_t port, bool confirmed){ // Prepare upstream data transmission at the next possible time. // Parameters are port, data, length, confirmed + LMIC_setTxData2(port, data, data_size, confirmed ? 1 : 0); _ttn_callback(EV_QUEUED);