LoRa – это беспроводная радиочастотная технология, представленная компанией Semtech и предназначенная для двунаправленной передачи информации на большие расстояния без большого потребления энергии.

В этом материале мы узнаем, как мы можем использовать модуль LoRa SX1278 с ESP32. Здесь мы будем использовать два модуля LoRa – один с ESP32, а другой с платой Arduino. ESP32 с LoRa запросит данные о погоде из API для любого конкретного города и отправит их в Arduino с LoRa. Затем Arduino с LoRa получит данные и отобразит их на ЖК-дисплее 16x2. Таким образом, ESP32 с LoRa будет действовать как передатчик, а Arduino с LoRa как приемник. OLED-дисплей также подключен к ESP32 для отображения температуры и влажности на стороне отправителя.
Принципиальные схемы блоков LoRa передатчик/сервер и приемник/клиент приведена далее. В этом проекте мы собираемся отправлять данные о погоде из модуля ESP32 в Arduino Uno с помощью модуля LoRa SX1278. Данные о температуре и влажности будут считываться из Интернета с помощью API с модулем ESP32, а затем отправляться в Arduino с помощью модуля LoRa.
На передающей стороне мы используем ESP32 с модулем LoRa и OLED-дисплеем. Принципиальная схема для этого аппаратного обеспечения следующая:

Подключение может выглядеть так:

Таблица подключения контактов:

На стороне приемника мы используем шилд Arduino Lora. Этот шилд состоит из модуля SX1278 433 МГц со стабилизатором 3,3 В. Шилд будет располагаться непосредственно поверх Arduino, обеспечивая ему возможности LoRa. Полная принципиальная схема шилда LoRa для Arduino приведена далее.

Вот как это может выглядеть:

Как упоминалось ранее, для запроса данных о погоде из Интернета требуется ссылка на API. Здесь мы собираемся использовать Weather API, который имеет очень простой в использовании API, который позволяет нам получать информацию о погоде. Так что зарегистрируйтесь на сайте, чтобы получить ссылку API. После регистрации перейдите в «My Account» и получите API. Ключ API используется для запросов на получение данных.

Теперь вернитесь и нажмите «API Explorer».

Теперь на странице API Explorer введите API и название города.

Затем прокрутите вниз и нажмите кнопку «Show Response», чтобы сделать запрос. Он даст вам ключ API.

Теперь вставьте URL-адрес API в новую вкладку браузера, и результат этого запроса будет выглядеть следующим образом (данные JSON):

После получения данных JSON сгенерируйте код, с помощью которого мы сможем прочитать данные JSON и сформулировать их в соответствии с нашими потребностями. Для этого перейдите в ArduinoJson Assistant и вставьте данные JSON в раздел ввода.

