Arduino Nesso N1 LoRa communication-related API and example program.
#include "M5Unified.h"
#include <RadioLib.h>
#define LORA_MOSI_PIN 21
#define LORA_MISO_PIN 22
#define LORA_SCK_PIN 20
#define LORA_IRQ_PIN 15
#define LORA_CS_PIN 23
#define LORA_BUSY_PIN 19
// SX1262: NSS, DIO1, NRST, BUSY
SX1262 radio = new Module(LORA_CS_PIN, LORA_IRQ_PIN, RADIOLIB_NC, LORA_BUSY_PIN);
// save transmission state between loops
int transmissionState = RADIOLIB_ERR_NONE;
// flag to indicate that a packet was sent
volatile bool transmittedFlag = false;
// this function is called when a complete packet is transmitted by the module
// IMPORTANT: this function MUST be 'void' type and MUST NOT have any arguments!
#if defined(ESP8266) || defined(ESP32)
ICACHE_RAM_ATTR
#endif
void setFlag(void) {
// we sent a packet, set the flag
transmittedFlag = true;
}
M5Canvas canvas(&M5.Display);
void setup() {
M5.begin();
Serial.begin(115200);
M5.Display.setRotation(1);
// LED_BUILTIN at E1.P7
auto& ioe = M5.getIOExpander(0);
//LORA_RESET
ioe.digitalWrite(7, false);
delay(100);
ioe.digitalWrite(7, true);
delay(100);
ioe.digitalWrite(5, true); //LORA_LNA_ENABLE
ioe.digitalWrite(6, true); //LORA_ANTENNA_SWITCH
canvas.createSprite(M5.Display.width(), M5.Display.height());
canvas.setTextColor(GREEN);
canvas.setTextScroll(true);
// initialize SX1262
Serial.print(F("[SX1262] Initializing ... "));
canvas.println("[SX1262] Initializing ... ");
canvas.pushSprite(0, 0);
// frequency, bandwidth, spreading factor, coding rate, sync word, power, preamble length, TCXO reference voltage,
// useRegulatorLDO
int state = radio.begin(868.0, 125.0f, 12, 5, 0x34, 22, 20, 3.0, true);
if (state == RADIOLIB_ERR_NONE) {
Serial.println(F("success!"));
} else {
Serial.print(F("failed, code "));
Serial.println(state);
while (true) {
delay(10);
}
}
// set the function that will be called when packet transmission is finished
radio.setPacketSentAction(setFlag);
// start transmitting the first packet
Serial.print(F("[SX1262] Sending first packet ... "));
// you can transmit C-string or Arduino string up to 256 characters long
transmissionState = radio.startTransmit("Hello world from M5Stack!");
}
// counter to keep track of transmitted packets
int count = 0;
void loop() {
// check if the previous transmission finished
if (transmittedFlag) {
// reset flag
transmittedFlag = false;
if (transmissionState == RADIOLIB_ERR_NONE) {
// packet was successfully sent
Serial.println(F("transmission finished!"));
canvas.println("OK!");
canvas.pushSprite(0, 0);
} else {
Serial.print(F("failed, code "));
Serial.println(transmissionState);
}
// clean up after transmission is finished. This will ensure transmitter is disabled, RF switch is powered down, etc.
radio.finishTransmit();
// wait a second before transmitting again
delay(1000);
// send another packet
Serial.print(F("[SX1262] Sending another packet ... "));
String str = "Hello Arduino Nesso N1 #" + String(count++);
transmissionState = radio.startTransmit(str);
canvas.println("Send:" + str);
canvas.pushSprite(0, 0);
}
delay(100);
}#include "M5Unified.h"
#include <RadioLib.h>
#define LORA_MOSI_PIN 21
#define LORA_MISO_PIN 22
#define LORA_SCK_PIN 20
#define LORA_IRQ_PIN 15
#define LORA_CS_PIN 23
#define LORA_BUSY_PIN 19
// SX1262: NSS, DIO1, NRST, BUSY
SX1262 radio = new Module(LORA_CS_PIN, LORA_IRQ_PIN, RADIOLIB_NC, LORA_BUSY_PIN);
// flag to indicate that a packet was received
volatile bool receivedFlag = false;
// this function is called when a complete packet is received by the module
// IMPORTANT: this function MUST be 'void' type and MUST NOT have any arguments!
#if defined(ESP8266) || defined(ESP32)
ICACHE_RAM_ATTR
#endif
void setFlag(void) {
// we got a packet, set the flag
receivedFlag = true;
}
M5Canvas canvas(&M5.Display);
void setup() {
M5.begin();
Serial.begin(115200);
M5.Display.setRotation(1);
// LED_BUILTIN at E1.P7
auto& ioe = M5.getIOExpander(0);
//LORA_RESET
ioe.digitalWrite(7, false);
delay(100);
ioe.digitalWrite(7, true);
delay(100);
ioe.digitalWrite(5, true); //LORA_LNA_ENABLE
ioe.digitalWrite(6, true); //LORA_ANTENNA_SWITCH
canvas.createSprite(M5.Display.width(), M5.Display.height());
canvas.setTextColor(GREEN);
canvas.setTextScroll(true);
// initialize SX1262
Serial.print(F("[SX1262] Initializing ... "));
canvas.println("[SX1262] Initializing ... ");
canvas.pushSprite(0, 0);
// frequency, bandwidth, spreading factor, coding rate, sync word, power, preamble length, TCXO reference voltage, useRegulatorLDO
int state = radio.begin(868.0, 125.0f, 12, 5, 0x34, 22, 20, 3.0, true);
if (state == RADIOLIB_ERR_NONE) {
Serial.println(F("success!"));
} else {
Serial.print(F("failed, code "));
Serial.println(state);
while (true) { delay(10); }
}
// set the function that will be called when new packet is received
radio.setPacketReceivedAction(setFlag);
// start listening for LoRa packets
Serial.print(F("[SX1262] Starting to listen ... "));
state = radio.startReceive();
if (state == RADIOLIB_ERR_NONE) {
Serial.println(F("success!"));
} else {
Serial.print(F("failed, code "));
Serial.println(state);
while (true) { delay(10); }
}
}
void loop() {
// check if the flag is set
if (receivedFlag) {
// reset flag
receivedFlag = false;
// you can read received data as an Arduino String
String str;
int state = radio.readData(str);
if (state == RADIOLIB_ERR_NONE) {
Serial.println(F("[SX1262] Received packet!"));
Serial.print(F("[SX1262] Data:\t\t"));
Serial.println(str);
canvas.print(F("[SX1262] Data:\t\t"));
canvas.println(str);
Serial.print(F("[SX1262] RSSI:\t\t"));
Serial.print(radio.getRSSI());
Serial.println(F(" dBm"));
canvas.print(F("[SX1262] RSSI:\t\t"));
canvas.print(radio.getRSSI());
canvas.println(F(" dBm"));
Serial.print(F("[SX1262] SNR:\t\t"));
Serial.print(radio.getSNR());
Serial.println(F(" dB"));
canvas.print(F("[SX1262] SNR:\t\t"));
canvas.print(radio.getSNR());
canvas.println(F(" dB"));
canvas.pushSprite(0, 0);
Serial.print(F("[SX1262] Frequency error:\t"));
Serial.print(radio.getFrequencyError());
Serial.println(F(" Hz"));
} else if (state == RADIOLIB_ERR_CRC_MISMATCH) {
Serial.println(F("CRC error!"));
} else {
Serial.print(F("failed, code "));
Serial.println(state);
}
}
}Upload the above two code segments respectively to two Arduino Nesso N1 boards. The transmitter and receiver will each display their respective sending and receiving statuses.
The LoRa communication part of Arduino Nesso N1 uses the RadioLib library as the driver. For more related APIs, please refer to the following documents: