#include <RadioLib.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// Піни для LoRa (SX1276)
#define LORA_SCK 5
#define LORA_MISO 19
#define LORA_MOSI 27
#define LORA_CS 18
#define LORA_RST 23
#define LORA_DIO0 26
// Піни для OLED-дисплея (I2C)
#define OLED_SDA 21
#define OLED_SCL 22
#define OLED_RST 16 // Якщо екран не вмикається, змініть на -1
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
// Створення об'єкта дисплея
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RST);
// Створення об'єкта радіо
SX1276 radio = new Module(LORA_CS, LORA_DIO0, LORA_RST, RADIOLIB_NC);
String s;
void setup() {
Serial.begin(115200);
delay(1000);
// 1. Ініціалізація скидання екрана (потрібно для деяких версій LilyGO)
pinMode(OLED_RST, OUTPUT);
digitalWrite(OLED_RST, LOW);
delay(20);
digitalWrite(OLED_RST, HIGH);
// 2. Ініціалізація шини I2C та Дисплея (адреса 0x3C)
Wire.begin(OLED_SDA, OLED_SCL);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("[OLED] Помилка ініціалізації дисплея!"));
} else {
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
display.setTextSize(1);
display.setCursor(0, 0);
display.println("LilyGO LoRa32");
display.println("Запуск...");
display.display();
}
// 3. Ініціалізація SPI та LoRa
SPI.begin(LORA_SCK, LORA_MISO, LORA_MOSI, LORA_CS);
Serial.print(F("[LoRa] Ініціалізація SX1276... "));
int state = radio.begin(868.0, 125.0, 9, 7, 0x12, 10, 8);
display.clearDisplay();
display.setCursor(0, 0);
if (state == RADIOLIB_ERR_NONE) {
Serial.println(F("УСПІШНО!"));
display.println("LoRa: OK");
display.println("Очікування пакетів...");
} else {
Serial.print(F("ПОМИЛКА! Код: "));
Serial.println(state);
display.println("LoRa: ERROR!");
display.print("Code: ");
display.println(state);
}
display.display();
}
void loop() {
// Прийом пакета
int st = radio.receive(s);
if (st == RADIOLIB_ERR_NONE) {
// Вивід у Serial Monitor
Serial.print(F("Отримано: "));
Serial.println(s);
Serial.print(F("RSSI: "));
Serial.print(radio.getRSSI());
Serial.println(F(" dBm"));
// Вивід на OLED Екран
display.clearDisplay();
display.setCursor(0, 0);
display.setTextSize(1);
display.println("--- ПАКЕТ ОТРИМАНО ---");
display.println();
// Текст повідомлення
display.print("Text: ");
display.println(s);
// Сигнал
display.print("RSSI: ");
display.print(radio.getRSSI());
display.println(" dBm");
display.print("SNR: ");
display.print(radio.getSNR());
display.println(" dB");
display.display(); // Оновлення зображення на екрані
}
else if (st == RADIOLIB_ERR_RX_TIMEOUT) {
// Таймаут — нормально при очікуванні
}
else {
Serial.print(F("Помилка прийому: "));
Serial.println(st);
}
delay(100); // Невеликий затримка для стабільності loops
}
Мікроконтролер (ESP32-D0WDQ6):
Процесор: Двоядерний Xtensa LX6 (Wi-Fi + Bluetooth).
UART (USB-Serial): TX = GPIO 1, RX = GPIO 3 (з'єднані з USB-конвертером CP2102 або CH9102).
Радіомодуль LoRa (Semtech SX1276 / SX1278):
Шина: Апаратна SPI.
LORA_SCK — GPIO 5 (Clock)
LORA_MISO — GPIO 19 (Master In Slave Out)
LORA_MOSI — GPIO 27 (Master Out Slave In)
LORA_CS (NSS) — GPIO 18 (Chip Select)
LORA_RST — GPIO 23 (Hardware Reset)
LORA_DIO0 — GPIO 26 (Переривання для прийому/передачі пакетів)
OLED Дисплей (0.96 дюйма, SSD1306, 128x64):
Шина: I2C (Адреса 0x3C або 0x3D).
OLED_SDA — GPIO 21 (Data)
OLED_SCL — GPIO 22 (Clock)
OLED_RST — GPIO 16 (Reset дисплея)
Слот MicroSD карт пам'яті:
Шина: Окрема SPI (або сумісна з LoRa SPI залежно від ревізії).
SD_CS — GPIO 13
SD_MOSI — GPIO 15
SD_MISO — GPIO 2
SD_SCK — GPIO 14
Контролер живлення акумулятора (TP4054 або аналог):
Зчитування напруги АКБ (Li-Po 3.7V): GPIO 35 (підключено через дільник напруги до роз'єму батареї JST 1.25мм).
Кнопки та світлодіоди на платі:
Кнопка Reset: Фізична кнопка перезавантаження (підключена до піна EN / CHIP_PU).
Кнопка PRG / BOOT: GPIO 0 (використовується для переходу в режим прошивки або як користувацька кнопка).
Вбудований світлодіод (LED): GPIO 25 (зелений/блакитний світлодіод).
Пін на гребінці
Можливості / Особливості
3V3 / 5V / GND
Лінії живлення (3.3В після LDO регулятора, 5В від USB, Земля).
GPIO 12, 13, 14, 15
Вільні GPIO / Т touch-сенсори (якщо не задіяний SD-слот).
GPIO 32, 33, 34, 39
АЦП входи (ADC) для вимірювання аналогової напруги (GPIO 34, 39 — Тільки вхід/Input Only).
GPIO 2, 4
ШІМ (PWM) / Цифрові входи/виходи.