TTGO LoRa32 SX1276 OLED: Начало работы с Arduino IDE
TTGO LoRa32 SX1276 OLED — это плата разработки на базе ESP32 со встроенным чипом LoRa и OLED-дисплеем SSD1306 размером 0,96 дюйма. В этом руководстве мы покажем, как: отправлять и принимать LoRa-пакеты (связь «точка-точка») и использовать OLED-дисплей с Arduino IDE.
Для введения в LoRa-связь читайте: ESP32 с LoRa с использованием Arduino IDE.
Обзор TTGO LoRa32 SX1276 OLED
TTGO LoRa32 SX1276 OLED — это плата разработки с ESP32, встроенным чипом LoRa и OLED-дисплеем SSD1306. Это та же модель OLED-дисплея, которую мы используем в большинстве наших электронных проектов (Руководство по OLED-дисплею с ESP32).
Плата также имеет несколько GPIO для подключения периферии, кнопки PRG (BOOT) и RST, а также разъём для литиевой батареи. Для более подробного обзора этой платы читайте: Обзор TTGO LoRa32 SX1276 OLED.
Где купить?
Вы можете перейти на страницу TTGO LoRa32 SX1276 OLED на Maker Advisor, чтобы найти лучшую цену в разных магазинах. Для выполнения этого руководства вам понадобятся две платы TTGO LoRa32.
Распиновка TTGO LoRa32 SX1276 OLED
На следующем рисунке показана распиновка платы TTGO LoRa32 OLED.
OLED-дисплей взаимодействует по протоколу I2C. Он внутренне подключён к ESP32 на следующих выводах:
OLED (встроенный) |
ESP32 |
|---|---|
SDA |
GPIO 4 |
SCL |
GPIO 15 |
RST |
GPIO 16 |
Чип LoRa SX1276 взаимодействует по протоколу SPI и внутренне подключён к ESP32 на следующих GPIO:
SX1276 LoRa |
ESP32 |
|---|---|
MISO |
GPIO 19 |
MOSI |
GPIO 27 |
SCK |
GPIO 5 |
CS |
GPIO 18 |
IRQ |
GPIO 26 |
RST |
GPIO 14 |
Рекомендуемое чтение: Справочник по распиновке ESP32
Установка плат ESP32 в Arduino IDE
Для программирования платы TTGO LoRa32 мы будем использовать Arduino IDE. Поэтому у вас должен быть установлен Arduino IDE, а также дополнение ESP32. Следуйте следующему руководству для установки пакета ESP32 в Arduino IDE, если вы ещё этого не сделали:
Установка библиотек OLED
Существует несколько библиотек для управления OLED-дисплеем с ESP32. В этом руководстве мы будем использовать две библиотеки Adafruit: библиотеку Adafruit_SSD1306 и библиотеку Adafruit_GFX.
Следуйте следующим шагам для установки этих библиотек.
Откройте Arduino IDE и перейдите в Sketch > Include Library > Manage Libraries. Должен открыться менеджер библиотек.
Введите «SSD1306» в поле поиска и установите библиотеку SSD1306 от Adafruit.
После установки библиотеки SSD1306 от Adafruit введите «GFX» в поле поиска и установите библиотеку.
Установка библиотеки LoRa
Существует несколько библиотек для удобной отправки и приёма LoRa-пакетов с ESP32. В этом примере мы будем использовать библиотеку arduino-LoRa от sandeep mistry.
Откройте Arduino IDE и перейдите в Sketch > Include Library > Manage Libraries, затем найдите «LoRa». Выберите библиотеку LoRa, выделенную на рисунке ниже, и установите её.
После установки библиотек перезапустите Arduino IDE.
Скетч LoRa-передатчика
Скопируйте следующий код в Arduino IDE. Этот код отправляет сообщение «hello» с последующим счётчиком по LoRa каждые 10 секунд. Он также отображает счётчик на OLED-дисплее.
/*********
Rui Santos
Complete project details at https://RandomNerdTutorials.com/ttgo-lora32-sx1276-arduino-ide/
*********/
//Libraries for LoRa
#include <SPI.h>
#include <LoRa.h>
//Libraries for OLED Display
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
//define the pins used by the LoRa transceiver module
#define SCK 5
#define MISO 19
#define MOSI 27
#define SS 18
#define RST 14
#define DIO0 26
//433E6 for Asia
//866E6 for Europe
//915E6 for North America
#define BAND 866E6
//OLED pins
#define OLED_SDA 4
#define OLED_SCL 15
#define OLED_RST 16
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
//packet counter
int counter = 0;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RST);
void setup() {
//initialize Serial Monitor
Serial.begin(115200);
//reset OLED display via software
pinMode(OLED_RST, OUTPUT);
digitalWrite(OLED_RST, LOW);
delay(20);
digitalWrite(OLED_RST, HIGH);
//initialize OLED
Wire.begin(OLED_SDA, OLED_SCL);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3c, false, false)) { // Address 0x3C for 128x32
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(0,0);
display.print("LORA SENDER ");
display.display();
Serial.println("LoRa Sender Test");
//SPI LoRa pins
SPI.begin(SCK, MISO, MOSI, SS);
//setup LoRa transceiver module
LoRa.setPins(SS, RST, DIO0);
if (!LoRa.begin(BAND)) {
Serial.println("Starting LoRa failed!");
while (1);
}
Serial.println("LoRa Initializing OK!");
display.setCursor(0,10);
display.print("LoRa Initializing OK!");
display.display();
delay(2000);
}
void loop() {
Serial.print("Sending packet: ");
Serial.println(counter);
//Send LoRa packet to receiver
LoRa.beginPacket();
LoRa.print("hello ");
LoRa.print(counter);
LoRa.endPacket();
display.clearDisplay();
display.setCursor(0,0);
display.println("LORA SENDER");
display.setCursor(0,20);
display.setTextSize(1);
display.print("LoRa packet sent.");
display.setCursor(0,30);
display.print("Counter:");
display.setCursor(50,30);
display.print(counter);
display.display();
counter++;
delay(10000);
}
Как работает код
Начнём с подключения библиотек для взаимодействия с чипом LoRa.
#include <SPI.h>
#include <LoRa.h>
Затем подключим библиотеки для работы с OLED-дисплеем I2C.
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
Определим выводы, используемые модулем приёмопередатчика LoRa:
#define SCK 5
#define MISO 19
#define MOSI 27
#define SS 18
#define RST 14
#define DIO0 26
Выберем частоту LoRa:
#define BAND 866E6
Определим выводы OLED.
#define OLED_SDA 4
#define OLED_SCL 15
#define OLED_RST 16
Определим размер OLED.
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
Создадим переменную-счётчик для отслеживания количества отправленных LoRa-пакетов.
int counter = 0;
Создадим объект Adafruit_SSD1306 с именем display.
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RST);
setup()
В setup() для начала работы с OLED необходимо выполнить программный сброс через вывод RST. Для этого нужно объявить вывод RST как выход, установить его в LOW на несколько миллисекунд, а затем снова установить в HIGH.
pinMode(OLED_RST, OUTPUT);
digitalWrite(OLED_RST, LOW);
delay(20);
digitalWrite(OLED_RST, HIGH);
Запустим I2C-связь, используя определённые выводы OLED_SDA и OLED_SCL с помощью Wire.begin().
Wire.begin(OLED_SDA, OLED_SCL);
После этого инициализируем дисплей со следующими параметрами. Параметры, установленные в false, гарантируют, что библиотека не использует выводы I2C по умолчанию и использует выводы, определённые в коде (GPIO 4 и GPIO 15).
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3c, false, false)) { // Address 0x3C for 128x32
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
Затем вы можете использовать методы из библиотеки Adafruit для взаимодействия с OLED-дисплеем. Чтобы узнать больше, вы можете прочитать наше руководство по OLED-дисплею I2C с ESP32.
Выведем сообщение «LORA SENDER» на дисплей.
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(0,0);
display.print("LORA SENDER ");
display.display();
Инициализируем монитор порта для целей отладки.
Serial.begin(115200);
Serial.println("LoRa Sender Test");
Определим SPI-выводы, используемые чипом LoRa.
SPI.begin(SCK, MISO, MOSI, SS);
И настроим модуль приёмопередатчика LoRa.
LoRa.setPins(SS, RST, DIO0);
Наконец, инициализируем модуль приёмопередатчика LoRa с помощью метода begin() объекта LoRa и передадим частоту в качестве аргумента.
if (!LoRa.begin(BAND)) {
Serial.println("Starting LoRa failed!");
while (1);
}
Если инициализация дисплея прошла успешно, выведем сообщение об успехе на OLED-дисплей.
display.setCursor(0,10);
display.print("LoRa Initializing OK!");
display.display();
loop()
В loop() мы будем отправлять пакеты. Инициализируем пакет с помощью метода beginPacket().
LoRa.beginPacket();
Записываем данные в пакет с помощью метода print(). Как видно из следующих двух строк, мы отправляем сообщение hello с последующим счётчиком.
LoRa.print("hello ");
LoRa.print(counter);
Затем закрываем пакет методом endPacket().
LoRa.endPacket();
Далее выводим счётчик на OLED-дисплей.
display.clearDisplay();
display.setCursor(0,0);
display.println("LORA SENDER");
display.setCursor(0,20);
display.setTextSize(1);
display.print("LoRa packet sent.");
display.setCursor(0,30);
display.print("Counter:");
display.setCursor(50,30);
display.print(counter);
display.display();
После этого сообщение счётчика увеличивается на единицу в каждом цикле, который происходит каждые 10 секунд.
counter++;
delay(10000);
Тестирование LoRa-передатчика
Загрузите код на вашу плату. Вам нужно выбрать правильную плату и COM-порт, который вы используете.
Чтобы выбрать плату, в Arduino IDE перейдите в Tools > Board и выберите плату TTGO LoRa32-OLED V1.
После загрузки кода на плату она должна начать отправлять LoRa-пакеты.
Скетч LoRa-приёмника
Теперь загрузите скетч приёмника на другую плату TTGO LoRa32 OLED. Этот скетч прослушивает LoRa-пакеты в пределах своего радиуса действия и выводит содержимое пакетов на OLED, а также RSSI (относительную мощность принятого сигнала).
/*********
Rui Santos
Complete project details at https://RandomNerdTutorials.com/ttgo-lora32-sx1276-arduino-ide/
*********/
//Libraries for LoRa
#include <SPI.h>
#include <LoRa.h>
//Libraries for OLED Display
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
//define the pins used by the LoRa transceiver module
#define SCK 5
#define MISO 19
#define MOSI 27
#define SS 18
#define RST 14
#define DIO0 26
//433E6 for Asia
//866E6 for Europe
//915E6 for North America
#define BAND 866E6
//OLED pins
#define OLED_SDA 4
#define OLED_SCL 15
#define OLED_RST 16
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RST);
String LoRaData;
void setup() {
//initialize Serial Monitor
Serial.begin(115200);
//reset OLED display via software
pinMode(OLED_RST, OUTPUT);
digitalWrite(OLED_RST, LOW);
delay(20);
digitalWrite(OLED_RST, HIGH);
//initialize OLED
Wire.begin(OLED_SDA, OLED_SCL);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3c, false, false)) { // Address 0x3C for 128x32
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(0,0);
display.print("LORA RECEIVER ");
display.display();
Serial.println("LoRa Receiver Test");
//SPI LoRa pins
SPI.begin(SCK, MISO, MOSI, SS);
//setup LoRa transceiver module
LoRa.setPins(SS, RST, DIO0);
if (!LoRa.begin(BAND)) {
Serial.println("Starting LoRa failed!");
while (1);
}
Serial.println("LoRa Initializing OK!");
display.setCursor(0,10);
display.println("LoRa Initializing OK!");
display.display();
}
void loop() {
//try to parse packet
int packetSize = LoRa.parsePacket();
if (packetSize) {
//received a packet
Serial.print("Received packet ");
//read packet
while (LoRa.available()) {
LoRaData = LoRa.readString();
Serial.print(LoRaData);
}
//print RSSI of packet
int rssi = LoRa.packetRssi();
Serial.print(" with RSSI ");
Serial.println(rssi);
// Dsiplay information
display.clearDisplay();
display.setCursor(0,0);
display.print("LORA RECEIVER");
display.setCursor(0,20);
display.print("Received packet:");
display.setCursor(0,30);
display.print(LoRaData);
display.setCursor(0,40);
display.print("RSSI:");
display.setCursor(30,40);
display.print(rssi);
display.display();
}
}
Этот скетч очень похож на предыдущий. Нам нужно изменить лишь несколько строк, чтобы принимать LoRa-пакеты вместо отправки.
В loop() мы проверяем наличие новых пакетов для приёма с помощью метода parsePacket().
int packetSize = LoRa.parsePacket();
Если есть новый пакет, мы прочитаем его содержимое. Для чтения входящих данных используется метод readString(). Полученные данные сохраняются в переменной LoRaData.
if (packetSize) {
//received a packet
Serial.print("Received packet ");
//read packet
while (LoRa.available()) {
LoRaData = LoRa.readString();
Serial.print(LoRaData);
}
Мы также получаем RSSI принятого пакета с помощью метода packetRSSI().
int rssi = LoRa.packetRssi();
Наконец, отображаем полученное сообщение, а также RSSI.
display.clearDisplay();
display.setCursor(0,0);
display.print("LORA RECEIVER");
display.setCursor(0,20);
display.print("Received packet:");
display.setCursor(0,30);
display.print(LoRaData);
display.setCursor(0,40);
display.print("RSSI:");
display.setCursor(30,40);
display.print(rssi);
display.display();
Тестирование LoRa-приёмника
Загрузите код на вашу плату. Не забудьте, что нужно выбрать TTGO LoRa32-OLED V1 в меню Boards.
После загрузки кода плата должна начать принимать LoRa-пакеты от другой платы.
Заключение
Эта статья была кратким руководством по началу работы с платой TTGO LoRa32: как отправлять LoRa-пакеты в режиме связи «точка-точка» и использовать OLED-дисплей.
Теперь идея состоит в том, чтобы комбинировать то, что вы здесь узнали, для создания IoT-проектов. LoRa может быть особенно полезна, если вы хотите получать показания датчиков, которые не покрываются вашей Wi-Fi сетью и находятся на расстоянии нескольких метров. Кроме того, вы также можете подключить свою плату к TTN (The Things Network).
Надеемся, что это руководство было для вас полезным. Узнайте больше об ESP32 с помощью наших ресурсов:
Learn ESP32 with Arduino IDE (eBook + Video Course)
ESP32 с LoRa RFM95 с использованием Arduino IDE — Начало работы
Спасибо за чтение.
Примечание
Это перевод статьи TTGO LoRa32 SX1276 OLED Board: Getting Started with Arduino IDE с сайта Random Nerd Tutorials, автор — Rui Santos.