/* LoRa Simple Gateway/Node Exemple This code uses InvertIQ function to create a simple Gateway/Node logic. Gateway - Sends messages with enableInvertIQ() - Receives messages with disableInvertIQ() Node - Sends messages with disableInvertIQ() - Receives messages with enableInvertIQ() With this arrangement a Gateway never receive messages from another Gateway and a Node never receive message from another Node. Only Gateway to Node and vice versa. This code receives messages and sends a message every second. InvertIQ function basically invert the LoRa I and Q signals. See the Semtech datasheet, http://www.semtech.com/images/datasheet/sx1276.pdf for more on InvertIQ register 0x33. created 05 August 2018 by Luiz H. Cassettari */ #include // include libraries #include const long frequency = 915E6; // LoRa Frequency const int csPin = 10; // LoRa radio chip select const int resetPin = 9; // LoRa radio reset const int irqPin = 2; // change for your board; must be a hardware interrupt pin void setup() { Serial.begin(9600); // initialize serial while (!Serial); LoRa.setPins(csPin, resetPin, irqPin); if (!LoRa.begin(frequency)) { Serial.println("LoRa init failed. Check your connections."); while (true); // if failed, do nothing } Serial.println("LoRa init succeeded."); Serial.println(); Serial.println("LoRa Simple Gateway"); Serial.println("Only receive messages from nodes"); Serial.println("Tx: invertIQ enable"); Serial.println("Rx: invertIQ disable"); Serial.println(); LoRa.onReceive(onReceive); LoRa_rxMode(); } void loop() { if (runEvery(5000)) { // repeat every 5000 millis String message = "HeLoRa World! "; message += "I'm a Gateway! "; message += millis(); LoRa_sendMessage(message); // send a message Serial.println("Send Message!"); } } void LoRa_rxMode(){ LoRa.disableInvertIQ(); // normal mode LoRa.receive(); // set receive mode } void LoRa_txMode(){ LoRa.idle(); // set standby mode LoRa.enableInvertIQ(); // active invert I and Q signals } void LoRa_sendMessage(String message) { LoRa_txMode(); // set tx mode LoRa.beginPacket(); // start packet LoRa.print(message); // add payload LoRa.endPacket(); // finish packet and send it LoRa_rxMode(); // set rx mode } void onReceive(int packetSize) { String message = ""; while (LoRa.available()) { message += (char)LoRa.read(); } Serial.print("Gateway Receive: "); Serial.println(message); } boolean runEvery(unsigned long interval) { static unsigned long previousMillis = 0; unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) { previousMillis = currentMillis; return true; } return false; }