2016-09-14 18:09:02 +00:00
# include "Sodaq_RN2483.h"
# include "Arduino.h"
# define debugSerial SerialUSB
# define loraSerial Serial1
2016-09-15 07:48:53 +00:00
/* The number of the device: 1,2,3,4 */
2016-09-15 09:38:10 +00:00
# define deviceNo 4
2016-09-15 07:48:53 +00:00
2016-09-15 09:38:10 +00:00
/* LoraOne / Sodaq one have RGB LED */
# ifdef LED_RED
# define beePin ENABLE_PIN_IO
2016-09-15 07:48:53 +00:00
2016-09-14 18:09:02 +00:00
void BLUE ( ) {
2016-09-15 07:48:53 +00:00
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 ) ;
2016-09-14 18:09:02 +00:00
}
void CLEAR ( ) {
2016-09-15 07:48:53 +00:00
digitalWrite ( LED_RED , HIGH ) ;
digitalWrite ( LED_GREEN , HIGH ) ;
digitalWrite ( LED_BLUE , HIGH ) ;
2016-09-14 18:09:02 +00:00
}
2016-09-15 07:48:53 +00:00
void blink ( int length ) {
switch ( deviceNo ) {
case 1 :
BLUE ( ) ;
break ;
case 2 :
RED ( ) ;
break ;
case 3 :
GREEN ( ) ;
break ;
case 4 :
YELLOW ( ) ;
break ;
}
delay ( length ) ;
CLEAR ( ) ;
2016-09-14 18:09:02 +00:00
}
2016-09-15 09:38:10 +00:00
void setupLED ( ) {
pinMode ( LED_RED , OUTPUT ) ;
pinMode ( LED_GREEN , OUTPUT ) ;
pinMode ( LED_BLUE , OUTPUT ) ;
}
# else
# define beePin BEE_VCC
void blink ( int length ) {
digitalWrite ( LED_BUILTIN , HIGH ) ;
delay ( length ) ;
digitalWrite ( LED_BUILTIN , LOW ) ;
}
void setupLED ( ) {
pinMode ( LED_BUILTIN , OUTPUT ) ;
}
# endif
2016-09-14 18:09:02 +00:00
// OTAA
2016-09-15 07:48:53 +00:00
// Random numbers chosen + device id
uint8_t DevEUI [ 8 ] = { 0x9c , 0xd9 , 0x0b , 0xb5 , 0x2b , 0x6a , 0x1d , deviceNo } ;
2016-09-14 18:09:02 +00:00
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 } ;
2016-09-15 07:48:53 +00:00
uint8_t counter ;
2016-09-14 18:09:02 +00:00
void setupLoRaOTAA ( ) {
if ( LoRaBee . initOTA ( loraSerial , DevEUI , AppEUI , AppKey , true ) )
{
debugSerial . println ( " Communication to LoRaBEE successful. " ) ;
}
else
{
debugSerial . println ( " OTAA Setup failed! " ) ;
}
}
void setup ( ) {
2016-09-15 09:38:10 +00:00
//Power up the LoRaBEE - on loraone/sodaq one
# ifdef LED_RED
2016-09-14 18:09:02 +00:00
pinMode ( ENABLE_PIN_IO , OUTPUT ) ; // ONE
2016-09-15 09:38:10 +00:00
# endif
digitalWrite ( beePin , HIGH ) ; // ONE
2016-09-14 18:09:02 +00:00
delay ( 3000 ) ;
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 ( ) ;
2016-09-15 07:48:53 +00:00
blink ( 60 ) ;
/* used for blinking */
counter = 0 ;
2016-09-14 18:09:02 +00:00
//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 \n The 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 \n The 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 \n The 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 ( ) {
2016-09-15 07:48:53 +00:00
2016-09-14 18:09:02 +00:00
// put your main code here, to run repeatedly:
String packet = " SODAQ " ;
2016-09-15 07:48:53 +00:00
/* Blink long after sending packet */
if ( counter > = 60 ) {
sendPacket ( packet ) ;
blink ( 500 ) ;
counter = 0 ;
} else {
blink ( 30 ) ;
counter + + ;
}
delay ( 1000 ) ;
2016-09-14 18:09:02 +00:00
}