Пишем программный код для соединения двух плат Arduino Nano с микроконтроллерами Atmega328P в среде программирования Arduino IDE с помощью модулей LoRa.

В данном уроке мы рассмотрим соединение два микроконтроллера с помощью модуля LoRa. Их существует много разнообразий по конструктиву, но большинство из них подключается по стандартной схеме. За основу возьмем стандартный модуль, на основе микросхемы SX1276:
Для подключения к данного модуля нам необходимы следующие выводы:
GND и Vcc  — питание модуля  3.3V
MISO, MOSI и SLCK — передача данных через SPI канал
Nss — выбор работы чипа
Di00 — Цифровой вход/выход
RST — сброс чипа
ANA — антэна, включать модуль без антэны запрещено, так как модуль может выйти из строя. 

Так как мы будем использовать готовую библиотеку, для подключения модуля LoRa к плате Arduino Nano,  соединение двух плат будет по следующей схеме (модуль LoRa и плата Arduino Nano):

 GND -> GND
 Vcc -> 3.3V 
MISO -> D12 
MOSI -> D11 
SLCK -> D13
 Nss -> D10 
Di00 -> D2
 RST -> D9
 
Для проверки работы наших модулей, мы будем мерять температуру датчиком DS18B20 и передавать ее через модуль LoRa на другую плату, к которой будет подключен экран для вывода данного значения.
Как пример использования дома: Вы можете установить плату с датчиком (естественно, плата должна будет подключена к аккумулятору или батарейке)  на балконе, в гараже, в теплице и передавать  данные на Ваше устройства, при этом Вам не нужно будет соединять платы дополнительными проводами, вся связь будет идти через радиоканал. Дальность передачи данных зависит от типа модуля, в среднем пишут от 2 до 3км, у меня при тесте дальность была 1км, — сбоев в работе не наблюдалось.
При настройке модуля необходимо обращать внимание на рабочую частоту, модуля LoRa могут работать на частоте 433МГц,  866МГц и  915МГц.
 
Для теста я собрал не большой макет, для удобного подключения к модулю LoRa:
**************
 
На первой плате (условный передатчик), — датчик температуры DS18B20 я подключил к выводу …….,  на второй плате  (условный приемник), — экран я подключил к выводам ****:
//*******************
схема подключения
//*********************
 
Программный код для передатчика:
#include <OneWire.h>
#include <SPI.h>
#include <LoRa.h>

void setup(){
Serial.begin(9600);
while (!Serial);
Serial.println("LoRa Sender");
if (!LoRa.begin(433E6)) { // or 915E6, the MHz speed of yout module
Serial.println("Starting LoRa failed!");
while (1);
}
}

void loop(){
// Определяем температуру от датчика DS18b20
byte data[2]; // Место для значения температуры

ds.reset(); // Начинаем взаимодействие со сброса всех предыдущих команд и параметров
ds.write(0xCC); // Даем датчику DS18b20 команду пропустить поиск по адресу. В нашем случае только одно устрйоство
ds.write(0x44); // Даем датчику DS18b20 команду измерить температуру. Само значение температуры мы еще не получаем - датчик его положит во внутреннюю память

delay(1000); // Микросхема измеряет температуру, а мы ждем.

ds.reset(); // Теперь готовимся получить значение измеренной температуры
ds.write(0xCC);
ds.write(0xBE); // Просим передать нам значение регистров со значением температуры

// Получаем и считываем ответ
data[0] = ds.read(); // Читаем младший байт значения температуры
data[1] = ds.read(); // А теперь старший

// Формируем итоговое значение:
// - сперва "склеиваем" значение,
// - затем умножаем его на коэффициент, соответсвующий разрешающей способности (для 12 бит по умолчанию - это 0,0625)
float temperature = ((data[1] << 8) | data[0]) * 0.0625;

// Выводим полученное значение температуры в монитор порта
Serial.println(temperature);
LoRa.beginPacket();
temperature=temperature*100;
LoRa.print(temperature);
LoRa.endPacket();
delay(50);

}

Программный код для приемника:

#include <SPI.h> 
#include <LoRa.h>

int LED = 3;
String inString = ""; // string to hold input
int val = 0;
float temperature = 0;
void setup() {
Serial.begin(9600);
while (!Serial);
Serial.println("LoRa Receiver");
if (!LoRa.begin(433E6)) { // or 915E6
Serial.println("Starting LoRa failed!");
while (1);
}
}

void loop() { // try to parse packet
int packetSize = LoRa.parsePacket();
if (packetSize) { // read packet
while (LoRa.available()) {
int inChar = LoRa.read();
inString += (char)inChar;
val = inString.toInt();
temperature = val*0.01;
}
inString = "";
LoRa.packetRssi();
}
Serial.println(temperature);
}