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**! -![Logo](/doc/scheme.jpg) +![scheme](/doc/scheme.jpg) ### Отправка ```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 =====