ELRS module RSSI send via UART #5

Open
opened 2026-10-05 05:58:31 +02:00 by adam · 1 comment
Owner
#include <HardwareSerial.h>
#include <CRC8.h>
#include <SPI.h>
#include <LoRa.h>

#define CRSF_SYNC_BYTE 0xC8
#define CRSF_FRAMETYPE_LINK_STATISTICS 0x14
#define CRSF_MAX_PACKET_SIZE 64
#define CRSF_BAUDRATE 420000

#define SCK 12
#define MISO 13
#define MOSI 14
#define SS 15
#define RST 4
#define DIO0 5


// Структура для зберігання даних статистики з'єднання
typedef struct PACKED {
    uint8_t uplink_RSSI_1;
    uint8_t uplink_RSSI_2;
    uint8_t uplink_Link_quality;
    int8_t uplink_SNR;
    uint8_t active_antenna;
    uint8_t rf_Mode;
    uint8_t uplink_TX_Power;
    uint8_t downlink_RSSI;
    uint8_t downlink_Link_quality;
    int8_t downlink_SNR;
} crsfLinkStatistics_t;

crsfLinkStatistics_t linkStats;

// Функція для розрахунку CRC8
uint8_t calculateCRC(uint8_t *data, size_t length) {
    CRC8 crc8;
    crc8.setPolynome(0xD5);
    crc8.restart();
    for (size_t i = 0; i < length; i++) {
        crc8.add(data[i]);
    }
    return crc8.getCRC();
}

// Функція для відправки пакету статистики з'єднання
void sendLinkStatistics() {
    uint8_t packet[CRSF_MAX_PACKET_SIZE];
    size_t payloadLength = sizeof(crsfLinkStatistics_t);
    
    packet[0] = CRSF_SYNC_BYTE;
    packet[1] = payloadLength + 2;  // Довжина (payload + type + crc)
    packet[2] = CRSF_FRAMETYPE_LINK_STATISTICS;

    memcpy(&packet[3], &linkStats, payloadLength);

    // Розрахунок і додавання CRC8
    uint8_t crc = calculateCRC(&packet[2], payloadLength + 1);
    packet[3 + payloadLength] = crc;

    // Відправка пакету через Serial1
    Serial.write(packet, payloadLength + 4);
}


void setup() {
 //   Serial.begin(115200); // Ініціалізація серійного порту для виведення даних на монітор
    Serial.begin(CRSF_BAUDRATE); // Ініціалізація Serial1 для CRSF

    // Заповнення структури статистики з'єднання прикладними даними
   // linkStats.uplink_RSSI_1 = 44;
  
  SPI.pins(SCK, MISO, MOSI, SS);
  //setup LoRa transceiver module
  LoRa.setPins(SS, RST, DIO0);
  if (!LoRa.begin(868E6)) {
    Serial.println("Starting LoRa failed!");
    while (1);
  }
  //LoRa.enableCrc();
 // LoRa.setFrequency(750E6);
  LoRa.receive();
   LoRa.setGain(1);
   LoRa.setSpreadingFactor(12);
   LoRa.setSignalBandwidth(10.4E3);
   //7.8E3, 10.4E3, 15.6E3, 20.8E3, 31.25E3, 41.7E3, 62.5E3, 125E3, and 250E3.
  Serial.println("LoRa initialised at 868 MHz");
}

