114 lines
3 KiB
Arduino
114 lines
3 KiB
Arduino
|
/*
|
||
|
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 <SPI.h> // include libraries
|
||
|
#include <LoRa.h>
|
||
|
|
||
|
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;
|
||
|
}
|
||
|
|