diff --git a/thingsnetwork/Sodaq_RN2483.cpp b/thingsnetwork/Sodaq_RN2483.cpp new file mode 120000 index 0000000..5102a89 --- /dev/null +++ b/thingsnetwork/Sodaq_RN2483.cpp @@ -0,0 +1 @@ +../Sodaq_RN2483.cpp \ No newline at end of file diff --git a/thingsnetwork/Sodaq_RN2483.h b/thingsnetwork/Sodaq_RN2483.h new file mode 120000 index 0000000..515c9e8 --- /dev/null +++ b/thingsnetwork/Sodaq_RN2483.h @@ -0,0 +1 @@ +../Sodaq_RN2483.h \ No newline at end of file diff --git a/thingsnetwork/StringLiterals.h b/thingsnetwork/StringLiterals.h new file mode 120000 index 0000000..83e008e --- /dev/null +++ b/thingsnetwork/StringLiterals.h @@ -0,0 +1 @@ +../StringLiterals.h \ No newline at end of file diff --git a/thingsnetwork/Switchable_Device.cpp b/thingsnetwork/Switchable_Device.cpp new file mode 120000 index 0000000..5fb5dda --- /dev/null +++ b/thingsnetwork/Switchable_Device.cpp @@ -0,0 +1 @@ +../Switchable_Device.cpp \ No newline at end of file diff --git a/thingsnetwork/Switchable_Device.h b/thingsnetwork/Switchable_Device.h new file mode 120000 index 0000000..0c82682 --- /dev/null +++ b/thingsnetwork/Switchable_Device.h @@ -0,0 +1 @@ +../Switchable_Device.h \ No newline at end of file diff --git a/thingsnetwork/Utils.h b/thingsnetwork/Utils.h new file mode 120000 index 0000000..70d35c6 --- /dev/null +++ b/thingsnetwork/Utils.h @@ -0,0 +1 @@ +../Utils.h \ No newline at end of file diff --git a/thingsnetwork/thethingsnetwork.ino b/thingsnetwork/thethingsnetwork.ino new file mode 100644 index 0000000..a2b6f62 --- /dev/null +++ b/thingsnetwork/thethingsnetwork.ino @@ -0,0 +1,358 @@ +#include "Sodaq_RN2483.h" +#include "Arduino.h" + + +#define debugSerial SerialUSB +#define loraSerial Serial1 + +/* The number of the device: 1,2,3,4 */ +#define deviceNo 2 + +#define beePin ENABLE_PIN_IO + +#define LOUDNESS_SENSOR 0 +#define LIGHT_SENSOR 2 +#define WATER_SENSOR 6 +#define BUZZER 8 +#define MAGNETIC_SWITCH 12 +#define TEMPERATURE 13 + +int loudness; + +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: + RED(); + break; + case 3: + GREEN(); + break; + case 4: + WHITE(); + break; + } + delay(length); + CLEAR(); +} + +void beep(int howlong) { + buzzOn(); + delay(howlong); + buzzOff(); +} + +void buzzOn() { + digitalWrite(BUZZER, HIGH); +} + +void buzzOff() { + digitalWrite(BUZZER, LOW); +} + + +void setupLED() { + pinMode(LED_RED, OUTPUT); + pinMode(LED_GREEN, OUTPUT); + pinMode(LED_BLUE, OUTPUT); +} + + + +uint8_t DevEUI[8] = { 0x9c, 0xd9, 0x0b, 0xb5, 0x2b, 0x6a, 0x1d, deviceNo }; + +// TTN +uint8_t AppEUI[8] = { 0x70, 0xB3, 0xD5, 0x7E, 0xD0, 0x00, 0x0E, 0x9e }; + + +// F1B165CF06B156B0BB6970FC209602EA +uint8_t AppKey[16] = { 0xF1, 0xB1, 0x65, 0xCF, + 0x06, 0xB1, 0x56, 0xB0, 0xBB, + 0x69, 0x70, 0xFC, 0x20, 0x96, + 0x02, 0xEA }; + +uint8_t counter; + +void setupLoRaOTAA(){ + if (LoRaBee.initOTA(loraSerial, DevEUI, AppEUI, AppKey, true)) + { + debugSerial.println("Communication to LoRaBEE successful."); + } + else + { + debugSerial.println("OTAA Setup failed!"); + } +} + + +int setupLoudness() +{ + loudness = 0; + // pinMode(LOUDNESS_SENSOR, INPUT); +} + +int readLoudness() +{ + return analogRead(LOUDNESS_SENSOR); +} + +int readLight() +{ + int sensorValue = analogRead(LIGHT_SENSOR); + return map(sensorValue, 11, 27333, 0, 413); +} + +void setupWater() { + pinMode(WATER_SENSOR, INPUT); +} + +boolean hasWater() +{ + if(digitalRead(WATER_SENSOR) == LOW) { + return true; + } else { + return false; + } +} + +void setupTemp() { + pinMode(TEMPERATURE, INPUT); +} + +float readTemp() +{ + float temperature; + int B=4250; //B value of the thermistor + float resistance; + int a; + + a=analogRead(TEMPERATURE); + resistance=(float)(1023-a)*10000/a; //get the resistance of the sensor; + temperature=1/(log(resistance/10000)/B+1/298.15)-273.15;//convert to temperature via datasheet ; + + return temperature; +} + + +void setupBuzzer() +{ + pinMode(BUZZER, OUTPUT); +} + + +void setupMagnet() +{ + pinMode(MAGNETIC_SWITCH, INPUT); +} + +boolean isMagnetic() +{ + if(digitalRead(MAGNETIC_SWITCH) == HIGH) + return true; + else + return false; +} + + + +void setup() { + //Power up the LoRaBEE - on loraone/sodaq one + pinMode(ENABLE_PIN_IO, OUTPUT); // ONE + + digitalWrite(beePin, HIGH); // ONE + delay(3000); + + /* Enable the pins 2/3, 6/7 and 8/9 */ + pinMode(11, OUTPUT); + digitalWrite(11, HIGH); + + while ((!SerialUSB) && (millis() < 10000)){ + // Wait 10 seconds for the Serial Monitor + } + + //Set baud rate + debugSerial.begin(57600); + loraSerial.begin(LoRaBee.getDefaultBaudRate()); + + // Debug output from LoRaBee + // LoRaBee.setDiag(debugSerial); // optional + + setupLED(); + blink(60); + + /* used for blinking */ + counter=0; + setupLoudness(); + + //connect to the LoRa Network + setupLoRa(); + +/* setupWater(); + setupBuzzer(); + setupMagnet(); */ + +} + +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); + + loudness = readLoudness(); + + String data_loudness = String("loudness=" + String(loudness, DEC)); + debugSerial.println(data_loudness); + +/* String data_light = String("light=" + String(readLight(), 3)); + debugSerial.println(data_light); */ + +/* String data_temp = String("temp=" + String(readTemp(), 3)); + debugSerial.println(data_temp);*/ + + + /* + String data_water; + if(hasWater()) { + data_water = String("water=1"); + buzzOn(); + } else { + data_water = String("water=0"); + buzzOff(); + } + debugSerial.println(data_water); + + String data_magnet; + if(isMagnetic()) { + data_magnet = String("magnet=1"); + } else { + data_magnet = String("magnet=0"); + } + debugSerial.println(data_magnet); + + */ + +// sendPacket(data_loudness); + blink(20); delay(2980); + + + /*sendPacket(data_temp); + blink(20); delay(2980); + sendPacket(data_light); + blink(20); delay(2980); + sendPacket(data_water); + blink(20); delay(2980); + sendPacket(data_magnet);*/ + + + /* Blink long after sending packet + if(counter >= 10) { + // Beep(20); + blink(20); + delay(10); + blink(20); + sendPacket(data_temp); + blink(500); + sendPacket(data_loudness); + blink(500); + sendPacket(data_light); + blink(500); + sendPacket(data_water); + blink(500); + sendPacket(data_magnet); + counter = 0; + } else { + blink(30); + counter++; + } + */ + + // delay(1000); +}