From 36e6132348d796952cab3f3015efa10ce70d92fe Mon Sep 17 00:00:00 2001 From: Kent Wiliams Date: Mon, 11 May 2020 21:36:09 -0700 Subject: [PATCH 1/9] switched examples to sub-band 2 --- Adafruit-Feather-M0-RFM95/longfi-us915/longfi-us915.ino | 3 ++- GPS/longfi-us915-cargo-gps.ino | 3 ++- Heltec-CubeCell-Board/longfi-us915/longfi-us915.ino | 2 +- MCCI-Catena-4610/longfi-us915/longfi-us915.ino | 3 ++- ST-B-L072Z-LRWAN1/longfi-us915-button/longfi-us915-button.ino | 3 ++- .../longfi-us915-cayenne-sensor.ino | 3 ++- ST-B-L072Z-LRWAN1/longfi-us915/longfi-us915.ino | 3 ++- Sparkfun-Pro-RF/longfi-us915/longfi-us915.ino | 3 ++- 8 files changed, 15 insertions(+), 8 deletions(-) diff --git a/Adafruit-Feather-M0-RFM95/longfi-us915/longfi-us915.ino b/Adafruit-Feather-M0-RFM95/longfi-us915/longfi-us915.ino index b6cc54e..1c0ac10 100644 --- a/Adafruit-Feather-M0-RFM95/longfi-us915/longfi-us915.ino +++ b/Adafruit-Feather-M0-RFM95/longfi-us915/longfi-us915.ino @@ -172,7 +172,8 @@ void setup() { // (0.1% error, the most strict) can be used. LMIC_setClockError(1 * MAX_CLOCK_ERROR / 40); - LMIC_selectSubBand(6); + // Sub-band 2 - Helium Network + LMIC_selectSubBand(1); // zero indexed LMIC_setLinkCheckMode(0); LMIC_setDrTxpow(DR_SF7, 14); diff --git a/GPS/longfi-us915-cargo-gps.ino b/GPS/longfi-us915-cargo-gps.ino index ac41be1..1e6ad10 100644 --- a/GPS/longfi-us915-cargo-gps.ino +++ b/GPS/longfi-us915-cargo-gps.ino @@ -283,7 +283,8 @@ void setup() { LMIC_setLinkCheckMode(0); LMIC_setDrTxpow(DR_SF8, 20); - LMIC_selectSubBand(6); + // Sub-band 2 - Helium Network + LMIC_selectSubBand(1); // zero indexed GPS.begin(9600); // Only interrested in GGA, no antenna status diff --git a/Heltec-CubeCell-Board/longfi-us915/longfi-us915.ino b/Heltec-CubeCell-Board/longfi-us915/longfi-us915.ino index 661d6e4..4927640 100644 --- a/Heltec-CubeCell-Board/longfi-us915/longfi-us915.ino +++ b/Heltec-CubeCell-Board/longfi-us915/longfi-us915.ino @@ -21,7 +21,7 @@ uint8_t appSKey[] = { 0xd7, 0x2c, 0x78, 0x75, 0x8c, 0xdc, 0xca, 0xbf, 0x55, 0xee uint32_t devAddr = ( uint32_t )0x007e6ae1; /*LoraWan channelsmask, default channels 0-7*/ -uint16_t userChannelsMask[6]={ 0x0000,0x0000,0x0000,0x00FF,0x0000,0x0000 }; +uint16_t userChannelsMask[6]={ 0xFF00,0x0000,0x0000,0x0000,0x0000,0x0000 }; /*LoraWan region, select in arduino IDE tools*/ LoRaMacRegion_t loraWanRegion = ACTIVE_REGION; diff --git a/MCCI-Catena-4610/longfi-us915/longfi-us915.ino b/MCCI-Catena-4610/longfi-us915/longfi-us915.ino index 4074b96..4130be1 100644 --- a/MCCI-Catena-4610/longfi-us915/longfi-us915.ino +++ b/MCCI-Catena-4610/longfi-us915/longfi-us915.ino @@ -275,7 +275,8 @@ void setup() { LMIC_setLinkCheckMode(0); LMIC_setDrTxpow(DR_SF8, 20); - LMIC_selectSubBand(6); + // Sub-band 2 - Helium Network + LMIC_selectSubBand(1); // zero indexed // Start job (sending automatically starts OTAA too) do_send(&sendjob); diff --git a/ST-B-L072Z-LRWAN1/longfi-us915-button/longfi-us915-button.ino b/ST-B-L072Z-LRWAN1/longfi-us915-button/longfi-us915-button.ino index acf8de5..7c8913c 100644 --- a/ST-B-L072Z-LRWAN1/longfi-us915-button/longfi-us915-button.ino +++ b/ST-B-L072Z-LRWAN1/longfi-us915-button/longfi-us915-button.ino @@ -220,7 +220,8 @@ void setup() { LMIC_setLinkCheckMode(0); LMIC_setDrTxpow(DR_SF7,14); - LMIC_selectSubBand(6); + // Sub-band 2 - Helium Network + LMIC_selectSubBand(1); // zero indexed // Start job (sending automatically starts OTAA too) do_send(&sendjob); diff --git a/ST-B-L072Z-LRWAN1/longfi-us915-cayenne-sensor/longfi-us915-cayenne-sensor.ino b/ST-B-L072Z-LRWAN1/longfi-us915-cayenne-sensor/longfi-us915-cayenne-sensor.ino index 3c77094..d77cec1 100644 --- a/ST-B-L072Z-LRWAN1/longfi-us915-cayenne-sensor/longfi-us915-cayenne-sensor.ino +++ b/ST-B-L072Z-LRWAN1/longfi-us915-cayenne-sensor/longfi-us915-cayenne-sensor.ino @@ -357,7 +357,8 @@ void setup() { LMIC_setLinkCheckMode(0); LMIC_setDrTxpow(DR_SF8, 20); - LMIC_selectSubBand(6); + // Sub-band 2 - Helium Network + LMIC_selectSubBand(1); // zero indexed // Start job (sending automatically starts OTAA too) do_send(&sendjob); diff --git a/ST-B-L072Z-LRWAN1/longfi-us915/longfi-us915.ino b/ST-B-L072Z-LRWAN1/longfi-us915/longfi-us915.ino index 4074b96..37303ac 100644 --- a/ST-B-L072Z-LRWAN1/longfi-us915/longfi-us915.ino +++ b/ST-B-L072Z-LRWAN1/longfi-us915/longfi-us915.ino @@ -275,7 +275,8 @@ void setup() { LMIC_setLinkCheckMode(0); LMIC_setDrTxpow(DR_SF8, 20); - LMIC_selectSubBand(6); + // Sub-band 2 - Helium Network + LMIC_selectSubBand(1); // zero indexed // Start job (sending automatically starts OTAA too) do_send(&sendjob); diff --git a/Sparkfun-Pro-RF/longfi-us915/longfi-us915.ino b/Sparkfun-Pro-RF/longfi-us915/longfi-us915.ino index 8509148..dc97be1 100644 --- a/Sparkfun-Pro-RF/longfi-us915/longfi-us915.ino +++ b/Sparkfun-Pro-RF/longfi-us915/longfi-us915.ino @@ -135,7 +135,8 @@ void setup() { // (0.1% error, the most strict) can be used. LMIC_setClockError(1 * MAX_CLOCK_ERROR / 40); - LMIC_selectSubBand(6); + // Sub-band 2 - Helium Network + LMIC_selectSubBand(1); // zero indexed LMIC_setLinkCheckMode(0); LMIC_setDrTxpow(DR_SF7, 14); From edd9a26a3520e91b273caaedcee7ea6fe1fcc571 Mon Sep 17 00:00:00 2001 From: Kent Wiliams Date: Tue, 19 May 2020 10:27:53 -0700 Subject: [PATCH 2/9] updated for gnss --- .../longfi-us915-cayenne-gnss/README.md | 40 ++ .../longfi-us915-cayenne-gnss.ino | 507 ++++++++++++++++++ 2 files changed, 547 insertions(+) create mode 100644 ST-B-L072Z-LRWAN1/longfi-us915-cayenne-gnss/README.md create mode 100644 ST-B-L072Z-LRWAN1/longfi-us915-cayenne-gnss/longfi-us915-cayenne-gnss.ino diff --git a/ST-B-L072Z-LRWAN1/longfi-us915-cayenne-gnss/README.md b/ST-B-L072Z-LRWAN1/longfi-us915-cayenne-gnss/README.md new file mode 100644 index 0000000..208f4fc --- /dev/null +++ b/ST-B-L072Z-LRWAN1/longfi-us915-cayenne-gnss/README.md @@ -0,0 +1,40 @@ +# ST B-L072Z-LRWAN1 - GNSS Example + +This example demonstrates sending GNSS data in [CayenneLPP](https://developers.mydevices.com/cayenne/docs/lora/#lora-cayenne-low-power-payload) format, using a B-L072Z-LRWAN1 development board with a X-NUCLEO-GNSS1A1 expansion shield, to the myDevices Cayenne dashboard. For more information on adding your device to the Helium network, visit our quickstart guide [here](https://developer.helium.com/console/quickstart). For more information on adding your device to myDevices Cayenne, visit our guide [here](https://developer.helium.com/console/integrations/mydevices-cayenne-integration). + +## Required Arduino Libraries + +From the Arduino IDE, open the Library Manager (Sketch->Include Library->Manage Libraries). In the search box, type the library name below and install the latest version. + +[MCCI Arduino LoRaWAN Library](https://github.com/mcci-catena/arduino-lmic) +[CayenneLPP](https://github.com/ElectronicCats/CayenneLPP) +[X-NUCLEO-GNSS1A1](https://github.com/stm32duino/X-NUCLEO-GNSS1A1) + +## Required Arduino Board Support + +### B-L072Z-LRWAN1 - ST STM32L0 Discovery kit +Install board support package, find instructions [here](https://github.com/stm32duino/Arduino_Core_STM32#getting-started). + +Arduino IDE: +1. Select Tools -> Board: -> Discovery +2. Select Tools -> Board part number: -> Discovery L072Z-LRWAN1 + +## Required Hardware + +### B-L072Z-LRWAN1 - ST STM32L0 Discovery kit + +[B-L072Z-LRWAN1 Product Page](https://www.st.com/en/evaluation-tools/b-l072z-lrwan1.html) +[B-L072Z-LRWAN1 User Manual](https://www.st.com/content/ccc/resource/technical/document/user_manual/group0/ac/62/15/c7/60/ac/4e/9c/DM00329995/files/DM00329995.pdf/jcr:content/translations/en.DM00329995.pdf) + +### X-NUCLEO-IKS01A3 - ST Motion MEMS and Environmental Sensor Board + +[X-NUCLEO-IKS01A3 Product Page](https://www.st.com/en/ecosystems/x-nucleo-iks01a3.html) +[X-NUCLEO-IKS01A3 User Manual](https://www.st.com/resource/en/user_manual/dm00601501-getting-started-with-the-xnucleoiks01a3-motion-mems-and-environmental-sensor-expansion-board-for-stm32-nucleo-stmicroelectronics.pdf) +## Programming (Uploading Method): + +#### STM32CubeProgrammer(SWD) +Will use onboard ST-Link(Flasher/Debugger) to upload sketch. +Download and Install required utility from ST [here](https://www.st.com/en/development-tools/stm32cubeprog.html). + +Arduino IDE: +Select Tools -> Upload Method -> STM32CubeProgrammer(SWD) \ No newline at end of file diff --git a/ST-B-L072Z-LRWAN1/longfi-us915-cayenne-gnss/longfi-us915-cayenne-gnss.ino b/ST-B-L072Z-LRWAN1/longfi-us915-cayenne-gnss/longfi-us915-cayenne-gnss.ino new file mode 100644 index 0000000..2947088 --- /dev/null +++ b/ST-B-L072Z-LRWAN1/longfi-us915-cayenne-gnss/longfi-us915-cayenne-gnss.ino @@ -0,0 +1,507 @@ +/******************************************************************************* + * Copyright (c) 2015 Thomas Telkamp and Matthijs Kooijman + * Copyright (c) 2018 Terry Moore, MCCI + * + * Permission is hereby granted, free of charge, to anyone + * obtaining a copy of this document and accompanying files, + * to do whatever they want with them without any restriction, + * including, but not limited to, copying, modification and redistribution. + * NO WARRANTY OF ANY KIND IS PROVIDED. + * + * This example sends a valid LoRaWAN packet with payload "Hello, + * world!", using frequency and encryption settings matching those of + * the The Things Network. It's pre-configured for the Adafruit + * Feather M0 LoRa. + * + *******************************************************************************/ + +/******************************************************************************* + * + * For Helium developers, follow the Arduino Quickstart guide: + * https://developer.helium.com/device/arduino-quickstart + * TLDR: register your device on the Serial: + * https://Serial.helium.com/devices + * + * The App EUI (as lsb) and App Key (as msb) get inserted below. + * + *******************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include + + +#include +#include +#include + +//I2C communication parameters +#define DEFAULT_DEVICE_ADDRESS 0x3A +#define DEFAULT_DEVICE_PORT 0xFF +#define I2C_DELAY 1 + +#define RESET_PIN 7 + +#define DEV_I2C Wire + +// This is the "App EUI" in Helium. Make sure it is little-endian (lsb). +static const u1_t PROGMEM APPEUI[8] = {0}; +void os_getArtEui(u1_t *buf) { memcpy_P(buf, APPEUI, 8); } + +// This should also be in little endian format +// These are user configurable values and Helium Serial permits anything +static const u1_t PROGMEM DEVEUI[8] = {0}; +void os_getDevEui(u1_t *buf) { memcpy_P(buf, DEVEUI, 8); } + +// This is the "App Key" in Helium. It is big-endian (msb). +static const u1_t PROGMEM APPKEY[16] = {0}; +void os_getDevKey(u1_t *buf) { memcpy_P(buf, APPKEY, 16); } + +CayenneLPP lpp(51); +TwoWire& gps = DEV_I2C; +//I2C read data structures +char buff[32]; +int idx = 0; + +char nmeaBuffer[100]; +MicroNMEA nmea(nmeaBuffer, sizeof(nmeaBuffer)); + +bool ledState = LOW; +volatile bool ppsTriggered = false; + +void ppsHandler(void); +static osjob_t sendjob; +void do_send(osjob_t *j); + +// Schedule TX every this many seconds (might become longer due to duty +// cycle limitations). +const unsigned TX_INTERVAL = 60; + +// Pin mapping +// +// Adafruit BSPs are not consistent -- m0 express defs ARDUINO_SAMD_FEATHER_M0, +// m0 defs ADAFRUIT_FEATHER_M0 +// +#if defined(ARDUINO_SAMD_FEATHER_M0) || defined(ADAFRUIT_FEATHER_M0) +// Pin mapping for Adafruit Feather M0 LoRa, etc. +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, +}; +#elif defined(ARDUINO_AVR_FEATHER32U4) +// Pin mapping for Adafruit Feather 32u4 LoRa, etc. +// Just like Feather M0 LoRa, but uses SPI at 1MHz; and that's only +// because MCCI doesn't have a test board; probably higher frequencies +// will work. +const lmic_pinmap lmic_pins = { + .nss = 8, + .rxtx = LMIC_UNUSED_PIN, + .rst = 4, + .dio = {7, 6, LMIC_UNUSED_PIN}, + .rxtx_rx_active = 0, + .rssi_cal = 8, // LBT cal for the Adafruit Feather 32U4 LoRa, in dB + .spi_freq = 1000000, +}; +#elif defined(ARDUINO_CATENA_4551) +// Pin mapping for Murata module / Catena 4551 +const lmic_pinmap lmic_pins = { + .nss = 7, + .rxtx = 29, + .rst = 8, + .dio = + { + 25, // DIO0 (IRQ) is D25 + 26, // DIO1 is D26 + 27, // DIO2 is D27 + }, + .rxtx_rx_active = 1, + .rssi_cal = 10, + .spi_freq = 8000000 // 8MHz +}; +#elif defined(MCCI_CATENA_4610) +#include "arduino_lmic_hal_boards.h" +const lmic_pinmap lmic_pins = *Arduino_LMIC::GetPinmap_Catena4610(); +#elif defined(ARDUINO_DISCO_L072CZ_LRWAN1) +const lmic_pinmap lmic_pins = *Arduino_LMIC::GetPinmap_Disco_L072cz_Lrwan1(); +#else +#error "Unknown target" +#endif + +void ppsHandler(void) +{ + ppsTriggered = true; +} + +void gpsHardwareReset() +{ + //reset the device + digitalWrite(RESET_PIN, LOW); + delay(50); + digitalWrite(RESET_PIN, HIGH); + + //wait for reset to apply + delay(2000); +} + +//Read 32 bytes from I2C +void readI2C(char *inBuff) +{ + gps.beginTransmission(DEFAULT_DEVICE_ADDRESS); + gps.write((uint8_t) DEFAULT_DEVICE_PORT); + gps.endTransmission(false); + gps.requestFrom((uint8_t)DEFAULT_DEVICE_ADDRESS, (uint8_t) 32); + int i = 0; + while (gps.available()) + { + inBuff[i]= gps.read(); + i++; + } +} + +//Send a NMEA command via I2C +void sendCommand(char *cmd) +{ + gps.beginTransmission(DEFAULT_DEVICE_ADDRESS); + gps.write((uint8_t) DEFAULT_DEVICE_PORT); + MicroNMEA::sendSentence(gps, cmd); + gps.endTransmission(true); +} + +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_JOIN_TXCOMPLETE: + Serial.println(F("EV_JOIN_TXCOMPLETE")); + break; + case EV_JOINED: + Serial.println(F("EV_JOINED")); + { + u4_t netid = 0; + devaddr_t devaddr = 0; + u1_t nwkKey[16]; + u1_t artKey[16]; + LMIC_getSessionKeys(&netid, &devaddr, nwkKey, artKey); + Serial.print("netid: "); + Serial.println(netid, DEC); + Serial.print("devaddr: "); + Serial.println(devaddr, HEX); + Serial.print("artKey: "); + for (size_t i = 0; i < sizeof(artKey); ++i) { + if (i != 0) + Serial.print("-"); + Serial.print(artKey[i], HEX); + } + Serial.println(""); + Serial.print("nwkKey: "); + for (size_t i = 0; i < sizeof(nwkKey); ++i) { + if (i != 0) + Serial.print("-"); + Serial.print(nwkKey[i], HEX); + } + Serial.println(""); + } + // Disable link check validation (automatically enabled + // during join, but because slow data rates change max TX + // size, we don't use it in this example. + LMIC_setLinkCheckMode(0); + break; + /* + || This event is defined but not used in the code. No + || point in wasting codespace on it. + || + || 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")); + } + // 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; + /* + || This event is defined but not used in the code. No + || point in wasting codespace on it. + || + || case EV_SCAN_FOUND: + || Serial.println(F("EV_SCAN_FOUND")); + || break; + */ + case EV_TXSTART: + Serial.println(F("EV_TXSTART")); + break; + default: + Serial.print(F("Unknown event: ")); + Serial.println((unsigned)ev); + break; + } +} + +void readGPS() { + //If a message is recieved print all the informations + if (ppsTriggered) + { + ppsTriggered = false; + ledState = !ledState; + digitalWrite(LED_BUILTIN, ledState); + + // Output GPS information from previous second + Serial.print("Valid fix: "); + Serial.println(nmea.isValid() ? "yes" : "no"); + + Serial.print("Nav. system: "); + if (nmea.getNavSystem()) + Serial.println(nmea.getNavSystem()); + else + Serial.println("none"); + + Serial.print("Num. satellites: "); + Serial.println(nmea.getNumSatellites()); + + Serial.print("HDOP: "); + Serial.println(nmea.getHDOP()/10., 1); + + Serial.print("Date/time: "); + Serial.print(nmea.getYear()); + Serial.print('-'); + Serial.print(int(nmea.getMonth())); + Serial.print('-'); + Serial.print(int(nmea.getDay())); + Serial.print('T'); + Serial.print(int(nmea.getHour())); + Serial.print(':'); + Serial.print(int(nmea.getMinute())); + Serial.print(':'); + Serial.println(int(nmea.getSecond())); + + long latitude_mdeg = nmea.getLatitude(); + long longitude_mdeg = nmea.getLongitude(); + Serial.print("Latitude (deg): "); + Serial.println(latitude_mdeg / 1000000., 6); + + Serial.print("Longitude (deg): "); + Serial.println(longitude_mdeg / 1000000., 6); + + long alt; + Serial.print("Altitude (m): "); + if (nmea.getAltitude(alt)) + Serial.println(alt / 1000., 3); + else + Serial.println("not available"); + + Serial.print("Speed: "); + Serial.println(nmea.getSpeed() / 1000., 3); + Serial.print("Course: "); + Serial.println(nmea.getCourse() / 1000., 3); + Serial.println("-----------------------"); + nmea.clear(); + } + else + { + char c ; + if (idx == 0) + { + readI2C(buff); + delay(I2C_DELAY); + } + //Fetch the character one by one + c = buff[idx]; + idx++; + idx %= 32; + //If we have a valid character pass it to the library + if ((uint8_t) c != 0xFF) + { + Serial.print(c); + nmea.process(c); + } + } +} + +void do_send(osjob_t *j) { + // Check if there is not a current TX/RX job running + if (LMIC.opmode & OP_TXRXPEND) { + Serial.println(F("OP_TXRXPEND, not sending")); + } else { + // Prepare upstream data transmission at the next possible time. + LMIC_setTxData2(1, lpp.getBuffer(), lpp.getSize(), 0); + Serial.println(F("Packet queued")); + } + // Next TX is scheduled after TX_COMPLETE event. +} + +void setup() { + delay(2000); + while (!Serial) + ; + Serial.begin(9600); + Serial.println(F("Starting")); + + // Start GPS Setup + gps.begin(); + + pinMode(LED_BUILTIN, OUTPUT); + digitalWrite(LED_BUILTIN, ledState); + + //Start the module + pinMode(RESET_PIN, OUTPUT); + digitalWrite(RESET_PIN, HIGH); + Serial.println("Resetting GPS module ..."); + gpsHardwareReset(); + Serial.println("... done"); + + // Change the echoing messages to the ones recognized by the MicroNMEA library + sendCommand((char *)"$PSTMSETPAR,1231,0x00000042"); + sendCommand((char *)"$PSTMSAVEPAR"); + + //Reset the device so that the changes could take plaace + sendCommand((char *)"$PSTMSRR"); + + delay(4000); + + //Reinitialize I2C after the reset + gps.begin(); + + //clear i2c buffer + char c; + idx = 0; + memset(buff, 0, 32); + do + { + if (idx == 0) + { + readI2C(buff); + delay(I2C_DELAY); + } + c = buff[idx]; + idx++; + idx %= 32; + } + while ((uint8_t) c != 0xFF); + + pinMode(2, INPUT); + attachInterrupt(digitalPinToInterrupt(2), ppsHandler, RISING); + // End GPS Setup + + SPI.setMOSI(RADIO_MOSI_PORT); + SPI.setMISO(RADIO_MISO_PORT); + SPI.setSCLK(RADIO_SCLK_PORT); + SPI.setSSEL(RADIO_NSS_PORT); + + // LMIC init + os_init(); + // Reset the MAC state. Session and pending data transfers will be discarded. + LMIC_reset(); + + // allow much more clock error than the X/1000 default. See: + // https://github.com/mcci-catena/arduino-lorawan/issues/74#issuecomment-462171974 + // https://github.com/mcci-catena/arduino-lmic/commit/42da75b56#diff-16d75524a9920f5d043fe731a27cf85aL633 + // the X/1000 means an error rate of 0.1%; the above issue discusses using + // values up to 10%. so, values from 10 (10% error, the most lax) to 1000 + // (0.1% error, the most strict) can be used. + LMIC_setClockError(1 * MAX_CLOCK_ERROR / 40); + + LMIC_setLinkCheckMode(0); + LMIC_setDrTxpow(DR_SF8, 20); + // Sub-band 2 - Helium Network + LMIC_selectSubBand(1); // zero indexed + + // Start job (sending automatically starts OTAA too) + do_send(&sendjob); +} + +void loop() { + os_runloop_once(); + readGPS(); +} + +namespace Arduino_LMIC { + +class HalConfiguration_Disco_L072cz_Lrwan1_t : public HalConfiguration_t { +public: + enum DIGITAL_PINS : uint8_t { + PIN_SX1276_NSS = 37, + PIN_SX1276_NRESET = 33, + PIN_SX1276_DIO0 = 38, + PIN_SX1276_DIO1 = 39, + PIN_SX1276_DIO2 = 40, + PIN_SX1276_RXTX = 21, + }; + + virtual bool queryUsingTcxo(void) override { return false; }; +}; +// save some typing by bringing the pin numbers into scope +static HalConfiguration_Disco_L072cz_Lrwan1_t myConfig; + +static const HalPinmap_t myPinmap = { + .nss = HalConfiguration_Disco_L072cz_Lrwan1_t::PIN_SX1276_NSS, + .rxtx = HalConfiguration_Disco_L072cz_Lrwan1_t::PIN_SX1276_RXTX, + .rst = HalConfiguration_Disco_L072cz_Lrwan1_t::PIN_SX1276_NRESET, + + .dio = + { + HalConfiguration_Disco_L072cz_Lrwan1_t::PIN_SX1276_DIO0, + HalConfiguration_Disco_L072cz_Lrwan1_t::PIN_SX1276_DIO1, + HalConfiguration_Disco_L072cz_Lrwan1_t::PIN_SX1276_DIO2, + }, + .rxtx_rx_active = 1, + .rssi_cal = 10, + .spi_freq = 8000000, /* 8MHz */ + .pConfig = &myConfig}; + +}; // end namespace Arduino_LMIC From 5e4c7a90a1622e97c9158b1e9bf1eef8889b4b27 Mon Sep 17 00:00:00 2001 From: Kent Wiliams Date: Tue, 19 May 2020 10:33:53 -0700 Subject: [PATCH 3/9] add cayennelpp gps packing --- .../longfi-us915-cayenne-gnss/longfi-us915-cayenne-gnss.ino | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ST-B-L072Z-LRWAN1/longfi-us915-cayenne-gnss/longfi-us915-cayenne-gnss.ino b/ST-B-L072Z-LRWAN1/longfi-us915-cayenne-gnss/longfi-us915-cayenne-gnss.ino index 2947088..d16037e 100644 --- a/ST-B-L072Z-LRWAN1/longfi-us915-cayenne-gnss/longfi-us915-cayenne-gnss.ino +++ b/ST-B-L072Z-LRWAN1/longfi-us915-cayenne-gnss/longfi-us915-cayenne-gnss.ino @@ -301,6 +301,9 @@ void readGPS() { ledState = !ledState; digitalWrite(LED_BUILTIN, ledState); + // Clear Payload + lpp.reset(); + // Output GPS information from previous second Serial.print("Valid fix: "); Serial.println(nmea.isValid() ? "yes" : "no"); @@ -345,12 +348,15 @@ void readGPS() { else Serial.println("not available"); + lpp.addGPS(1, latitude_mdeg, longitude_mdeg, alt); + Serial.print("Speed: "); Serial.println(nmea.getSpeed() / 1000., 3); Serial.print("Course: "); Serial.println(nmea.getCourse() / 1000., 3); Serial.println("-----------------------"); nmea.clear(); + } else { From c4c3f1eab068e10b5cafb3dda29c217455efa941 Mon Sep 17 00:00:00 2001 From: Kent Wiliams Date: Tue, 19 May 2020 11:43:54 -0700 Subject: [PATCH 4/9] updated hardware section of readme --- ST-B-L072Z-LRWAN1/longfi-us915-cayenne-gnss/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ST-B-L072Z-LRWAN1/longfi-us915-cayenne-gnss/README.md b/ST-B-L072Z-LRWAN1/longfi-us915-cayenne-gnss/README.md index 208f4fc..2eb7a55 100644 --- a/ST-B-L072Z-LRWAN1/longfi-us915-cayenne-gnss/README.md +++ b/ST-B-L072Z-LRWAN1/longfi-us915-cayenne-gnss/README.md @@ -26,10 +26,10 @@ Arduino IDE: [B-L072Z-LRWAN1 Product Page](https://www.st.com/en/evaluation-tools/b-l072z-lrwan1.html) [B-L072Z-LRWAN1 User Manual](https://www.st.com/content/ccc/resource/technical/document/user_manual/group0/ac/62/15/c7/60/ac/4e/9c/DM00329995/files/DM00329995.pdf/jcr:content/translations/en.DM00329995.pdf) -### X-NUCLEO-IKS01A3 - ST Motion MEMS and Environmental Sensor Board +### X-NUCLEO-GNSS1A1 - ST GNSS expansion board based on Teseo-LIV3F module -[X-NUCLEO-IKS01A3 Product Page](https://www.st.com/en/ecosystems/x-nucleo-iks01a3.html) -[X-NUCLEO-IKS01A3 User Manual](https://www.st.com/resource/en/user_manual/dm00601501-getting-started-with-the-xnucleoiks01a3-motion-mems-and-environmental-sensor-expansion-board-for-stm32-nucleo-stmicroelectronics.pdf) +[X-NUCLEO-GNSS1A1 Product Page](https://www.st.com/en/ecosystems/x-nucleo-gnss1a1.html) +[X-NUCLEO-GNSS1A1 User Manual](https://www.st.com/resource/en/user_manual/dm00453103-getting-started-with-the-xnucleognss1a1-expansion-board-based-on-teseoliv3f-tiny-gnss-module-for-stm32-nucleo-stmicroelectronics.pdf) ## Programming (Uploading Method): #### STM32CubeProgrammer(SWD) From 09b9968f4b8aee5de1d81ada1f6aa8eeb5fbe9e7 Mon Sep 17 00:00:00 2001 From: Kent Wiliams Date: Tue, 19 May 2020 18:06:03 -0700 Subject: [PATCH 5/9] fixes --- .../longfi-us915-cayenne-gnss.ino | 236 ++++++++---------- 1 file changed, 111 insertions(+), 125 deletions(-) diff --git a/ST-B-L072Z-LRWAN1/longfi-us915-cayenne-gnss/longfi-us915-cayenne-gnss.ino b/ST-B-L072Z-LRWAN1/longfi-us915-cayenne-gnss/longfi-us915-cayenne-gnss.ino index d16037e..770fd0b 100644 --- a/ST-B-L072Z-LRWAN1/longfi-us915-cayenne-gnss/longfi-us915-cayenne-gnss.ino +++ b/ST-B-L072Z-LRWAN1/longfi-us915-cayenne-gnss/longfi-us915-cayenne-gnss.ino @@ -35,12 +35,11 @@ #include #include - +#include #include #include -#include -//I2C communication parameters +// I2C communication parameters #define DEFAULT_DEVICE_ADDRESS 0x3A #define DEFAULT_DEVICE_PORT 0xFF #define I2C_DELAY 1 @@ -63,8 +62,8 @@ static const u1_t PROGMEM APPKEY[16] = {0}; void os_getDevKey(u1_t *buf) { memcpy_P(buf, APPKEY, 16); } CayenneLPP lpp(51); -TwoWire& gps = DEV_I2C; -//I2C read data structures +TwoWire &gps = DEV_I2C; +// I2C read data structures char buff[32]; int idx = 0; @@ -137,44 +136,37 @@ const lmic_pinmap lmic_pins = *Arduino_LMIC::GetPinmap_Disco_L072cz_Lrwan1(); #error "Unknown target" #endif -void ppsHandler(void) -{ - ppsTriggered = true; +void ppsHandler(void) { ppsTriggered = true; } + +void gpsHardwareReset() { + // reset the device + digitalWrite(RESET_PIN, LOW); + delay(50); + digitalWrite(RESET_PIN, HIGH); + + // wait for reset to apply + delay(2000); } -void gpsHardwareReset() -{ - //reset the device - digitalWrite(RESET_PIN, LOW); - delay(50); - digitalWrite(RESET_PIN, HIGH); - - //wait for reset to apply - delay(2000); +// Read 32 bytes from I2C +void readI2C(char *inBuff) { + gps.beginTransmission(DEFAULT_DEVICE_ADDRESS); + gps.write((uint8_t)DEFAULT_DEVICE_PORT); + gps.endTransmission(false); + gps.requestFrom((uint8_t)DEFAULT_DEVICE_ADDRESS, (uint8_t)32); + int i = 0; + while (gps.available()) { + inBuff[i] = gps.read(); + i++; + } } -//Read 32 bytes from I2C -void readI2C(char *inBuff) -{ - gps.beginTransmission(DEFAULT_DEVICE_ADDRESS); - gps.write((uint8_t) DEFAULT_DEVICE_PORT); - gps.endTransmission(false); - gps.requestFrom((uint8_t)DEFAULT_DEVICE_ADDRESS, (uint8_t) 32); - int i = 0; - while (gps.available()) - { - inBuff[i]= gps.read(); - i++; - } -} - -//Send a NMEA command via I2C -void sendCommand(char *cmd) -{ - gps.beginTransmission(DEFAULT_DEVICE_ADDRESS); - gps.write((uint8_t) DEFAULT_DEVICE_PORT); - MicroNMEA::sendSentence(gps, cmd); - gps.endTransmission(true); +// Send a NMEA command via I2C +void sendCommand(char *cmd) { + gps.beginTransmission(DEFAULT_DEVICE_ADDRESS); + gps.write((uint8_t)DEFAULT_DEVICE_PORT); + MicroNMEA::sendSentence(gps, cmd); + gps.endTransmission(true); } void onEvent(ev_t ev) { @@ -294,89 +286,86 @@ void onEvent(ev_t ev) { } void readGPS() { - //If a message is recieved print all the informations - if (ppsTriggered) - { - ppsTriggered = false; - ledState = !ledState; - digitalWrite(LED_BUILTIN, ledState); + // If a message is recieved print all the informations + if (ppsTriggered) { + ppsTriggered = false; + ledState = !ledState; + digitalWrite(LED_BUILTIN, ledState); - // Clear Payload - lpp.reset(); + // Clear Payload + lpp.reset(); - // Output GPS information from previous second - Serial.print("Valid fix: "); - Serial.println(nmea.isValid() ? "yes" : "no"); + // Output GPS information from previous second + Serial.print("Valid fix: "); + Serial.println(nmea.isValid() ? "yes" : "no"); - Serial.print("Nav. system: "); - if (nmea.getNavSystem()) - Serial.println(nmea.getNavSystem()); - else - Serial.println("none"); + Serial.print("Nav. system: "); + if (nmea.getNavSystem()) + Serial.println(nmea.getNavSystem()); + else + Serial.println("none"); - Serial.print("Num. satellites: "); - Serial.println(nmea.getNumSatellites()); + Serial.print("Num. satellites: "); + Serial.println(nmea.getNumSatellites()); - Serial.print("HDOP: "); - Serial.println(nmea.getHDOP()/10., 1); + Serial.print("HDOP: "); + Serial.println(nmea.getHDOP() / 10., 1); - Serial.print("Date/time: "); - Serial.print(nmea.getYear()); - Serial.print('-'); - Serial.print(int(nmea.getMonth())); - Serial.print('-'); - Serial.print(int(nmea.getDay())); - Serial.print('T'); - Serial.print(int(nmea.getHour())); - Serial.print(':'); - Serial.print(int(nmea.getMinute())); - Serial.print(':'); - Serial.println(int(nmea.getSecond())); + Serial.print("Date/time: "); + Serial.print(nmea.getYear()); + Serial.print('-'); + Serial.print(int(nmea.getMonth())); + Serial.print('-'); + Serial.print(int(nmea.getDay())); + Serial.print('T'); + Serial.print(int(nmea.getHour())); + Serial.print(':'); + Serial.print(int(nmea.getMinute())); + Serial.print(':'); + Serial.println(int(nmea.getSecond())); - long latitude_mdeg = nmea.getLatitude(); - long longitude_mdeg = nmea.getLongitude(); - Serial.print("Latitude (deg): "); - Serial.println(latitude_mdeg / 1000000., 6); + long latitude_mdeg = nmea.getLatitude(); + long longitude_mdeg = nmea.getLongitude(); + Serial.print("Latitude (deg): "); + Serial.println(latitude_mdeg / 1000000., 6); - Serial.print("Longitude (deg): "); - Serial.println(longitude_mdeg / 1000000., 6); + Serial.print("Longitude (deg): "); + Serial.println(longitude_mdeg / 1000000., 6); - long alt; - Serial.print("Altitude (m): "); - if (nmea.getAltitude(alt)) - Serial.println(alt / 1000., 3); - else - Serial.println("not available"); + long alt; + Serial.print("Altitude (m): "); + if (nmea.getAltitude(alt)) + Serial.println(alt / 1000., 3); + else + Serial.println("not available"); - lpp.addGPS(1, latitude_mdeg, longitude_mdeg, alt); + // Pack CayenneLPP Payload + lpp.addGPS(1, latitude_mdeg, longitude_mdeg, alt); - Serial.print("Speed: "); - Serial.println(nmea.getSpeed() / 1000., 3); - Serial.print("Course: "); - Serial.println(nmea.getCourse() / 1000., 3); - Serial.println("-----------------------"); - nmea.clear(); - - } - else - { - char c ; - if (idx == 0) - { - readI2C(buff); - delay(I2C_DELAY); - } - //Fetch the character one by one - c = buff[idx]; - idx++; - idx %= 32; - //If we have a valid character pass it to the library - if ((uint8_t) c != 0xFF) - { - Serial.print(c); - nmea.process(c); - } - } + Serial.print("Speed: "); + Serial.println(nmea.getSpeed() / 1000., 3); + Serial.print("Course: "); + Serial.println(nmea.getCourse() / 1000., 3); + Serial.println("-----------------------"); + nmea.clear(); + } + + while (!ppsTriggered) { + char c; + if (idx == 0) { + readI2C(buff); + delay(I2C_DELAY); + } + // Fetch the character one by one + c = buff[idx]; + idx++; + idx %= 32; + // If we have a valid character pass it to the library + if ((uint8_t)c != 0xFF) { + Serial.print(c); + nmea.process(c); + } + } } void do_send(osjob_t *j) { @@ -404,7 +393,7 @@ void setup() { pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, ledState); - //Start the module + // Start the module pinMode(RESET_PIN, OUTPUT); digitalWrite(RESET_PIN, HIGH); Serial.println("Resetting GPS module ..."); @@ -415,30 +404,27 @@ void setup() { sendCommand((char *)"$PSTMSETPAR,1231,0x00000042"); sendCommand((char *)"$PSTMSAVEPAR"); - //Reset the device so that the changes could take plaace + // Reset the device so that the changes could take plaace sendCommand((char *)"$PSTMSRR"); delay(4000); - //Reinitialize I2C after the reset + // Reinitialize I2C after the reset gps.begin(); - //clear i2c buffer + // clear i2c buffer char c; idx = 0; memset(buff, 0, 32); - do - { - if (idx == 0) - { - readI2C(buff); - delay(I2C_DELAY); + do { + if (idx == 0) { + readI2C(buff); + delay(I2C_DELAY); } c = buff[idx]; idx++; idx %= 32; - } - while ((uint8_t) c != 0xFF); + } while ((uint8_t)c != 0xFF); pinMode(2, INPUT); attachInterrupt(digitalPinToInterrupt(2), ppsHandler, RISING); @@ -465,13 +451,13 @@ void setup() { LMIC_setLinkCheckMode(0); LMIC_setDrTxpow(DR_SF8, 20); // Sub-band 2 - Helium Network - LMIC_selectSubBand(1); // zero indexed + LMIC_selectSubBand(1); // zero indexed // Start job (sending automatically starts OTAA too) do_send(&sendjob); } -void loop() { +void loop() { os_runloop_once(); readGPS(); } From f578dadbd0f3d886dc6d581234b00b12e6b2cdca Mon Sep 17 00:00:00 2001 From: Kent Wiliams Date: Wed, 20 May 2020 10:53:39 -0700 Subject: [PATCH 6/9] changed to serial comm for gps --- .../longfi-us915-cayenne-gnss.ino | 441 ++++++++---------- 1 file changed, 197 insertions(+), 244 deletions(-) diff --git a/ST-B-L072Z-LRWAN1/longfi-us915-cayenne-gnss/longfi-us915-cayenne-gnss.ino b/ST-B-L072Z-LRWAN1/longfi-us915-cayenne-gnss/longfi-us915-cayenne-gnss.ino index 770fd0b..1054182 100644 --- a/ST-B-L072Z-LRWAN1/longfi-us915-cayenne-gnss/longfi-us915-cayenne-gnss.ino +++ b/ST-B-L072Z-LRWAN1/longfi-us915-cayenne-gnss/longfi-us915-cayenne-gnss.ino @@ -1,72 +1,37 @@ -/******************************************************************************* - * Copyright (c) 2015 Thomas Telkamp and Matthijs Kooijman - * Copyright (c) 2018 Terry Moore, MCCI - * - * Permission is hereby granted, free of charge, to anyone - * obtaining a copy of this document and accompanying files, - * to do whatever they want with them without any restriction, - * including, but not limited to, copying, modification and redistribution. - * NO WARRANTY OF ANY KIND IS PROVIDED. - * - * This example sends a valid LoRaWAN packet with payload "Hello, - * world!", using frequency and encryption settings matching those of - * the The Things Network. It's pre-configured for the Adafruit - * Feather M0 LoRa. - * - *******************************************************************************/ - -/******************************************************************************* - * - * For Helium developers, follow the Arduino Quickstart guide: - * https://developer.helium.com/device/arduino-quickstart - * TLDR: register your device on the Serial: - * https://Serial.helium.com/devices - * - * The App EUI (as lsb) and App Key (as msb) get inserted below. - * - *******************************************************************************/ - +#include #include -#include -#include -#include -#include -#include #include #include #include -#include -#include -// I2C communication parameters -#define DEFAULT_DEVICE_ADDRESS 0x3A -#define DEFAULT_DEVICE_PORT 0xFF -#define I2C_DELAY 1 +#define DEBUG + +#ifdef DEBUG +#define DEBUG_PRINT(x) Serial.print(x) +#define DEBUG_PRINTLN(x) Serial.println(x) +#else +#define DEBUG_PRINT(x) +#define DEBUG_PRINTLN(x) +#endif + +// Sensors +long longitude_mdeg; +long latitude_mdeg; +long alt; + +// Define Serial1 for STM32 Nucleo boards +#ifdef ARDUINO_ARCH_STM32 +HardwareSerial Serial1(PA10, PA9); +#endif #define RESET_PIN 7 -#define DEV_I2C Wire - -// This is the "App EUI" in Helium. Make sure it is little-endian (lsb). -static const u1_t PROGMEM APPEUI[8] = {0}; -void os_getArtEui(u1_t *buf) { memcpy_P(buf, APPEUI, 8); } - -// This should also be in little endian format -// These are user configurable values and Helium Serial permits anything -static const u1_t PROGMEM DEVEUI[8] = {0}; -void os_getDevEui(u1_t *buf) { memcpy_P(buf, DEVEUI, 8); } - -// This is the "App Key" in Helium. It is big-endian (msb). -static const u1_t PROGMEM APPKEY[16] = {0}; -void os_getDevKey(u1_t *buf) { memcpy_P(buf, APPKEY, 16); } - -CayenneLPP lpp(51); -TwoWire &gps = DEV_I2C; -// I2C read data structures -char buff[32]; -int idx = 0; +// Refer to serial devices by use +HardwareSerial &console = Serial; +HardwareSerial &gps = Serial1; +// MicroNMEA library structures char nmeaBuffer[100]; MicroNMEA nmea(nmeaBuffer, sizeof(nmeaBuffer)); @@ -74,12 +39,74 @@ bool ledState = LOW; volatile bool ppsTriggered = false; void ppsHandler(void); + +void ppsHandler(void) { ppsTriggered = true; } + +void gpsHardwareReset() { + // Empty input buffer + while (gps.available()) + gps.read(); + + // reset the device + digitalWrite(RESET_PIN, LOW); + delay(50); + digitalWrite(RESET_PIN, HIGH); + + // wait for reset to apply + delay(2000); +} + +// +// For normal use, we require that you edit the sketch to replace FILLMEIN +// with values assigned by the TTN console. However, for regression tests, +// we want to be able to compile these scripts. The regression tests define +// COMPILE_REGRESSION_TEST, and in that case we define FILLMEIN to a non- +// working but innocuous value. +// +#ifdef COMPILE_REGRESSION_TEST +#define FILLMEIN 0 +#else +#warning \ + "You must replace the values marked FILLMEIN with real values from the TTN control panel!" +#define FILLMEIN (#dont edit this, edit the lines that use FILLMEIN) +#endif + +// This EUI must be in little-endian format, so least-significant-byte +// first. When copying an EUI from ttnctl output, this means to reverse +// the bytes. For TTN issued EUIs the last bytes should be 0xD5, 0xB3, +// 0x70. +static const u1_t PROGMEM APPEUI[8] = {FILL_ME_IN}; +void os_getArtEui(u1_t *buf) { memcpy_P(buf, APPEUI, 8); } +//// This is the "App EUI" in Helium. Make sure it is little-endian (lsb). +// static const u1_t PROGMEM APPEUI[8] = {FILL_ME_IN}; +// void os_getArtEui(u1_t *buf) { memcpy_P(buf, APPEUI, 8); } + +// This should also be in little endian format, see above. +static const u1_t PROGMEM DEVEUI[8] = {FILL_ME_IN}; +void os_getDevEui(u1_t *buf) { memcpy_P(buf, DEVEUI, 8); } + +//// This should also be in little endian format +//// These are user configurable values and Helium console permits anything +// static const u1_t PROGMEM DEVEUI[8] = {FILL_ME_IN}; +// void os_getDevEui(u1_t *buf) { memcpy_P(buf, DEVEUI, 8); } + +// 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 the TTN console can be copied as-is. +static const u1_t PROGMEM APPKEY[16] = {FILL_ME_IN}; +void os_getDevKey(u1_t *buf) { memcpy_P(buf, APPKEY, 16); } + +//// This is the "App Key" in Helium. It is big-endian (msb). +// static const u1_t PROGMEM APPKEY[16] = {FILL_ME_IN}; +// void os_getDevKey(u1_t *buf) { memcpy_P(buf, APPKEY, 16); } + +CayenneLPP lpp(51); static osjob_t sendjob; void do_send(osjob_t *j); // Schedule TX every this many seconds (might become longer due to duty // cycle limitations). -const unsigned TX_INTERVAL = 60; +const unsigned TX_INTERVAL = 10; // Pin mapping // @@ -131,65 +158,38 @@ const lmic_pinmap lmic_pins = { #include "arduino_lmic_hal_boards.h" const lmic_pinmap lmic_pins = *Arduino_LMIC::GetPinmap_Catena4610(); #elif defined(ARDUINO_DISCO_L072CZ_LRWAN1) +#include "arduino_lmic_hal_boards.h" +// Pin mapping Discovery const lmic_pinmap lmic_pins = *Arduino_LMIC::GetPinmap_Disco_L072cz_Lrwan1(); #else #error "Unknown target" #endif -void ppsHandler(void) { ppsTriggered = true; } - -void gpsHardwareReset() { - // reset the device - digitalWrite(RESET_PIN, LOW); - delay(50); - digitalWrite(RESET_PIN, HIGH); - - // wait for reset to apply - delay(2000); -} - -// Read 32 bytes from I2C -void readI2C(char *inBuff) { - gps.beginTransmission(DEFAULT_DEVICE_ADDRESS); - gps.write((uint8_t)DEFAULT_DEVICE_PORT); - gps.endTransmission(false); - gps.requestFrom((uint8_t)DEFAULT_DEVICE_ADDRESS, (uint8_t)32); - int i = 0; - while (gps.available()) { - inBuff[i] = gps.read(); - i++; - } -} - -// Send a NMEA command via I2C -void sendCommand(char *cmd) { - gps.beginTransmission(DEFAULT_DEVICE_ADDRESS); - gps.write((uint8_t)DEFAULT_DEVICE_PORT); - MicroNMEA::sendSentence(gps, cmd); - gps.endTransmission(true); +void printHex2(unsigned v) { + v &= 0xff; + if (v < 16) + Serial.print('0'); + Serial.print(v, HEX); } void onEvent(ev_t ev) { - Serial.print(os_getTime()); - Serial.print(": "); + DEBUG_PRINT(os_getTime()); + DEBUG_PRINT(": "); switch (ev) { case EV_SCAN_TIMEOUT: - Serial.println(F("EV_SCAN_TIMEOUT")); + DEBUG_PRINTLN(F("EV_SCAN_TIMEOUT")); break; case EV_BEACON_FOUND: - Serial.println(F("EV_BEACON_FOUND")); + DEBUG_PRINTLN(F("EV_BEACON_FOUND")); break; case EV_BEACON_MISSED: - Serial.println(F("EV_BEACON_MISSED")); + DEBUG_PRINTLN(F("EV_BEACON_MISSED")); break; case EV_BEACON_TRACKED: - Serial.println(F("EV_BEACON_TRACKED")); + DEBUG_PRINTLN(F("EV_BEACON_TRACKED")); break; case EV_JOINING: - Serial.println(F("EV_JOINING")); - break; - case EV_JOIN_TXCOMPLETE: - Serial.println(F("EV_JOIN_TXCOMPLETE")); + DEBUG_PRINTLN(F("EV_JOINING")); break; case EV_JOINED: Serial.println(F("EV_JOINED")); @@ -203,20 +203,20 @@ void onEvent(ev_t ev) { Serial.println(netid, DEC); Serial.print("devaddr: "); Serial.println(devaddr, HEX); - Serial.print("artKey: "); + Serial.print("AppSKey: "); for (size_t i = 0; i < sizeof(artKey); ++i) { if (i != 0) Serial.print("-"); - Serial.print(artKey[i], HEX); + printHex2(artKey[i]); } Serial.println(""); - Serial.print("nwkKey: "); + Serial.print("NwkSKey: "); for (size_t i = 0; i < sizeof(nwkKey); ++i) { if (i != 0) Serial.print("-"); - Serial.print(nwkKey[i], HEX); + printHex2(nwkKey[i]); } - Serial.println(""); + Serial.println(); } // Disable link check validation (automatically enabled // during join, but because slow data rates change max TX @@ -224,12 +224,12 @@ void onEvent(ev_t ev) { LMIC_setLinkCheckMode(0); break; /* - || This event is defined but not used in the code. No - || point in wasting codespace on it. - || - || case EV_RFU1: - || Serial.println(F("EV_RFU1")); - || break; + || This event is defined but not used in the code. No + || point in wasting codespace on it. + || + || case EV_RFU1: + || DEBUG_PRINTLN(F("EV_RFU1")); + || break; */ case EV_JOIN_FAILED: Serial.println(F("EV_JOIN_FAILED")); @@ -268,16 +268,26 @@ void onEvent(ev_t ev) { Serial.println(F("EV_LINK_ALIVE")); break; /* - || This event is defined but not used in the code. No - || point in wasting codespace on it. - || - || case EV_SCAN_FOUND: - || Serial.println(F("EV_SCAN_FOUND")); - || break; + || This event is defined but not used in the code. No + || point in wasting codespace on it. + || + || case EV_SCAN_FOUND: + || DEBUG_PRINTLN(F("EV_SCAN_FOUND")); + || break; */ case EV_TXSTART: Serial.println(F("EV_TXSTART")); break; + case EV_TXCANCELED: + Serial.println(F("EV_TXCANCELED")); + break; + case EV_RXSTART: + /* do not print anything -- it wrecks timing */ + break; + case EV_JOIN_TXCOMPLETE: + Serial.println(F("EV_JOIN_TXCOMPLETE: no JoinAccept")); + break; + default: Serial.print(F("Unknown event: ")); Serial.println((unsigned)ev); @@ -286,7 +296,7 @@ void onEvent(ev_t ev) { } void readGPS() { - // If a message is recieved print all the informations + // If a message is received, print all the info if (ppsTriggered) { ppsTriggered = false; ledState = !ledState; @@ -296,99 +306,90 @@ void readGPS() { lpp.reset(); // Output GPS information from previous second - Serial.print("Valid fix: "); - Serial.println(nmea.isValid() ? "yes" : "no"); + DEBUG_PRINT("Valid fix: "); + DEBUG_PRINTLN(nmea.isValid() ? "yes" : "no"); - Serial.print("Nav. system: "); + DEBUG_PRINT("Nav. system: "); if (nmea.getNavSystem()) - Serial.println(nmea.getNavSystem()); + DEBUG_PRINTLN(nmea.getNavSystem()); else - Serial.println("none"); + DEBUG_PRINTLN("none"); - Serial.print("Num. satellites: "); - Serial.println(nmea.getNumSatellites()); + DEBUG_PRINT("Num. satellites: "); + DEBUG_PRINTLN(nmea.getNumSatellites()); - Serial.print("HDOP: "); - Serial.println(nmea.getHDOP() / 10., 1); + DEBUG_PRINT("HDOP: "); + DEBUG_PRINTLN(nmea.getHDOP() / 10.); //, 1); - Serial.print("Date/time: "); - Serial.print(nmea.getYear()); - Serial.print('-'); - Serial.print(int(nmea.getMonth())); - Serial.print('-'); - Serial.print(int(nmea.getDay())); - Serial.print('T'); - Serial.print(int(nmea.getHour())); - Serial.print(':'); - Serial.print(int(nmea.getMinute())); - Serial.print(':'); - Serial.println(int(nmea.getSecond())); + DEBUG_PRINT("Date/time: "); + DEBUG_PRINT(nmea.getYear()); + DEBUG_PRINT('-'); + DEBUG_PRINT(int(nmea.getMonth())); + DEBUG_PRINT('-'); + DEBUG_PRINT(int(nmea.getDay())); + DEBUG_PRINT('T'); + DEBUG_PRINT(int(nmea.getHour())); + DEBUG_PRINT(':'); + DEBUG_PRINT(int(nmea.getMinute())); + DEBUG_PRINT(':'); + DEBUG_PRINTLN(int(nmea.getSecond())); - long latitude_mdeg = nmea.getLatitude(); - long longitude_mdeg = nmea.getLongitude(); - Serial.print("Latitude (deg): "); - Serial.println(latitude_mdeg / 1000000., 6); + latitude_mdeg = nmea.getLatitude(); + longitude_mdeg = nmea.getLongitude(); - Serial.print("Longitude (deg): "); - Serial.println(longitude_mdeg / 1000000., 6); + DEBUG_PRINT("Latitude (deg): "); + DEBUG_PRINTLN(latitude_mdeg / 1000000.); //, 6); - long alt; - Serial.print("Altitude (m): "); + DEBUG_PRINT("Longitude (deg): "); + DEBUG_PRINTLN(longitude_mdeg / 1000000.); //, 6); + + // long alt; + DEBUG_PRINT("Altitude (m): "); if (nmea.getAltitude(alt)) - Serial.println(alt / 1000., 3); + DEBUG_PRINTLN(alt / 1000.); //, 3); else - Serial.println("not available"); + DEBUG_PRINTLN("not available"); - // Pack CayenneLPP Payload - lpp.addGPS(1, latitude_mdeg, longitude_mdeg, alt); + lpp.addGPS(1, latitude_mdeg / 1000000, longitude_mdeg / 1000000, + alt / 1000); - Serial.print("Speed: "); - Serial.println(nmea.getSpeed() / 1000., 3); - Serial.print("Course: "); - Serial.println(nmea.getCourse() / 1000., 3); - Serial.println("-----------------------"); + DEBUG_PRINT("Speed: "); + DEBUG_PRINTLN(nmea.getSpeed() / 1000.); //, 3); + DEBUG_PRINT("Course: "); + DEBUG_PRINTLN(nmea.getCourse() / 1000.); //, 3); + + DEBUG_PRINTLN("-----------------------"); nmea.clear(); } - while (!ppsTriggered) { - char c; - if (idx == 0) { - readI2C(buff); - delay(I2C_DELAY); - } + // While the message isn't complete + while (!ppsTriggered && gps.available()) { // Fetch the character one by one - c = buff[idx]; - idx++; - idx %= 32; - // If we have a valid character pass it to the library - if ((uint8_t)c != 0xFF) { - Serial.print(c); - nmea.process(c); - } + char c = gps.read(); + DEBUG_PRINT(c); + // Pass the character to the library + nmea.process(c); } } void do_send(osjob_t *j) { // Check if there is not a current TX/RX job running if (LMIC.opmode & OP_TXRXPEND) { - Serial.println(F("OP_TXRXPEND, not sending")); + DEBUG_PRINTLN(F("OP_TXRXPEND, not sending")); } else { // Prepare upstream data transmission at the next possible time. LMIC_setTxData2(1, lpp.getBuffer(), lpp.getSize(), 0); - Serial.println(F("Packet queued")); + DEBUG_PRINTLN(F("Packet queued")); } // Next TX is scheduled after TX_COMPLETE event. } -void setup() { - delay(2000); - while (!Serial) - ; - Serial.begin(9600); - Serial.println(F("Starting")); +void setup(void) { + delay(3000); + console.begin(115200); // console + DEBUG_PRINTLN("Starting #IoTForGood GPS Example..."); - // Start GPS Setup - gps.begin(); + gps.begin(9600); // gps pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, ledState); @@ -396,44 +397,32 @@ void setup() { // Start the module pinMode(RESET_PIN, OUTPUT); digitalWrite(RESET_PIN, HIGH); - Serial.println("Resetting GPS module ..."); + DEBUG_PRINTLN("Resetting GPS module ..."); gpsHardwareReset(); - Serial.println("... done"); + DEBUG_PRINTLN("... done"); // Change the echoing messages to the ones recognized by the MicroNMEA library - sendCommand((char *)"$PSTMSETPAR,1231,0x00000042"); - sendCommand((char *)"$PSTMSAVEPAR"); + MicroNMEA::sendSentence(gps, "$PSTMSETPAR,1201,0x00000042"); + MicroNMEA::sendSentence(gps, "$PSTMSAVEPAR"); // Reset the device so that the changes could take plaace - sendCommand((char *)"$PSTMSRR"); + MicroNMEA::sendSentence(gps, "$PSTMSRR"); delay(4000); - // Reinitialize I2C after the reset - gps.begin(); + // clear serial buffer + while (gps.available()) + gps.read(); - // clear i2c buffer - char c; - idx = 0; - memset(buff, 0, 32); - do { - if (idx == 0) { - readI2C(buff); - delay(I2C_DELAY); - } - c = buff[idx]; - idx++; - idx %= 32; - } while ((uint8_t)c != 0xFF); - - pinMode(2, INPUT); - attachInterrupt(digitalPinToInterrupt(2), ppsHandler, RISING); - // End GPS Setup + pinMode(6, INPUT); + attachInterrupt(digitalPinToInterrupt(6), ppsHandler, RISING); +#if defined(ARDUINO_DISCO_L072CZ_LRWAN1) SPI.setMOSI(RADIO_MOSI_PORT); SPI.setMISO(RADIO_MISO_PORT); SPI.setSCLK(RADIO_SCLK_PORT); SPI.setSSEL(RADIO_NSS_PORT); +#endif // LMIC init os_init(); @@ -449,7 +438,7 @@ void setup() { LMIC_setClockError(1 * MAX_CLOCK_ERROR / 40); LMIC_setLinkCheckMode(0); - LMIC_setDrTxpow(DR_SF8, 20); + LMIC_setDrTxpow(DR_SF7, 14); // Sub-band 2 - Helium Network LMIC_selectSubBand(1); // zero indexed @@ -457,43 +446,7 @@ void setup() { do_send(&sendjob); } -void loop() { +void loop(void) { os_runloop_once(); readGPS(); -} - -namespace Arduino_LMIC { - -class HalConfiguration_Disco_L072cz_Lrwan1_t : public HalConfiguration_t { -public: - enum DIGITAL_PINS : uint8_t { - PIN_SX1276_NSS = 37, - PIN_SX1276_NRESET = 33, - PIN_SX1276_DIO0 = 38, - PIN_SX1276_DIO1 = 39, - PIN_SX1276_DIO2 = 40, - PIN_SX1276_RXTX = 21, - }; - - virtual bool queryUsingTcxo(void) override { return false; }; -}; -// save some typing by bringing the pin numbers into scope -static HalConfiguration_Disco_L072cz_Lrwan1_t myConfig; - -static const HalPinmap_t myPinmap = { - .nss = HalConfiguration_Disco_L072cz_Lrwan1_t::PIN_SX1276_NSS, - .rxtx = HalConfiguration_Disco_L072cz_Lrwan1_t::PIN_SX1276_RXTX, - .rst = HalConfiguration_Disco_L072cz_Lrwan1_t::PIN_SX1276_NRESET, - - .dio = - { - HalConfiguration_Disco_L072cz_Lrwan1_t::PIN_SX1276_DIO0, - HalConfiguration_Disco_L072cz_Lrwan1_t::PIN_SX1276_DIO1, - HalConfiguration_Disco_L072cz_Lrwan1_t::PIN_SX1276_DIO2, - }, - .rxtx_rx_active = 1, - .rssi_cal = 10, - .spi_freq = 8000000, /* 8MHz */ - .pConfig = &myConfig}; - -}; // end namespace Arduino_LMIC +} \ No newline at end of file From 29e908c5e4023556041384259dbaee0aaeb79485 Mon Sep 17 00:00:00 2001 From: tteague Date: Thu, 21 May 2020 03:14:51 -0500 Subject: [PATCH 7/9] Update longfi-us915-cayenne-gnss.ino Added code to work with ST GNSS shield --- .../longfi-us915-cayenne-gnss.ino | 151 +++++++----------- 1 file changed, 56 insertions(+), 95 deletions(-) diff --git a/ST-B-L072Z-LRWAN1/longfi-us915-cayenne-gnss/longfi-us915-cayenne-gnss.ino b/ST-B-L072Z-LRWAN1/longfi-us915-cayenne-gnss/longfi-us915-cayenne-gnss.ino index 1054182..28b7e0b 100644 --- a/ST-B-L072Z-LRWAN1/longfi-us915-cayenne-gnss/longfi-us915-cayenne-gnss.ino +++ b/ST-B-L072Z-LRWAN1/longfi-us915-cayenne-gnss/longfi-us915-cayenne-gnss.ino @@ -5,19 +5,9 @@ #include -#define DEBUG - -#ifdef DEBUG -#define DEBUG_PRINT(x) Serial.print(x) -#define DEBUG_PRINTLN(x) Serial.println(x) -#else -#define DEBUG_PRINT(x) -#define DEBUG_PRINTLN(x) -#endif - // Sensors -long longitude_mdeg; -long latitude_mdeg; +float longitude_mdeg; +float latitude_mdeg; long alt; // Define Serial1 for STM32 Nucleo boards @@ -56,50 +46,19 @@ void gpsHardwareReset() { delay(2000); } -// -// For normal use, we require that you edit the sketch to replace FILLMEIN -// with values assigned by the TTN console. However, for regression tests, -// we want to be able to compile these scripts. The regression tests define -// COMPILE_REGRESSION_TEST, and in that case we define FILLMEIN to a non- -// working but innocuous value. -// -#ifdef COMPILE_REGRESSION_TEST -#define FILLMEIN 0 -#else -#warning \ - "You must replace the values marked FILLMEIN with real values from the TTN control panel!" -#define FILLMEIN (#dont edit this, edit the lines that use FILLMEIN) -#endif - -// This EUI must be in little-endian format, so least-significant-byte -// first. When copying an EUI from ttnctl output, this means to reverse -// the bytes. For TTN issued EUIs the last bytes should be 0xD5, 0xB3, -// 0x70. +// This is the "App EUI" in Helium. Make sure it is little-endian (lsb). static const u1_t PROGMEM APPEUI[8] = {FILL_ME_IN}; void os_getArtEui(u1_t *buf) { memcpy_P(buf, APPEUI, 8); } -//// This is the "App EUI" in Helium. Make sure it is little-endian (lsb). -// static const u1_t PROGMEM APPEUI[8] = {FILL_ME_IN}; -// void os_getArtEui(u1_t *buf) { memcpy_P(buf, APPEUI, 8); } -// This should also be in little endian format, see above. +// This should also be in little endian format +// These are user configurable values and Helium console permits anything static const u1_t PROGMEM DEVEUI[8] = {FILL_ME_IN}; void os_getDevEui(u1_t *buf) { memcpy_P(buf, DEVEUI, 8); } -//// This should also be in little endian format -//// These are user configurable values and Helium console permits anything -// static const u1_t PROGMEM DEVEUI[8] = {FILL_ME_IN}; -// void os_getDevEui(u1_t *buf) { memcpy_P(buf, DEVEUI, 8); } - -// 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 the TTN console can be copied as-is. +// This is the "App Key" in Helium. It is big-endian (msb). static const u1_t PROGMEM APPKEY[16] = {FILL_ME_IN}; void os_getDevKey(u1_t *buf) { memcpy_P(buf, APPKEY, 16); } -//// This is the "App Key" in Helium. It is big-endian (msb). -// static const u1_t PROGMEM APPKEY[16] = {FILL_ME_IN}; -// void os_getDevKey(u1_t *buf) { memcpy_P(buf, APPKEY, 16); } - CayenneLPP lpp(51); static osjob_t sendjob; void do_send(osjob_t *j); @@ -173,23 +132,23 @@ void printHex2(unsigned v) { } void onEvent(ev_t ev) { - DEBUG_PRINT(os_getTime()); - DEBUG_PRINT(": "); + Serial.print(os_getTime()); + Serial.print(": "); switch (ev) { case EV_SCAN_TIMEOUT: - DEBUG_PRINTLN(F("EV_SCAN_TIMEOUT")); + Serial.println(F("EV_SCAN_TIMEOUT")); break; case EV_BEACON_FOUND: - DEBUG_PRINTLN(F("EV_BEACON_FOUND")); + Serial.println(F("EV_BEACON_FOUND")); break; case EV_BEACON_MISSED: - DEBUG_PRINTLN(F("EV_BEACON_MISSED")); + Serial.println(F("EV_BEACON_MISSED")); break; case EV_BEACON_TRACKED: - DEBUG_PRINTLN(F("EV_BEACON_TRACKED")); + Serial.println(F("EV_BEACON_TRACKED")); break; case EV_JOINING: - DEBUG_PRINTLN(F("EV_JOINING")); + Serial.println(F("EV_JOINING")); break; case EV_JOINED: Serial.println(F("EV_JOINED")); @@ -306,59 +265,60 @@ void readGPS() { lpp.reset(); // Output GPS information from previous second - DEBUG_PRINT("Valid fix: "); - DEBUG_PRINTLN(nmea.isValid() ? "yes" : "no"); + Serial.print("Valid fix: "); + Serial.println(nmea.isValid() ? "yes" : "no"); - DEBUG_PRINT("Nav. system: "); + Serial.print("Nav. system: "); if (nmea.getNavSystem()) - DEBUG_PRINTLN(nmea.getNavSystem()); + Serial.println(nmea.getNavSystem()); else - DEBUG_PRINTLN("none"); + Serial.println("none"); - DEBUG_PRINT("Num. satellites: "); - DEBUG_PRINTLN(nmea.getNumSatellites()); + Serial.print("Num. satellites: "); + Serial.println(nmea.getNumSatellites()); - DEBUG_PRINT("HDOP: "); - DEBUG_PRINTLN(nmea.getHDOP() / 10.); //, 1); + Serial.print("HDOP: "); + Serial.println(nmea.getHDOP() / 10., 1); - DEBUG_PRINT("Date/time: "); - DEBUG_PRINT(nmea.getYear()); - DEBUG_PRINT('-'); - DEBUG_PRINT(int(nmea.getMonth())); - DEBUG_PRINT('-'); - DEBUG_PRINT(int(nmea.getDay())); - DEBUG_PRINT('T'); - DEBUG_PRINT(int(nmea.getHour())); - DEBUG_PRINT(':'); - DEBUG_PRINT(int(nmea.getMinute())); - DEBUG_PRINT(':'); - DEBUG_PRINTLN(int(nmea.getSecond())); + Serial.print("Date/time: "); + Serial.print(nmea.getYear()); + Serial.print('-'); + Serial.print(int(nmea.getMonth())); + Serial.print('-'); + Serial.print(int(nmea.getDay())); + Serial.print('T'); + Serial.print(int(nmea.getHour())); + Serial.print(':'); + Serial.print(int(nmea.getMinute())); + Serial.print(':'); + Serial.println(int(nmea.getSecond())); latitude_mdeg = nmea.getLatitude(); longitude_mdeg = nmea.getLongitude(); - DEBUG_PRINT("Latitude (deg): "); - DEBUG_PRINTLN(latitude_mdeg / 1000000.); //, 6); + Serial.print("Latitude (deg): "); + Serial.println(latitude_mdeg / 1000000., 6); - DEBUG_PRINT("Longitude (deg): "); - DEBUG_PRINTLN(longitude_mdeg / 1000000.); //, 6); + Serial.print("Longitude (deg): "); + Serial.println(longitude_mdeg / 1000000., 6); // long alt; - DEBUG_PRINT("Altitude (m): "); + Serial.print("Altitude (m): "); if (nmea.getAltitude(alt)) - DEBUG_PRINTLN(alt / 1000.); //, 3); + Serial.println(alt / 1000., 3); else - DEBUG_PRINTLN("not available"); + Serial.println("not available"); + // if (nmea.isValid()) { lpp.addGPS(1, latitude_mdeg / 1000000, longitude_mdeg / 1000000, alt / 1000); + //}; + Serial.print("Speed: "); + Serial.println(nmea.getSpeed() / 1000., 3); + Serial.print("Course: "); + Serial.println(nmea.getCourse() / 1000., 3); - DEBUG_PRINT("Speed: "); - DEBUG_PRINTLN(nmea.getSpeed() / 1000.); //, 3); - DEBUG_PRINT("Course: "); - DEBUG_PRINTLN(nmea.getCourse() / 1000.); //, 3); - - DEBUG_PRINTLN("-----------------------"); + Serial.println("-----------------------"); nmea.clear(); } @@ -366,7 +326,7 @@ void readGPS() { while (!ppsTriggered && gps.available()) { // Fetch the character one by one char c = gps.read(); - DEBUG_PRINT(c); + Serial.print(c); // Pass the character to the library nmea.process(c); } @@ -375,11 +335,11 @@ void readGPS() { void do_send(osjob_t *j) { // Check if there is not a current TX/RX job running if (LMIC.opmode & OP_TXRXPEND) { - DEBUG_PRINTLN(F("OP_TXRXPEND, not sending")); + Serial.println(F("OP_TXRXPEND, not sending")); } else { // Prepare upstream data transmission at the next possible time. LMIC_setTxData2(1, lpp.getBuffer(), lpp.getSize(), 0); - DEBUG_PRINTLN(F("Packet queued")); + Serial.println(F("Packet queued")); } // Next TX is scheduled after TX_COMPLETE event. } @@ -387,7 +347,7 @@ void do_send(osjob_t *j) { void setup(void) { delay(3000); console.begin(115200); // console - DEBUG_PRINTLN("Starting #IoTForGood GPS Example..."); + Serial.println("Starting #IoTForGood GPS Example..."); gps.begin(9600); // gps @@ -397,9 +357,10 @@ void setup(void) { // Start the module pinMode(RESET_PIN, OUTPUT); digitalWrite(RESET_PIN, HIGH); - DEBUG_PRINTLN("Resetting GPS module ..."); + Serial.println(); + Serial.println("Resetting GPS module ..."); gpsHardwareReset(); - DEBUG_PRINTLN("... done"); + Serial.println("done."); // Change the echoing messages to the ones recognized by the MicroNMEA library MicroNMEA::sendSentence(gps, "$PSTMSETPAR,1201,0x00000042"); @@ -449,4 +410,4 @@ void setup(void) { void loop(void) { os_runloop_once(); readGPS(); -} \ No newline at end of file +} From b285da67b29c7a280d997e0cba7bf696d27bb1f2 Mon Sep 17 00:00:00 2001 From: Kent Wiliams Date: Tue, 26 May 2020 12:30:40 -0700 Subject: [PATCH 8/9] cleanup --- .../longfi-us915-cayenne-gnss.ino | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/ST-B-L072Z-LRWAN1/longfi-us915-cayenne-gnss/longfi-us915-cayenne-gnss.ino b/ST-B-L072Z-LRWAN1/longfi-us915-cayenne-gnss/longfi-us915-cayenne-gnss.ino index 28b7e0b..288abe9 100644 --- a/ST-B-L072Z-LRWAN1/longfi-us915-cayenne-gnss/longfi-us915-cayenne-gnss.ino +++ b/ST-B-L072Z-LRWAN1/longfi-us915-cayenne-gnss/longfi-us915-cayenne-gnss.ino @@ -1,5 +1,10 @@ #include #include +#include +#include +#include +#include +#include #include #include @@ -65,7 +70,7 @@ void do_send(osjob_t *j); // Schedule TX every this many seconds (might become longer due to duty // cycle limitations). -const unsigned TX_INTERVAL = 10; +const unsigned TX_INTERVAL = 60; // Pin mapping // @@ -309,10 +314,9 @@ void readGPS() { else Serial.println("not available"); - // if (nmea.isValid()) { lpp.addGPS(1, latitude_mdeg / 1000000, longitude_mdeg / 1000000, alt / 1000); - //}; + Serial.print("Speed: "); Serial.println(nmea.getSpeed() / 1000., 3); Serial.print("Course: "); From 66b6796962def76255bc68b6e82549b52540a9b5 Mon Sep 17 00:00:00 2001 From: Kent Wiliams Date: Tue, 26 May 2020 12:32:44 -0700 Subject: [PATCH 9/9] updated main readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e454760..cc8d998 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ Here you will find a collection of Arduino sketch examples of transmitting on th * [longfi-us915](ST-B-L072Z-LRWAN1/longfi-us915) * [longfi-us915-button](ST-B-L072Z-LRWAN1/longfi-us915-button) * [longfi-us915-cayenne-sensor](ST-B-L072Z-LRWAN1/longfi-us915-cayenne-sensor) -* [longfi-us915-cargo-gps](GPS) +* [longfi-us915-cayenne-gnss](ST-B-L072Z-LRWAN1/longfi-us915-cayenne-gnss) ### MCCI Catena 4610 * [longfi-us915](MCCI-Catena-4610/longfi-us915)