diff --git a/sodaq_one_gps_battery/Sodaq_RN2483.cpp b/sodaq_one_gps_battery/Sodaq_RN2483.cpp new file mode 120000 index 0000000..5102a89 --- /dev/null +++ b/sodaq_one_gps_battery/Sodaq_RN2483.cpp @@ -0,0 +1 @@ +../Sodaq_RN2483.cpp \ No newline at end of file diff --git a/sodaq_one_gps_battery/Sodaq_RN2483.h b/sodaq_one_gps_battery/Sodaq_RN2483.h new file mode 120000 index 0000000..515c9e8 --- /dev/null +++ b/sodaq_one_gps_battery/Sodaq_RN2483.h @@ -0,0 +1 @@ +../Sodaq_RN2483.h \ No newline at end of file diff --git a/sodaq_one_gps_battery/StringLiterals.h b/sodaq_one_gps_battery/StringLiterals.h new file mode 120000 index 0000000..83e008e --- /dev/null +++ b/sodaq_one_gps_battery/StringLiterals.h @@ -0,0 +1 @@ +../StringLiterals.h \ No newline at end of file diff --git a/sodaq_one_gps_battery/Switchable_Device.cpp b/sodaq_one_gps_battery/Switchable_Device.cpp new file mode 120000 index 0000000..5fb5dda --- /dev/null +++ b/sodaq_one_gps_battery/Switchable_Device.cpp @@ -0,0 +1 @@ +../Switchable_Device.cpp \ No newline at end of file diff --git a/sodaq_one_gps_battery/Switchable_Device.h b/sodaq_one_gps_battery/Switchable_Device.h new file mode 120000 index 0000000..0c82682 --- /dev/null +++ b/sodaq_one_gps_battery/Switchable_Device.h @@ -0,0 +1 @@ +../Switchable_Device.h \ No newline at end of file diff --git a/sodaq_one_gps_battery/Utils.h b/sodaq_one_gps_battery/Utils.h new file mode 120000 index 0000000..70d35c6 --- /dev/null +++ b/sodaq_one_gps_battery/Utils.h @@ -0,0 +1 @@ +../Utils.h \ No newline at end of file diff --git a/sodaq_one_gps_battery/sodaq_one_gps_battery.ino b/sodaq_one_gps_battery/sodaq_one_gps_battery.ino new file mode 100644 index 0000000..7de221b --- /dev/null +++ b/sodaq_one_gps_battery/sodaq_one_gps_battery.ino @@ -0,0 +1,253 @@ +#include +#include + +#include "Sodaq_RN2483.h" + +#define debugSerial SerialUSB +#define loraSerial Serial1 + +/* The number of the device: 1,2,3,4 */ +#define deviceNo 1 + +#define beePin ENABLE_PIN_IO + +void sendPacket(String packet); + +void BLUE() { + digitalWrite(LED_RED, HIGH); + digitalWrite(LED_GREEN, HIGH); + digitalWrite(LED_BLUE, LOW); +} + +void RED() { + digitalWrite(LED_RED, LOW); + digitalWrite(LED_GREEN, HIGH); + digitalWrite(LED_BLUE, HIGH); +} + +void YELLOW() { + digitalWrite(LED_RED, LOW); + digitalWrite(LED_GREEN, LOW); + digitalWrite(LED_BLUE, HIGH); +} + +void WHITE() { + digitalWrite(LED_RED, LOW); + digitalWrite(LED_GREEN, LOW); + digitalWrite(LED_BLUE, LOW); +} + + +void GREEN() { + digitalWrite(LED_RED, HIGH); + digitalWrite(LED_GREEN, LOW); + digitalWrite(LED_BLUE, HIGH); +} + +void CLEAR() { + digitalWrite(LED_RED, HIGH); + digitalWrite(LED_GREEN, HIGH); + digitalWrite(LED_BLUE, HIGH); +} + +void blink(int length) { + switch(deviceNo) { + case 1: + BLUE(); + break; + case 2: + WHITE(); + break; + case 3: + GREEN(); + break; + case 4: + RED(); + break; + } + delay(length); + CLEAR(); +} + +#define ADC_AREF 3.3f +#define BATVOLT_R1 2.0f +#define BATVOLT_R2 2.0f +#define BATVOLT_PIN BAT_VOLT + +uint16_t getBatteryVoltage() +{ + uint16_t voltage = (uint16_t)((ADC_AREF / 1.023) * (BATVOLT_R1 + BATVOLT_R2) / BATVOLT_R2 * (float)analogRead(BATVOLT_PIN)); + + return voltage; +} + + +void sendBatVoltage() { + String battery = String("bat1=") + String(getBatteryVoltage()); + sendPacket(battery); +} + + +void setupLED() { + pinMode(LED_RED, OUTPUT); + pinMode(LED_GREEN, OUTPUT); + pinMode(LED_BLUE, OUTPUT); +} + +void setupGPS() + { + sodaq_gps.init(GPS_ENABLE); + } + +/*! + * Find a GPS fix, but first wait a while + */ +void send_gps() +{ + /* Delay and light up */ + blink(10000); + + uint32_t start = millis(); + uint32_t timeout = 900L * 1000; + debugSerial.println(String("waiting for fix ..., timeout=") + timeout + String("ms")); + + if (sodaq_gps.scan(false, timeout)) { + debugSerial.println(String(" time to find fix: ") + (millis() - start) + String("ms")); + debugSerial.println(String(" datetime = ") + sodaq_gps.getDateTimeString()); + + String lat= String("lat=") + String(sodaq_gps.getLat(), 7); + debugSerial.println(lat); + sendPacket(lat); + + String lon = String("lon=") + String(sodaq_gps.getLon(), 7); + debugSerial.println(lon); + sendPacket(lon); + + String sats = String("num sats = ") + String(sodaq_gps.getNumberOfSatellites()); + debugSerial.println(sats); + sendPacket(sats); + } else { + debugSerial.println("No Fix"); + sendPacket("No Fix"); + } +} + + +// OTAA +// Random numbers chosen + device id +uint8_t DevEUI[8] = { 0x9c, 0xd9, 0x0b, 0xb5, 0x2b, 0x6a, 0x1d, deviceNo }; +// uint8_t AppEUI[8] = { 0xd4, 0x16, 0xcd, 0x0b, 0x7b, 0xcf, 0x2d, 0x5c }; +// uint8_t AppKey[16] = { 0xa9, 0xbc, 0x8b, 0x6a, 0x81, 0x75, 0xf6, 0x33, 0xe0, 0xd6, 0x64, 0xd9, 0x2b, 0xcb, 0x13, 0x78 }; + +// ttn +uint8_t AppEUI[8] = { 0x70, 0xB3, 0xD5, 0x7E, 0xD0, 0x00, 0x0E, 0x9B +}; + +// id=2 +// uint8_t AppKey[16] = { 0xE4, 0xAC, 0x4D, 0xD4, 0xB2, 0xA7, +// 0x84,0xB8, 0x9D, 0xC9, 0x4C, 0x37, 0xD9, 0x0E, 0x22, 0x45 }; + +// id=1 +uint8_t AppKey[16] = { 0x27, 0x29, 0xCC, 0x46, 0xAD, 0xFA, 0xFA, 0x95, 0xA1, 0x8A, 0xA1, 0x21, 0x57, 0x21, 0x23, 0x6E }; + + +void setupLoRaOTAA(){ + if (LoRaBee.initOTA(loraSerial, DevEUI, AppEUI, AppKey, true)) + { + debugSerial.println("Communication to LoRaBEE successful."); + } + else + { + debugSerial.println("OTAA Setup failed!"); + } +} + + +void setup() { + //Power up the LoRaBEE - on loraone/sodaq one + pinMode(ENABLE_PIN_IO, OUTPUT); // ONE + digitalWrite(beePin, HIGH); // ONE + delay(3000); + + while ((!SerialUSB) && (millis() < 10000)){ + // Wait 10 seconds for the Serial Monitor + } + + //Set baud rate + debugSerial.begin(57600); + loraSerial.begin(LoRaBee.getDefaultBaudRate()); + + setupGPS(); + blink(30); + blink(30); + + setupLED(); + blink(60); + + //connect to the LoRa Network + setupLoRa(); +} + +void setupLoRa() +{ + setupLoRaOTAA(); +} + +void sendPacket(String packet){ + switch (LoRaBee.sendReqAck(1, (uint8_t*)packet.c_str(), packet.length(), 8)) + { + case NoError: + debugSerial.println("Successful transmission."); + break; + case NoResponse: + debugSerial.println("There was no response from the device."); + setupLoRa(); + break; + case Timeout: + debugSerial.println("Connection timed-out. Check your serial connection to the device! Sleeping for 20sec."); + delay(20000); + break; + case PayloadSizeError: + debugSerial.println("The size of the payload is greater than allowed. Transmission failed!"); + break; + case InternalError: + debugSerial.println("Oh No! This shouldn't happen. Something is really wrong! Try restarting the device!\r\nThe network connection will reset."); + setupLoRa(); + break; + case Busy: + debugSerial.println("The device is busy. Sleeping for 10 extra seconds."); + delay(10000); + break; + case NetworkFatalError: + debugSerial.println("There is a non-recoverable error with the network connection. You should re-connect.\r\nThe network connection will reset."); + setupLoRa(); + break; + case NotConnected: + debugSerial.println("The device is not connected to the network. Please connect to the network before attempting to send data.\r\nThe network connection will reset."); + setupLoRa(); + break; + case NoAcknowledgment: + debugSerial.println("There was no acknowledgment sent back!"); + // When you this message you are probaly out of range of the network. + break; + default: + break; + } +} + +void loop() { + /* Announce begin of code */ + blink(20); delay(50); + blink(20); delay(50); + blink(20); delay(50); + + String id = String("GPS node ") + String(deviceNo); + sendPacket(id); + sendBatVoltage(); + + /* Wait for 30s to send again */ + blink(1000); delay(29000); + + /* Wait one minute for finding fix */ + send_gps(); +}