void loop() {
     int maxRSSI = 130;
     int bfRSSI = 0;
      int rssi = 0;
      int bc = 0;
     for (int i = 0; i < 180; i++) {
        int packetSize = LoRa.parsePacket();
          if (packetSize){
            // Serial.println( packetSize); 
          }
          rssi = LoRa.rssi();   
        if (rssi < 0) {
              rssi *= -1;
          }
           
        if (rssi < maxRSSI) {
            maxRSSI = rssi; // Оновлення максимального значення
        }
        delay(1); // Невелика затримка між читаннями
    }

  //  Serial.println(rssi);
        
        //Serial.println(bfRSSI);
   // Serial.println(maxRSSI);
  //    Serial.print("Frequency: ");
 //   Serial.print(rssi);
 //   Serial.print(" MHz - RSSI: ");
  //  Serial.print(maxRSSI);
 //   Serial.println(" dBm");
    linkStats.uplink_RSSI_1 = maxRSSI;
   
    sendLinkStatistics(); // Виклик функції відправки пакету статистики з'єднання
   // delay(2100); // Затримка перед відправкою наступного пакету
}
```cpp #include <HardwareSerial.h> #include <CRC8.h> #include <SPI.h> #include <LoRa.h> #define CRSF_SYNC_BYTE 0xC8 #define CRSF_FRAMETYPE_LINK_STATISTICS 0x14 #define CRSF_MAX_PACKET_SIZE 64 #define CRSF_BAUDRATE 420000 #define SCK 12 #define MISO 13 #define MOSI 14 #define SS 15 #define RST 4 #define DIO0 5 // Структура для зберігання даних статистики з'єднання typedef struct PACKED { uint8_t uplink_RSSI_1; uint8_t uplink_RSSI_2; uint8_t uplink_Link_quality; int8_t uplink_SNR; uint8_t active_antenna; uint8_t rf_Mode; uint8_t uplink_TX_Power; uint8_t downlink_RSSI; uint8_t downlink_Link_quality; int8_t downlink_SNR; } crsfLinkStatistics_t; crsfLinkStatistics_t linkStats; // Функція для розрахунку CRC8 uint8_t calculateCRC(uint8_t *data, size_t length) { CRC8 crc8; crc8.setPolynome(0xD5); crc8.restart(); for (size_t i = 0; i < length; i++) { crc8.add(data[i]); } return crc8.getCRC(); } // Функція для відправки пакету статистики з'єднання void sendLinkStatistics() { uint8_t packet[CRSF_MAX_PACKET_SIZE]; size_t payloadLength = sizeof(crsfLinkStatistics_t); packet[0] = CRSF_SYNC_BYTE; packet[1] = payloadLength + 2; // Довжина (payload + type + crc) packet[2] = CRSF_FRAMETYPE_LINK_STATISTICS; memcpy(&packet[3], &linkStats, payloadLength); // Розрахунок і додавання CRC8 uint8_t crc = calculateCRC(&packet[2], payloadLength + 1); packet[3 + payloadLength] = crc; // Відправка пакету через Serial1 Serial.write(packet, payloadLength + 4); } void setup() { // Serial.begin(115200); // Ініціалізація серійного порту для виведення даних на монітор Serial.begin(CRSF_BAUDRATE); // Ініціалізація Serial1 для CRSF // Заповнення структури статистики з'єднання прикладними даними // linkStats.uplink_RSSI_1 = 44; SPI.pins(SCK, MISO, MOSI, SS); //setup LoRa transceiver module LoRa.setPins(SS, RST, DIO0); if (!LoRa.begin(868E6)) { Serial.println("Starting LoRa failed!"); while (1); } //LoRa.enableCrc(); // LoRa.setFrequency(750E6); LoRa.receive(); LoRa.setGain(1); LoRa.setSpreadingFactor(12); LoRa.setSignalBandwidth(10.4E3); //7.8E3, 10.4E3, 15.6E3, 20.8E3, 31.25E3, 41.7E3, 62.5E3, 125E3, and 250E3. Serial.println("LoRa initialised at 868 MHz"); } void loop() { int maxRSSI = 130; int bfRSSI = 0; int rssi = 0; int bc = 0; for (int i = 0; i < 180; i++) { int packetSize = LoRa.parsePacket(); if (packetSize){ // Serial.println( packetSize); } rssi = LoRa.rssi(); if (rssi < 0) { rssi *= -1; } if (rssi < maxRSSI) { maxRSSI = rssi; // Оновлення максимального значення } delay(1); // Невелика затримка між читаннями } // Serial.println(rssi); //Serial.println(bfRSSI); // Serial.println(maxRSSI); // Serial.print("Frequency: "); // Serial.print(rssi); // Serial.print(" MHz - RSSI: "); // Serial.print(maxRSSI); // Serial.println(" dBm"); linkStats.uplink_RSSI_1 = maxRSSI; sendLinkStatistics(); // Виклик функції відправки пакету статистики з'єднання // delay(2100); // Затримка перед відправкою наступного пакету } ``` <!-- github-sync-id:2479924795 -->
Author
Owner
Video how to flash: https://www.youtube.com/watch?v=_jXpIpqEq24 <!-- github-comment-id:2601458406 -->
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: adam/LoraSA#5