Теперь прокрутите вниз до программы парсинга и скопируйте раздел кода, который вам пригодится.
Полный код для передатчика и приемника LoRa представлены далее.
// Код для Arduino
#include <SPI.h>
#include <LoRa.h>
#include <LiquidCrystal.h>
const int rs = 8, en = 7, d4 = 6, d5 = 5, d6 = 4, d7 = 3;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
void setup() {
Serial.begin(9600);
lcd.begin(16, 2);
lcd.print("Arduino LoRa");
Serial.print("Arduino LoRa");
lcd.setCursor(0, 1);
lcd.print("Receiver");
delay(2000);
if (!LoRa.begin(433E6)) {
Serial.println("Starting LoRa failed!");
lcd.print("LoRa Failed");
while (1);
}
}
void loop() {
int packetSize = LoRa.parsePacket();
// lcd.print("LoRa");
if (packetSize) {
Serial.print("Received packet '");
lcd.clear();
while (LoRa.available()) {
char incoming = (char)LoRa.read();
if (incoming == 'c')
{
lcd.setCursor(0, 1);
}
else
{
lcd.print(incoming);
Serial.print(incoming);
}
}
}
}
Код для ESP32
#include <HTTPClient.h>
#include <WiFi.h>
#include <ArduinoJson.h>
#include <SPI.h>
#include <LoRa.h>
#include <Wire.h>
#include<SH1106.h>
SH1106 display(0x3c, 21, 22);
const char* ssid = "Galaxy-M20";
const char* pass = "ac312124";
int count;
#define ss 5
#define rst 14
#define dio0 2
const char* url = "http://api.weatherapi.com/v1/current.json?key=ade61a8aef37445d8c0100632202407&q=Jaipur";
void setup() {
Serial.begin(115200);
delay(2000);
Serial.println("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("WiFi connected");
Serial.println("LoRa Sender");
LoRa.setPins(ss, rst, dio0);
while (!LoRa.begin(433E6)) {
Serial.println(".");
delay(500);
}
LoRa.setSyncWord(0xF3);
Serial.println("LoRa Initializing OK!");
display.init();
display.flipScreenVertically();
display.setFont(ArialMT_Plain_10);
}
void loop() {
HTTPClient https;
String data;
https.begin(url);
int httpCode = https.GET();
if (httpCode > 0) {
String payload = https.getString();
char charBuf[500];
payload.toCharArray(charBuf, 500);
//Serial.println(payload);
const size_t capacity = JSON_OBJECT_SIZE(2) + JSON_OBJECT_SIZE(3) + JSON_OBJECT_SIZE(8) + JSON_OBJECT_SIZE(23) + 490;
DynamicJsonDocument doc(capacity);
const char* json = "{\"location\":{\"name\":\"Jaipur\",\"region\":\"Rajasthan\",\"country\":\"India\",\"lat\":26.92,\"lon\":75.82,\"tz_id\":\"Asia/Kolkata\",\"localtime_epoch\":1595741089,\"localtime\":\"2020-07-26 10:54\"},\"current\":{\"last_updated_epoch\":1595740520,\"last_updated\":\"2020-07-26 10:45\",\"temp_c\":31,\"temp_f\":87.8,\"is_day\":1,\"condition\":{\"text\":\"Mist\",\"icon\":\"//cdn.weatherapi.com/weather/64x64/day/143.png\",\"code\":1030},\"wind_mph\":0,\"wind_kph\":0,\"wind_degree\":0,\"wind_dir\":\"N\",\"pressure_mb\":1008,\"pressure_in\":30.2,\"precip_mm\":0,\"precip_in\":0,\"humidity\":66,\"cloud\":50,\"feelslike_c\":32.2,\"feelslike_f\":89.9,\"vis_km\":5,\"vis_miles\":3,\"uv\":8,\"gust_mph\":7.2,\"gust_kph\":11.5}}";
deserializeJson(doc, json);
JsonObject location = doc["location"];
const char* location_name = location["name"]; // "Jaipur"
const char* location_region = location["region"]; // "Rajasthan"
const char* location_country = location["country"]; // "India"
JsonObject current = doc["current"];
long current_last_updated_epoch = current["last_updated_epoch"];
const char* current_last_updated = current["last_updated"]; //
int current_temp_c = current["temp_c"]; // 31
int current_humidity = current["humidity"]; // 66
Serial.print("Temperature: ");
Serial.println(current_temp_c);
Serial.println("Humidity: ");
Serial.println(current_humidity);
Serial.print("Sending packet: ");
// Serial.println(counter);
//Send LoRa packet to receiver
LoRa.beginPacket();
LoRa.print("Temperature: ");
LoRa.print(current_temp_c);
String Temp = String(current_temp_c);
LoRa.print("c");
LoRa.print("Humidity: ");
LoRa.print(current_humidity);
String Humidity = String(current_humidity);
LoRa.endPacket();
display.clear();
display.setTextAlignment(TEXT_ALIGN_LEFT);
display.setFont(ArialMT_Plain_16);
display.drawString(0, 23, "Temperature:");
display.drawString(94, 23, Temp);
display.drawString(0, 38, "Humidity:");
display.drawString(70, 38, Humidity);
display.display();
delay(5000);
}
else {
Serial.println("Error on HTTP request");
}
https.end();
count++;
}
Когда оборудование и программа будут готовы, загрузите приведенные коды в модули ESP32 и Arduino. Модуль передатчика отправит значения температуры и влажности в модуль приемника. А приемник отобразит их на ЖК-дисплее, подключенном к Arduino, как показано на следующем изображении.

© digitrode.ru