diff --git a/platformio.ini b/platformio.ini index 9600872..0f9efc3 100644 --- a/platformio.ini +++ b/platformio.ini @@ -12,7 +12,7 @@ upload_flags = -Pusb -e lib_deps = - https://github.com/aZholtikov/zh_rf_config#dev + https://github.com/aZholtikov/zh_nrf24_config#dev [env:ATmega168P] platform = atmelavr @@ -28,7 +28,7 @@ upload_flags = -Pusb -e lib_deps = - https://github.com/aZholtikov/zh_rf_config#dev + https://github.com/aZholtikov/zh_nrf24_config#dev [env:ATmega168PB] platform = atmelavr @@ -44,7 +44,7 @@ upload_flags = -Pusb -e lib_deps = - https://github.com/aZholtikov/zh_rf_config#dev + https://github.com/aZholtikov/zh_nrf24_config#dev [env:ATmega328] platform = atmelavr @@ -60,7 +60,7 @@ upload_flags = -Pusb -e lib_deps = - https://github.com/aZholtikov/zh_rf_config#dev + https://github.com/aZholtikov/zh_nrf24_config#dev [env:ATmega328P] platform = atmelavr @@ -76,7 +76,7 @@ upload_flags = -Pusb -e lib_deps = - https://github.com/aZholtikov/zh_rf_config#dev + https://github.com/aZholtikov/zh_nrf24_config#dev [env:ATmega328PB] platform = atmelavr @@ -92,4 +92,4 @@ upload_flags = -Pusb -e lib_deps = - https://github.com/aZholtikov/zh_rf_config#dev \ No newline at end of file + https://github.com/aZholtikov/zh_nrf24_config#dev \ No newline at end of file diff --git a/src/main.c b/src/main.c index 4a36f3b..731bf23 100644 --- a/src/main.c +++ b/src/main.c @@ -7,7 +7,7 @@ #include "util/delay.h" #include "math.h" #include "stdbool.h" -#include "zh_rf_config.h" +#include "zh_nrf24_config.h" #if defined(__AVR_ATmega328PB__) #ifndef SPCR @@ -295,11 +295,11 @@ static float zh_get_battery_voltage(void); static volatile uint8_t send_request = false; static volatile uint8_t nrf_event = false; -zh_rf_sensor_transmitted_data_t transmitted_data = {0}; +zh_nrf24_sensor_transmitted_data_t transmitted_data = {0}; int main(void) { - transmitted_data.type = ZH_RF_SENSOR_TOUCH_SWITCH; + transmitted_data.type = ZH_NRF24_SENSOR_TOUCH_SWITCH; MCUSR &= ~(1 << WDRF); wdt_disable(); cli(); @@ -315,8 +315,8 @@ int main(void) } transmitted_data.id = (int16_t)device_id; { - uint8_t probe[ZH_RF_MAX_PAYLOAD_SIZE]; - if (zh_rf_sensor_build_payload(&transmitted_data, probe, sizeof(probe)) == 0) + uint8_t probe[ZH_NRF24_MAX_PAYLOAD_SIZE]; + if (zh_nrf24_sensor_build_payload(&transmitted_data, probe, sizeof(probe)) == 0) { zh_enter_final_sleep(); } @@ -329,8 +329,8 @@ int main(void) send_request = false; sei(); transmitted_data.battery = (int16_t)lroundf(zh_get_battery_voltage() * 100.0); - uint8_t payload[ZH_RF_MAX_PAYLOAD_SIZE]; - uint8_t size = zh_rf_sensor_build_payload(&transmitted_data, payload, sizeof(payload)); + uint8_t payload[ZH_NRF24_MAX_PAYLOAD_SIZE]; + uint8_t size = zh_nrf24_sensor_build_payload(&transmitted_data, payload, sizeof(payload)); if (size > 0) { zh_nrf24_send(payload, size); @@ -594,25 +594,25 @@ static uint16_t zh_get_random_token(void) static uint8_t zh_do_pairing(void) { uint16_t token = zh_get_random_token(); - zh_rf_sensor_pairing_data_t pairing_request; + zh_nrf24_sensor_pairing_data_t pairing_request; pairing_request.type = (uint8_t)transmitted_data.type; - pairing_request.magic = ZH_RF_PAIRING_REQ_MAGIC; + pairing_request.magic = ZH_NRF24_PAIRING_REQ_MAGIC; pairing_request.token_hi = (uint8_t)(token >> 8); pairing_request.token_lo = (uint8_t)(token & 0xFF); pairing_request.id = 0; zh_nrf24_interrupt_init(); - zh_rf_sensor_pairing_state_t state = ZH_RF_PAIR_SEND; + zh_nrf24_sensor_pairing_state_t state = ZH_NRF24_PAIR_SEND; uint8_t attempts = 0; for (;;) { switch (state) { - case ZH_RF_PAIR_SEND: + case ZH_NRF24_PAIR_SEND: nrf_event = false; - zh_nrf24_send_no_wait((uint8_t *)&pairing_request, ZH_RF_PAIRING_PACKET_SIZE); - state = ZH_RF_PAIR_TX_WAIT; + zh_nrf24_send_no_wait((uint8_t *)&pairing_request, ZH_NRF24_PAIRING_PACKET_SIZE); + state = ZH_NRF24_PAIR_TX_WAIT; break; - case ZH_RF_PAIR_TX_WAIT: + case ZH_NRF24_PAIR_TX_WAIT: if ((PIND & (1 << PD2)) == 0) { nrf_event = true; @@ -636,19 +636,19 @@ static uint8_t zh_do_pairing(void) if ((status & NRF_STATUS_TX_DS) != 0) { zh_nrf24_enter_rx(); - state = ZH_RF_PAIR_RX_WAIT; + state = ZH_NRF24_PAIR_RX_WAIT; } else { - state = ZH_RF_PAIR_BACKOFF; + state = ZH_NRF24_PAIR_BACKOFF; } } else { - state = ZH_RF_PAIR_BACKOFF; + state = ZH_NRF24_PAIR_BACKOFF; } break; - case ZH_RF_PAIR_RX_WAIT: + case ZH_NRF24_PAIR_RX_WAIT: if ((PIND & (1 << PD2)) == 0) { nrf_event = true; @@ -671,27 +671,27 @@ static uint8_t zh_do_pairing(void) if ((status & NRF_STATUS_RX_DR) != 0) { uint8_t width = zh_nrf24_read_payload_width(); - if (width > ZH_RF_MAX_PAYLOAD_SIZE) + if (width > ZH_NRF24_MAX_PAYLOAD_SIZE) { zh_nrf24_send_command(NRF_CMD_FLUSH_RX); zh_nrf24_write_register(NRF_REG_STATUS, NRF_STATUS_RX_DR); - state = ZH_RF_PAIR_BACKOFF; + state = ZH_NRF24_PAIR_BACKOFF; break; } - if (width != ZH_RF_PAIRING_PACKET_SIZE) + if (width != ZH_NRF24_PAIRING_PACKET_SIZE) { - uint8_t dummy[ZH_RF_MAX_PAYLOAD_SIZE]; + uint8_t dummy[ZH_NRF24_MAX_PAYLOAD_SIZE]; zh_nrf24_read_payload(dummy, width); zh_nrf24_write_register(NRF_REG_STATUS, NRF_STATUS_RX_DR); zh_nrf24_send_command(NRF_CMD_FLUSH_RX); - state = ZH_RF_PAIR_BACKOFF; + state = ZH_NRF24_PAIR_BACKOFF; break; } - zh_rf_sensor_pairing_data_t pairing_response; + zh_nrf24_sensor_pairing_data_t pairing_response; zh_nrf24_read_payload((uint8_t *)&pairing_response, width); zh_nrf24_write_register(NRF_REG_STATUS, NRF_STATUS_RX_DR | NRF_STATUS_TX_DS | NRF_STATUS_MAX_RT); zh_nrf24_send_command(NRF_CMD_FLUSH_RX); - if (pairing_response.magic == ZH_RF_PAIRING_ACK_MAGIC && pairing_response.type == pairing_request.type && + if (pairing_response.magic == ZH_NRF24_PAIRING_ACK_MAGIC && pairing_response.type == pairing_request.type && pairing_response.token_hi == pairing_request.token_hi && pairing_response.token_lo == pairing_request.token_lo && pairing_response.id != 0 && pairing_response.id != DEVICE_ID_UNASSIGNED) { @@ -701,14 +701,14 @@ static uint8_t zh_do_pairing(void) return pairing_response.id; } } - state = ZH_RF_PAIR_BACKOFF; + state = ZH_NRF24_PAIR_BACKOFF; } else { - state = ZH_RF_PAIR_BACKOFF; + state = ZH_NRF24_PAIR_BACKOFF; } break; - case ZH_RF_PAIR_BACKOFF: + case ZH_NRF24_PAIR_BACKOFF: zh_nrf24_enter_power_down(); nrf_event = false; zh_wdt_start(WDT_T_4S); @@ -722,7 +722,7 @@ static uint8_t zh_do_pairing(void) { zh_enter_final_sleep(); } - state = ZH_RF_PAIR_SEND; + state = ZH_NRF24_PAIR_SEND; break; } } diff --git a/wiki_ru.md b/wiki_ru.md index e4d459b..0d70e71 100644 --- a/wiki_ru.md +++ b/wiki_ru.md @@ -25,12 +25,12 @@ Прошивка не использует динамическое выделение памяти. Все данные хранятся в статической области и регистрах микроконтроллера. -Пакет формируется в глобальной переменной `transmitted_data` типа `zh_rf_sensor_transmitted_data_t` из внешней библиотеки `zh_rf_config` и сериализуется функцией `zh_rf_sensor_build_payload()` перед передачей. +Пакет формируется в глобальной переменной `transmitted_data` типа `zh_nrf24_sensor_transmitted_data_t` из внешней библиотеки `zh_nrf24_config` и сериализуется функцией `zh_nrf24_sensor_build_payload()` перед передачей. | Поле | Тип | Описание | | ------ | ----- | ---------- | | `id` | `int16_t` | Идентификатор устройства, присвоенный шлюзом при сопряжении | -| `type` | `int16_t` | Тип устройства (`ZH_RF_SENSOR_TOUCH_SWITCH`) | +| `type` | `int16_t` | Тип устройства (`ZH_NRF24_SENSOR_TOUCH_SWITCH`) | | `battery` | `int16_t` | Напряжение батареи × 100 (например, 330 = 3.30 В) | ### Конфигурационные макросы @@ -144,10 +144,10 @@ Конечный автомат `zh_do_pairing()` работает в четырёх состояниях: -1. **`ZH_RF_PAIR_SEND`** — генерируется псевдослучайный токен, формируется пакет запроса (`zh_rf_sensor_pairing_data_t` с `magic = ZH_RF_PAIRING_REQ_MAGIC`), выполняется неблокирующая передача через `zh_nrf24_send_no_wait()`. -2. **`ZH_RF_PAIR_TX_WAIT`** — ожидание прерывания IRQ (завершение передачи). Если пин IRQ уже низкий — событие считается наступившим. Иначе — переход в сон с watchdog-таймером 250 мс. При флаге `TX_DS` — переход в приём, при `MAX_RT` — в backoff. -3. **`ZH_RF_PAIR_RX_WAIT`** — ожидание ответа шлюза. При получении пакета проверяется: длина равна `ZH_RF_PAIRING_PACKET_SIZE`, `magic == ZH_RF_PAIRING_ACK_MAGIC`, тип совпадает, токен совпадает, `id != 0` и `id != DEVICE_ID_UNASSIGNED`. При успехе — сохранение `id` в EEPROM и возврат. -4. **`ZH_RF_PAIR_BACKOFF`** — переход в Power Down, ожидание 4 с через watchdog. После `PAIRING_TIMEOUT_ATTEMPTS` (7) неудачных попыток — переход в `zh_enter_final_sleep()`. +1. **`ZH_NRF24_PAIR_SEND`** — генерируется псевдослучайный токен, формируется пакет запроса (`zh_nrf24_sensor_pairing_data_t` с `magic = ZH_NRF24_PAIRING_REQ_MAGIC`), выполняется неблокирующая передача через `zh_nrf24_send_no_wait()`. +2. **`ZH_NRF24_PAIR_TX_WAIT`** — ожидание прерывания IRQ (завершение передачи). Если пин IRQ уже низкий — событие считается наступившим. Иначе — переход в сон с watchdog-таймером 250 мс. При флаге `TX_DS` — переход в приём, при `MAX_RT` — в backoff. +3. **`ZH_NRF24_PAIR_RX_WAIT`** — ожидание ответа шлюза. При получении пакета проверяется: длина равна `ZH_NRF24_PAIRING_PACKET_SIZE`, `magic == ZH_NRF24_PAIRING_ACK_MAGIC`, тип совпадает, токен совпадает, `id != 0` и `id != DEVICE_ID_UNASSIGNED`. При успехе — сохранение `id` в EEPROM и возврат. +4. **`ZH_NRF24_PAIR_BACKOFF`** — переход в Power Down, ожидание 4 с через watchdog. После `PAIRING_TIMEOUT_ATTEMPTS` (7) неудачных попыток — переход в `zh_enter_final_sleep()`. ### Алгоритм измерения напряжения батареи @@ -195,10 +195,10 @@ #include "avr/wdt.h" #include "math.h" #include "stdbool.h" -#include "zh_rf_config.h" +#include "zh_nrf24_config.h" static volatile uint8_t send_request = false; -zh_rf_sensor_transmitted_data_t transmitted_data = {0}; +zh_nrf24_sensor_transmitted_data_t transmitted_data = {0}; ISR(INT1_vect) { @@ -207,7 +207,7 @@ ISR(INT1_vect) int main(void) { - transmitted_data.type = ZH_RF_SENSOR_TOUCH_SWITCH; + transmitted_data.type = ZH_NRF24_SENSOR_TOUCH_SWITCH; MCUSR &= ~(1 << WDRF); wdt_disable(); cli(); @@ -231,8 +231,8 @@ int main(void) send_request = false; sei(); transmitted_data.battery = (int16_t)lroundf(zh_get_battery_voltage() * 100.0); - uint8_t payload[ZH_RF_MAX_PAYLOAD_SIZE]; - uint8_t size = zh_rf_sensor_build_payload(&transmitted_data, payload, sizeof(payload)); + uint8_t payload[ZH_NRF24_MAX_PAYLOAD_SIZE]; + uint8_t size = zh_nrf24_sensor_build_payload(&transmitted_data, payload, sizeof(payload)); if (size > 0) { zh_nrf24_send(payload, size); @@ -273,7 +273,7 @@ int main(void) // Измените адрес и канал под ваш шлюз #define GATEWAY_CHANNEL 120 #define GATEWAY_ADDRESS 0xDDEEFF -// Тип устройства задаётся перечислением ZH_RF_SENSOR_TOUCH_SWITCH из zh_rf_config +// Тип устройства задаётся перечислением ZH_NRF24_SENSOR_TOUCH_SWITCH из zh_nrf24_config ``` --- @@ -286,9 +286,9 @@ int main(void) | --------- | ----------- | | Нулевое показание АЦП | `zh_get_battery_voltage()` возвращает `0.0` | | Превышение таймаута передачи (100 мс) | Передача прерывается, пакет теряется | -| Неверная длина принятого пакета при сопряжении | Пакет отбрасывается, переход в `ZH_RF_PAIR_BACKOFF` | +| Неверная длина принятого пакета при сопряжении | Пакет отбрасывается, переход в `ZH_NRF24_PAIR_BACKOFF` | | Превышение числа попыток сопряжения (7) | `zh_enter_final_sleep()` — сон до сброса | -| `zh_rf_sensor_build_payload()` возвращает 0 | Передача пропускается, переход в `zh_enter_final_sleep()` | +| `zh_nrf24_sensor_build_payload()` возвращает 0 | Передача пропускается, переход в `zh_enter_final_sleep()` | --- @@ -308,7 +308,7 @@ int main(void) - PlatformIO с плагином `platform-atmelavr` - AVR-GCC (входит в состав PlatformIO) -- Библиотека `zh_rf_config` (подключается через `lib_deps` в `platformio.ini`) +- Библиотека `zh_nrf24_config` (подключается через `lib_deps` в `platformio.ini`) - Программатор USBasp (или совместимый) - Фьюзы: LFUSE=`0xE2`, HFUSE=`0xDF`, EFUSE=`0x07` (8 МГц, без делителя) @@ -326,12 +326,12 @@ pio run -e ATmega328P -t upload ### Подключение в проекте -Компонент является самодостаточной прошивкой — не подключается как библиотека. Для интеграции в другой проект скопируйте `src/main.c`, добавьте зависимость `zh_rf_config` и адаптируйте макросы конфигурации. +Компонент является самодостаточной прошивкой — не подключается как библиотека. Для интеграции в другой проект скопируйте `src/main.c`, добавьте зависимость `zh_nrf24_config` и адаптируйте макросы конфигурации. ```ini ; platformio.ini lib_deps = - https://github.com/aZholtikov/zh_rf_config + https://github.com/aZholtikov/zh_nrf24_config ``` ### Подключение заголовков в коде @@ -347,5 +347,5 @@ lib_deps = #include "util/delay.h" #include "math.h" #include "stdbool.h" -#include "zh_rf_config.h" +#include "zh_nrf24_config.h" ```