/* * Author: Dennis Ruigrok and JP Meijers * Date: 2017-01-16 * * This program is meant to be used with an Arduino UNO or NANO, conencted to an RNxx3 radio module. * It will most likely also work on other compatible Arduino or Arduino compatible boards, * like The Things Uno, but might need some slight modifications. * * Transmit a one byte packet via TTN, using confirmed messages, * waiting for an acknowledgement or a downlink message. * * CHECK THE RULES BEFORE USING THIS PROGRAM! * * CHANGE ADDRESS! * Change the device address, network (session) key, and app (session) key to the values * that are registered via the TTN dashboard. * The appropriate line is "myLora.initABP(XXX);" or "myLora.initOTAA(XXX);" * When using ABP, it is advised to enable "relax frame count". * * Connect the RN2xx3 as follows: * RN2xx3 -- Arduino * Uart TX -- 10 * Uart RX -- 11 * Reset -- 12 * Vcc -- 3.3V * Gnd -- Gnd * * If you use an Arduino with a free hardware serial port, you can replace * the line "rn2xx3 myLora(mySerial);" * with "rn2xx3 myLora(SerialX);" * where the parameter is the serial port the RN2xx3 is connected to. * Remember that the serial port should be initialised before calling initTTN(). * For best performance the serial port should be set to 57600 baud, which is impossible with a software serial port. * If you use 57600 baud, you can remove the line "myLora.autobaud();". * */ #include #include SoftwareSerial mySerial(10, 11); // RX, TX //create an instance of the rn2xx3 library, //giving the software serial as port to use rn2xx3 myLora(mySerial); // the setup routine runs once when you press reset: void setup() { //output LED pin pinMode(13, OUTPUT); led_on(); // Open serial communications and wait for port to open: Serial.begin(57600); //serial port to computer mySerial.begin(9600); //serial port to radio Serial.println("Startup"); initialize_radio(); //transmit a startup message myLora.tx("TTN Mapper on TTN Enschede node"); led_off(); delay(2000); } void initialize_radio() { //reset rn2483 pinMode(12, OUTPUT); digitalWrite(12, LOW); delay(500); digitalWrite(12, HIGH); delay(100); //wait for the RN2xx3's startup message mySerial.flush(); //Autobaud the rn2483 module to 9600. The default would otherwise be 57600. myLora.autobaud(); //check communication with radio String hweui = myLora.hweui(); while(hweui.length() != 16) { Serial.println("Communication with RN2xx3 unsuccesful. Power cycle the board."); Serial.println(hweui); delay(10000); hweui = myLora.hweui(); } //print out the HWEUI so that we can register it via ttnctl Serial.println("When using OTAA, register this DevEUI: "); Serial.println(myLora.hweui()); Serial.println("RN2xx3 firmware version:"); Serial.println(myLora.sysver()); //configure your keys and join the network Serial.println("Trying to join TTN"); bool join_result = false; //ABP: initABP(String addr, String AppSKey, String NwkSKey); join_result = myLora.initABP("02017201", "8D7FFEF938589D95AAD928C2E2E7E48F", "AE17E567AECC8787F749A62F5541D522"); //OTAA: initOTAA(String AppEUI, String AppKey); //join_result = myLora.initOTAA("70B3D57ED00001A6", "A23C96EE13804963F8C2BD6285448198"); while(!join_result) { Serial.println("Unable to join. Are your keys correct, and do you have TTN coverage?"); delay(60000); //delay a minute before retry join_result = myLora.init(); } Serial.println("Successfully joined TTN"); } // the loop routine runs over and over again forever: void loop() { led_on(); Serial.print("TXing"); myLora.txCnf("!"); //one byte, blocking function switch(myLora.txCnf("!")) //one byte, blocking function { case RN2xx3_datatypes::TX_return_type::TX_FAIL: { Serial.println("TX unsuccessful or not acknowledged"); break; } case RN2xx3_datatypes::TX_return_type::TX_SUCCESS: { Serial.println("TX successful and acknowledged"); break; } case RN2xx3_datatypes::TX_return_type::TX_WITH_RX: { String received = myLora.getRx(); received = rn2xx3_helper::base16decode(received); Serial.print("Received downlink: " + received); break; } default: { Serial.println("Unknown response from TX function"); } } led_off(); delay(10000); } void led_on() { digitalWrite(13, 1); } void led_off() { digitalWrite(13, 0); }