From cb2a33c97e6bfecf64bea07236675075f9159543 Mon Sep 17 00:00:00 2001 From: UA1ZBE Date: Wed, 22 Jul 2026 12:54:44 +0300 Subject: [PATCH] add snr command, update docs --- INSTRUCTION.md | 5 ++++- USER_MANUAL.md | 19 +++++-------------- src/main.cpp | 11 ++++++++++- 3 files changed, 19 insertions(+), 16 deletions(-) diff --git a/INSTRUCTION.md b/INSTRUCTION.md index 78220b5..ef28f70 100644 --- a/INSTRUCTION.md +++ b/INSTRUCTION.md @@ -116,6 +116,7 @@ All commands are processed in `onGroupDataRecv()`: | `status` | report state | `status:armed/off temp:±X.XC hall:trig/ok motion:trig/ok bat:X.XXV/USB` | | `ver` | build date | `build:Mon DD YYYY HH:MM:SS` | | `scan` | noise floor | `noise:-XXXdBm` | +| `snr` | RSSI и SNR последнего пакета | `rssi:-78dBm snr:+6.5dB` | | `uptime` | device uptime | `uptime:1d 3h 15m` | | `kontrol ` | auto-status every N min | `kontrol 60 min ok` | | `kontrol off` | disable auto-status | `kontrol off` | @@ -131,6 +132,8 @@ Alerts (`alert:hall`, `alert:motion`) and startup (`poweron`) are sent immediate ### Special Commands +- **`snr`** — returns `rssi:-78dBm snr:+6.5dB` based on the last received packet. Uses `radio_driver.getLastRSSI()` and `pkt->getSNR()`. Stored in `last_rssi` / `last_snr` fields, updated on every `onGroupDataRecv`. + - **`reboot`** — sends `rebooting` immediately (not deferred), blinks LED 5 times, then `NVIC_SystemReset()`. - **`uptime`** — calculates uptime from `g_boot_time` (set at boot). Format: `uptime:1d 3h 15m` (days/hours/minutes). - **`kontrol `** — sets `g_auto_status_interval = min * 60000`. In `loop()`, when `millis() - g_last_auto_status >= interval`, sends status. Range: 1–1440 minutes. @@ -198,7 +201,7 @@ pio run -e promicro_security -t upload pio device monitor -b 115200 ``` -Current resource usage: RAM 8%, Flash 36.5%. +Current resource usage: RAM 8.1%, Flash 36.8%. --- diff --git a/USER_MANUAL.md b/USER_MANUAL.md index 48ed423..957597e 100644 --- a/USER_MANUAL.md +++ b/USER_MANUAL.md @@ -34,6 +34,7 @@ Security Node — LoRa mesh-устройство, которое следит з | `status` | Показать состояние устройства | `status:armed temp:+23.5C hall:ok motion:trig bat:4.12V` | | `ver` | Версия прошивки (дата сборки) | `build:Jul 21 2026 15:30:00` | | `scan` | Измерить уровень шума в эфире | `noise:-112dBm` | +| `snr` | RSSI и SNR последнего принятого пакета | `rssi:-78dBm snr:+6.5dB` | | `uptime` | Время работы устройства | `uptime:1d 3h 15m` | | `kontrol <мин>` | Автоотправка статуса каждые N мин | `kontrol 60 min ok` | | `kontrol off` | Отключить автоотправку статуса | `kontrol off` | @@ -112,6 +113,10 @@ Security Node — LoRa mesh-устройство, которое следит з `kontrol 60` — устройство будет само отправлять `status` каждые 60 минут. `kontrol off` — отключить. Интервал от 1 до 1440 минут (1 минута — 24 часа). +## Качество сигнала (`snr`) + +`snr` — показывает RSSI (уровень сигнала в dBm) и SNR (соотношение сигнал/шум в dB) последнего принятого пакета. Полезно для оценки качества связи и при настройке антенны. Чем ближе RSSI к 0 и чем выше SNR — тем лучше. + ## Синхронизация времени (`time`) `time` — показать текущее время устройства. @@ -127,20 +132,6 @@ Security Node — LoRa mesh-устройство, которое следит з `uptime` — показывает, сколько времени устройство работает без перезагрузки. Пример: `uptime:1d 3h 15m` (1 день, 3 часа, 15 минут). -## Смена канала (`canal`) - -По умолчанию канал формируется из пароля `"1234"`. -Чтобы сменить: - -``` -canal домашний 5674 -``` - -Ответ: `canal домашний 5674 ok` -Через ~5 секунд устройство перезагрузится и начнёт работать на новом канале. - -**Важно:** Все устройства должны быть на одном канале. После смены канала связь будет только с теми узлами, у которых такой же пароль. Канал сохраняется в энергонезависимой памяти и не сбрасывается после перезагрузки. Чтобы вернуть канал по умолчанию — используйте `canal default 1234`. - --- ## Задержка ответа diff --git a/src/main.cpp b/src/main.cpp index 3fe7e09..2dba1a5 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -110,6 +110,9 @@ public: return 0; } + float last_rssi = -127.0f; + float last_snr = 0.0f; + char pending_response[256]; unsigned long pending_at = 0; bool pending = false; @@ -145,6 +148,9 @@ public: if (type != PAYLOAD_TYPE_GRP_TXT) return; if (len < 5 || data[4] != 0) return; + last_rssi = radio_driver.getLastRSSI(); + last_snr = pkt->getSNR(); + for (int i = 0; i < 3; i++) { digitalWrite(PIN_LED_STATUS, HIGH); delay(50); digitalWrite(PIN_LED_STATUS, LOW); delay(50); } int tlen = len - 5; @@ -162,7 +168,7 @@ public: while (*cmd == ' ') cmd++; if (strcmp(cmd, "help") == 0) { - defer_response("help:ohrana on,ohrana off,relay1 on,relay1 off,relay2 on,relay2 off,relay,status,ver,scan,uptime,kontrol,time,reboot"); + defer_response("help:ohrana on,ohrana off,relay1 on,relay1 off,relay2 on,relay2 off,relay,status,ver,scan,snr,uptime,kontrol,time,reboot"); } else if (strcmp(cmd, "ohrana on") == 0) { g_armed = true; digitalWrite(PIN_RELAY_1, LOW); saveSecurityConfig(); defer_response("ohrana on ok"); } else if (strcmp(cmd, "ohrana off") == 0) { @@ -256,6 +262,9 @@ public: char r[64]; snprintf(r, sizeof(r), "time set %02d.%02d.%04d %02d.%02d", d, m, y, h, mi); defer_response(r); } else defer_response("time s DD.MM.YYYY HH.MM"); + } else if (strcmp(cmd, "snr") == 0) { + char r[48]; snprintf(r, sizeof(r), "rssi:%.0fdBm snr:%.1fdB", last_rssi, last_snr); + defer_response(r); } else if (strcmp(cmd, "reboot") == 0) { send_text("rebooting"); delay(100);