TTGO LoRa32 SX1276 OLED: Начало работы с Arduino IDE

TTGO LoRa32 SX1276 OLED — это плата разработки на базе ESP32 со встроенным чипом LoRa и OLED-дисплеем SSD1306 размером 0,96 дюйма. В этом руководстве мы покажем, как: отправлять и принимать LoRa-пакеты (связь «точка-точка») и использовать OLED-дисплей с Arduino IDE.

TTGO LoRa32 OLED SX1276: Начало работы с Arduino IDE

Для введения в LoRa-связь читайте: ESP32 с LoRa с использованием Arduino IDE.

Обзор TTGO LoRa32 SX1276 OLED

TTGO LoRa32 SX1276 OLED — это плата разработки с ESP32, встроенным чипом LoRa и OLED-дисплеем SSD1306. Это та же модель OLED-дисплея, которую мы используем в большинстве наших электронных проектов (Руководство по OLED-дисплею с ESP32).

Обзор TTGO LoRa32 OLED SX1276

Плата также имеет несколько GPIO для подключения периферии, кнопки PRG (BOOT) и RST, а также разъём для литиевой батареи. Для более подробного обзора этой платы читайте: Обзор TTGO LoRa32 SX1276 OLED.

Где купить?

Вы можете перейти на страницу TTGO LoRa32 SX1276 OLED на Maker Advisor, чтобы найти лучшую цену в разных магазинах. Для выполнения этого руководства вам понадобятся две платы TTGO LoRa32.

TTGO LoRa32 OLED SX1276

Распиновка TTGO LoRa32 SX1276 OLED

На следующем рисунке показана распиновка платы TTGO LoRa32 OLED.

Схема распиновки TTGO LoRa32 OLED SX1276

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.

Следуйте следующим шагам для установки этих библиотек.

  1. Откройте Arduino IDE и перейдите в Sketch > Include Library > Manage Libraries. Должен открыться менеджер библиотек.

  2. Введите «SSD1306» в поле поиска и установите библиотеку SSD1306 от Adafruit.

Установка библиотеки Adafruit SSD1306 для OLED-дисплея Arduino IDE
  1. После установки библиотеки SSD1306 от Adafruit введите «GFX» в поле поиска и установите библиотеку.

Установка библиотеки GFX для ESP32 Arduino IDE

Установка библиотеки LoRa

Существует несколько библиотек для удобной отправки и приёма LoRa-пакетов с ESP32. В этом примере мы будем использовать библиотеку arduino-LoRa от sandeep mistry.

Откройте Arduino IDE и перейдите в Sketch > Include Library > Manage Libraries, затем найдите «LoRa». Выберите библиотеку LoRa, выделенную на рисунке ниже, и установите её.

Установка библиотеки LoRa для ESP32 Arduino IDE

После установки библиотек перезапустите 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.

Выбор TTGO LoRa32 OLED V1 в Arduino IDE

После загрузки кода на плату она должна начать отправлять LoRa-пакеты.

TTGO LoRa ESP32 Dev Board — Передатчик

Скетч 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 LoRa ESP32 Dev Board — Приёмник

Заключение

Эта статья была кратким руководством по началу работы с платой TTGO LoRa32: как отправлять LoRa-пакеты в режиме связи «точка-точка» и использовать OLED-дисплей.

Теперь идея состоит в том, чтобы комбинировать то, что вы здесь узнали, для создания IoT-проектов. LoRa может быть особенно полезна, если вы хотите получать показания датчиков, которые не покрываются вашей Wi-Fi сетью и находятся на расстоянии нескольких метров. Кроме того, вы также можете подключить свою плату к TTN (The Things Network).

Надеемся, что это руководство было для вас полезным. Узнайте больше об ESP32 с помощью наших ресурсов:

Спасибо за чтение.

Примечание

Это перевод статьи TTGO LoRa32 SX1276 OLED Board: Getting Started with Arduino IDE с сайта Random Nerd Tutorials, автор — Rui Santos.