#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
// Структура для зберігання даних статистики з'єднання
typedefstructPACKED{uint8_tuplink_RSSI_1;uint8_tuplink_RSSI_2;uint8_tuplink_Link_quality;int8_tuplink_SNR;uint8_tactive_antenna;uint8_trf_Mode;uint8_tuplink_TX_Power;uint8_tdownlink_RSSI;uint8_tdownlink_Link_quality;int8_tdownlink_SNR;}crsfLinkStatistics_t;crsfLinkStatistics_tlinkStats;// Функція для розрахунку CRC8
uint8_tcalculateCRC(uint8_t*data,size_tlength){CRC8crc8;crc8.setPolynome(0xD5);crc8.restart();for(size_ti=0;i<length;i++){crc8.add(data[i]);}returncrc8.getCRC();}// Функція для відправки пакету статистики з'єднання
voidsendLinkStatistics(){uint8_tpacket[CRSF_MAX_PACKET_SIZE];size_tpayloadLength=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_tcrc=calculateCRC(&packet[2],payloadLength+1);packet[3+payloadLength]=crc;// Відправка пакету через Serial1
Serial.write(packet,payloadLength+4);}voidsetup(){// 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");}voidloop(){intmaxRSSI=130;intbfRSSI=0;intrssi=0;intbc=0;for(inti=0;i<180;i++){intpacketSize=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 -->
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Video how to flash:
https://www.youtube.com/watch?v=_jXpIpqEq24