# Сборка и прошивка ESP32 APRS-ретранслятора ## Требования - Установленный Arduino CLI - ESP32 (чип ESP32-D0WD-V3) - USB-кабель, порт `/dev/ttyUSB0` ## 1. Установка ядра ESP32 ```bash arduino-cli config init arduino-cli core update-index arduino-cli core install esp32:esp32@3.3.8 ``` Если `arduino-cli core install` падает с ошибкой 403 — скачайте архив вручную и распакуйте в `~/.arduino15/packages/esp32/hardware/esp32/3.3.8/`. Также может потребоваться dfu-util: ```bash sudo ln -s /usr/bin/dfu-util /home/ua1zbe/.arduino15/packages/esp32/tools/dfu-util/0.11.0-1/dfu-util 2>/dev/null ``` ## 2. Установка библиотек (из GitHub) Arduino Library Index недоступен (403), поэтому библиотеки ставятся вручную. ```bash cd ~/Arduino/libraries git clone https://github.com/olikraus/U8g2.git git clone https://github.com/lora-aprs/APRS-IS-Lib.git mv APRS-IS-Lib APRS-IS git clone https://github.com/lora-aprs/APRS-Decoder-Lib.git cd APRS-Decoder-Lib # Нужна версия 0.0.1, где есть класс APRSMessage git checkout v0.0.1 cd ~/Arduino/libraries git clone https://github.com/ropg/esp-logger.git ``` ## 3. Патчи библиотек ### 3.1 APRS-IS Создать файл `~/Arduino/libraries/APRS-IS/logger_compat.h`: ```cpp #pragma once #define logPrintlnE(msg) #define logPrintlnE_FN(fn, msg) #define logPrintlnD(msg) ``` В начале `APRS-IS.cpp` перед последним `#include` добавить: ```cpp #include "logger_compat.h" ``` Также заменить в `APRS-IS.cpp` строчку: ```cpp this->_ssid = ""; this->_pass = ""; ``` на: ```cpp this->_ssid = ""; ``` ### 3.2 APRS-Decoder-Lib (v0.0.1) В `APRSMessage.h` добавить метод: ```cpp String encode() { return toString(); } ``` ## 4. Подготовка скетча Скетч лежит в файле `pr133.ino`. Перед первой заливкой: 1. Убедитесь, что переменная `server` содержит актуальный адрес APRS-IS сервера: - `server = "rotate.radiorubka.org";` - И в EEPROM по адресу 181 должно быть то же значение. 2. При необходимости сброса EEPROM — измените чек-байт в `setup()`: ```cpp // Было: if(((readByteFromEEPROM(0, 0, 0x0))) != 164) // Стало (любое другое число): if(((readByteFromEEPROM(0, 0, 0x0))) != 165) ``` ## 5. Компиляция и заливка ```bash arduino-cli compile --fqbn esp32:esp32:esp32:PartitionScheme=huge_app \ -u -p /dev/ttyUSB0 "/home/ua1zbe/Рабочий стол/pr133" ``` Ключ `-u` означает «залить после компиляции». Размер скетча ~1.7 МБ, поэтому обязателен `huge_app`. Параметры fqbn: - `esp32:esp32:esp32` — плата ESP32 - `PartitionScheme=huge_app` — 3 МБ под приложение (по умолчанию 1.2 МБ) ## 6. Монитор порта ```bash python3 -c " import serial s = serial.Serial('/dev/ttyUSB0', 115200) while True: line = s.readline() if line: print(line.decode('utf-8', errors='replace').strip()) " ``` ## 7. Типовые проблемы | Проблема | Решение | |----------|---------| | Ошибки компоновки — partition scheme | Используйте `PartitionScheme=huge_app` | | Не находится `APRSMessage` | Проверьте версию APRS-Decoder-Lib — нужна v0.0.1 | | Ошибка `logger/logger.h` not found | Подключите `logger_compat.h` (см. п. 3.1) | | Нет WiFi из-за `getAutoConnect()` | Закомментируйте или удалите вызовы `WiFi.getAutoConnect()` и `setAutoConnect()` | | При загрузке виден старый сервер (ua1zbe.ml) | Сбросьте EEPROM, сменив чек-байт (п. 4) | | Скетч зависает на подключении к APRS-IS | Патч в `APRS-IS.cpp`: добавлен таймаут 10 с в `_connect()` вместо `while(true)` |