From a7b15a95aa8a0fd029bfd5ab27d63b2ff4b26881 Mon Sep 17 00:00:00 2001 From: unixweb Date: Fri, 4 Oct 2019 08:24:32 +0200 Subject: [PATCH] Added Code for Arduino --- ttn_gps_mapper.ino | 213 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 213 insertions(+) create mode 100644 ttn_gps_mapper.ino diff --git a/ttn_gps_mapper.ino b/ttn_gps_mapper.ino new file mode 100644 index 0000000..f36f44e --- /dev/null +++ b/ttn_gps_mapper.ino @@ -0,0 +1,213 @@ +#include +#include +#include +#include + +uint8_t coords[9]; + +static const int RXPin = 0, TXPin = 1; // TXPin not used / dummy +static const uint32_t GPSBaud = 9600; +// The TinyGPS++ object +TinyGPSPlus gps; +// The serial connection to the GPS device + +SoftwareSerial ss(RXPin, TXPin); +uint32_t timer = millis(); + +// LoraWAN Copyright (c) 2015 Thomas Telkamp and Matthijs Kooijman +// https://github.com/matthijskooijman/arduino-lmic +// -------- LoRa PinMapping FeatherWing Octopus + +// THIS WORKS ONLY with the two additional diodes see wiring diagram +const lmic_pinmap lmic_pins = { + .nss = 2, // Connected to pin D + .rxtx = LMIC_UNUSED_PIN, // For placeholder only, Do not connected on RFM92/RFM95 + .rst = LMIC_UNUSED_PIN, // Needed on RFM92/RFM95? (probably not) D0/GPIO16 + .dio = { + 15, 15, LMIC_UNUSED_PIN } +}; + +// replace with YOUR DEVEUI here use LSB and copy hex to replace 0x00 +static const u1_t PROGMEM DEVEUI[8]={ + 0x5C, 0xD6, 0xF2, 0x26, 0x4E, 0xFD, 0xA9, 0x00 }; +void os_getDevEui (u1_t* buf) { + memcpy_P(buf, DEVEUI, 8); +} + +// replace with YOUR APPEUI here use LSB and copy hex to replace 0x00 +static const u1_t PROGMEM APPEUI[8]={ + 0x62, 0x32, 0x02, 0xD0, 0x7E, 0xD5, 0xB3, 0x70 }; +void os_getArtEui (u1_t* buf) { + memcpy_P(buf, APPEUI, 8); +} + +// replace with YOUR APPKEY here use MSB and copy hex to replace 0x00 +static const u1_t PROGMEM APPKEY[16]={ + 0xCB, 0xB3, 0x67, 0x6F, 0x88, 0xB6, 0x26, 0x6F, 0x93, 0x9B, 0xE5, 0xC2, 0x5F, 0xF5, 0xE4, 0xE1 }; +void os_getDevKey (u1_t* buf) { + memcpy_P(buf, APPKEY, 16); +}; + +volatile int LoRaWAN_Tx_Ready = 0; // Merker für ACK + +int LoRaWAN_Rx_Payload = 0 ; +// -------- LoRa Event +void onEvent (ev_t ev) { + Serial.print(os_getTime()); + Serial.print(": "); + switch(ev) { + case EV_SCAN_TIMEOUT: + Serial.println(F("EV_SCAN_TIMEOUT")); + break; + case EV_BEACON_FOUND: + Serial.println(F("EV_BEACON_FOUND")); + break; + case EV_BEACON_MISSED: + Serial.println(F("EV_BEACON_MISSED")); + break; + case EV_BEACON_TRACKED: + Serial.println(F("EV_BEACON_TRACKED")); + break; + case EV_JOINING: + Serial.println(F("EV_JOINING")); + break; + case EV_JOINED: + Serial.println(F("EV_JOINED")); + // Disable link check validation (automatically enabled + // during join, but not supported by TTN at this time). + LMIC_setLinkCheckMode(0); + break; + case EV_RFU1: + Serial.println(F("EV_RFU1")); + break; + case EV_JOIN_FAILED: + Serial.println(F("EV_JOIN_FAILED")); + break; + case EV_REJOIN_FAILED: + Serial.println(F("EV_REJOIN_FAILED")); + break; + 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")); + LoRaWAN_Rx_Payload = 0; + for (int i = 0;i 0) + + if (gps.encode(ss.read())) + { + + if (gps.location.isValid()) { + + Serial.print(gps.altitude.meters(), 6); + Serial.print(F(",")); + Serial.print(gps.location.lat(), 6); + Serial.print(F(",")); + Serial.print(gps.location.lng(), 6); + Serial.print(F(",")); + Serial.println(gps.location.isValid(), 6); + + + if (LMIC.opmode & (1 << 7)) { + Serial.println(F("OP_TXRXPEND, not sending")); + } + else { + // Prepare upstream data transmission at the next possible time. + LoRaWAN_Tx_Ready = 0; + int32_t lati = gps.location.lat() * 10000; + int32_t lon = gps.location.lng() * 10000; + int32_t altitudeGPS = gps.altitude.meters(); // int16_t + int8_t hdopGPS = gps.hdop.value(); + + Serial.println(lati); + Serial.println(lon); + Serial.println(altitudeGPS); + Serial.println(hdopGPS); + + // Pad 2 int32_t to 6 8uint_t, big endian (24 bit each, having 11 meter precision) + coords[0] = lati; + coords[1] = lati >> 8; + coords[2] = lati >> 16; + + coords[3] = lon; + coords[4] = lon >> 8; + coords[5] = lon >> 16; + + coords[6] = altitudeGPS; + coords[7] = altitudeGPS >> 8; + + coords[8] = hdopGPS; + + LMIC_setTxData2(1, (uint8_t*) coords, sizeof(coords), 0); + + Serial.println(F("Packet queued")); + while(LoRaWAN_Tx_Ready==0) { + yield(); + os_runloop_once(); + }; // Warte bis gesendet + //} + // Blockende + Serial.print(F("Waiting ")); + + for (int i = 0;i<120;i++) { + Serial.print(F(".")); + delay(1000); // for test only - this results in 10 sec transmit, change to much high value to be conform with the duty cycle !!! + } + Serial.println(" done."); + + } + } else { + Serial.println("no GPS fix"); + } + } +}