diff --git a/README.md b/README.md
index 234ca4c..36df8a1 100644
--- a/README.md
+++ b/README.md
@@ -51,11 +51,12 @@ Gyver433_xx<пин, буфер, CRC> xx;
// === ДЕФАЙНЫ-НАСТРОЙКИ ===
// вызывать перед подключением библиотеки
-#define G433_FAST // [TX] короткая синхронизация для зелёных модулей
-#define G433_MEDIUM // [TX] средняя синхронизация при отправке на SYN480R ЧАЩЕ 400мс (активно по умолчанию)
-#define G433_SLOW // [TX] длинная синхронизация при отправке на SYN480R РЕЖЕ 400мс
-#define G433_MANCHESTER // [должно быть одинаково на RX и TX] интерфейс Manchester Coding для экспериментов =)
-#define G433_SPEED 1000 // [должно быть одинаково на RX и TX] скорость 100-8000 бит/с, по умолч. 2000 бит/с
+#define G433_FAST // [TX] короткая синхронизация для зелёных модулей
+#define G433_MEDIUM // [TX] средняя синхронизация при отправке на SYN480R ЧАЩЕ 400мс (активно по умолчанию)
+#define G433_SLOW // [TX] длинная синхронизация при отправке на SYN480R РЕЖЕ 400мс
+#define G433_MANCHESTER // [должно быть одинаково на RX и TX] интерфейс Manchester Coding для экспериментов =)
+#define G433_SPEED 1000 // [должно быть одинаково на RX и TX] скорость 100-8000 бит/с, по умолч. 2000 бит/с
+#define G433_RSSI_COUNT 10 // [RX] количество успешно принятых пакетов для расчёта RSSI (по умолч. 10)
```
@@ -74,6 +75,7 @@ bool readData(T &data); // прочитает буфер в любой ти
uint16_t getSize(); // получить размер принятых данных
uint16_t gotData(); // вернёт количество успешно принятых в tickISR() байт (см. пример isr_rx)
uint8_t buffer[]; // доступ к буферу для отладки
+uint8_t getRSSI(); // получить качество приёма (процент успешных передач)
// ============= CRC =============
// можно использовать встроенные функции для генерации байта CRC для ручной упаковки пакетов
@@ -84,7 +86,7 @@ uint8_t G433_crc_xor(uint8_t *buffer, uint8_t size); // ручной CRC XOR
## Примеры
Остальные примеры смотри в **examples**!
-
+
### Отправка
```cpp
#include
@@ -151,6 +153,7 @@ void loop() {
- v1.0
- v1.1 - оптимизация, новый интерфейс, поддержка дешёвых синих модулей, работа в прерывании
- v1.2 - улучшение качества связи, оптимизация работы в прерывании
+- v1.3 - добавлен вывод RSSI
## Баги и обратная связь
diff --git a/examples/demo_rx/demo_rx.ino b/examples/demo_rx/demo_rx.ino
index 6766be2..8bb2e78 100644
--- a/examples/demo_rx/demo_rx.ino
+++ b/examples/demo_rx/demo_rx.ino
@@ -31,6 +31,9 @@ void loop() {
// принятые данные доступны в .buffer
// и имеют размер .size
Serial.write(rx.buffer, rx.size);
- Serial.println();
+
+ // выведем также качество связи
+ Serial.print(", RSSI: ");
+ Serial.println(rx.getRSSI());
}
}
diff --git a/keywords.txt b/keywords.txt
index cb3b765..9ea093a 100644
--- a/keywords.txt
+++ b/keywords.txt
@@ -26,6 +26,7 @@ getSize KEYWORD2
gotData KEYWORD2
G433_crc8 KEYWORD2
G433_crc_xor KEYWORD2
+getRSSI KEYWORD2
#######################################
# Constants (LITERAL1)
diff --git a/library.properties b/library.properties
index 6d6eee2..0f78849 100644
--- a/library.properties
+++ b/library.properties
@@ -1,5 +1,5 @@
name=Gyver433
-version=1.2
+version=1.3
author=AlexGyver
maintainer=AlexGyver
sentence=Simple library for 433 MHz radio
diff --git a/src/Gyver433.h b/src/Gyver433.h
index e4baa21..3cc1faf 100644
--- a/src/Gyver433.h
+++ b/src/Gyver433.h
@@ -18,6 +18,7 @@
v1.0 - релиз
v1.1 - оптимизация, новый интерфейс, поддержка дешёвых синих модулей, работа в прерывании
v1.2 - улучшение качества связи, оптимизация работы в прерывании
+ v1.3 - добавлен вывод RSSI
*/
#ifndef Gyver433_h
@@ -34,6 +35,10 @@ uint8_t G433_crc_xor(uint8_t *buffer, uint8_t size); // ручной CRC XOR
#define G433_SPEED 2000
#endif
+#ifndef G433_RSSI_COUNT
+#define G433_RSSI_COUNT 10
+#endif
+
// тайминги интерфейса
#define FRAME_TIME (1000000ul / G433_SPEED) // время фрейма (либо HIGH)
#define HALF_FRAME (FRAME_TIME / 2) // полфрейма (либо LOW)
@@ -188,18 +193,29 @@ public:
uint16_t gotData() {
if (parse == 2 && millis() - tmr2 >= 10) { // фрейм не закрыт
parse = size = 0; // приём окончен
- if (byteCount > 1) { // если что то приняли
+ if (byteCount > 1 + !!CRC_MODE) { // если что то приняли
if (CRC_MODE == G433_CRC8) { // CRC8
if (!G433_crc8(buffer, byteCount)) size = byteCount - 2;
} else if (CRC_MODE == G433_XOR) { // CRC XOR
if (!G433_crc_xor(buffer, byteCount)) size = byteCount - 2;
} else size = byteCount - 1; // без CRC
+ if (size > 0) okCount++;
+ else errCount++;
+ if (okCount >= G433_RSSI_COUNT) {
+ RSSI = 100 - errCount * 100 / (errCount + okCount);
+ errCount = okCount = 0;
+ }
}
return size;
}
return 0;
}
+ // получить качество приёма (процент успешных передач)
+ uint8_t getRSSI() {
+ return RSSI;
+ }
+
// получить размер принятых данных
uint16_t getSize() {
return size;
@@ -270,6 +286,7 @@ private:
uint8_t parse = 0;
uint32_t tmr = 0, tmr2 = 0;
uint8_t bitCount = 0, byteCount = 0;
+ uint8_t errCount = 0, okCount = 0, RSSI = 0;
};
// ===== CRC =====