Meshtastic: компиляция прошивки для ESP32-C3 Super-Mini Печать
Добавил(а) microsin   

Сначала надо выполнить шаги "Этап 1" и "Этап 2" из [1]. На этих шагах устанавливается PlatformIO и закачивается репозиторий Git проекта Meshtastic.

[Этап 3: Адаптация конфигурации для E22-900M22]

1. Выберите основу для конфигурации. В папке variants/esp32c3/diy/esp32c3_super_mini находится готовая конфигурация, которая лучше всего подойдет для подключения к платке ESP32-S3 Super Mini. Она идеально работает в качестве стартовой точки, так как уже содержит настройки для работы с модулями Ebyte. В этой конфигурации надо будет сделать настройку выводов портов для подключения модуля LoRa-радио на чипе  SX1262 (модуль E22-900M22S).

2. Сделайте копию папки variants/esp32c3/diy/esp32c3_super_mini и всего содержимого, что в ней находится, в папку variants/esp32c3/diy/myvariant.

3. Отредактируйте файл myvariant/variant.h, где задаются номера портов ввода/вывода и другие опции. Для платы 260321mechtastic, в разделе настроек LoRa оставьте только определение USE_SX1262, остальные закомментируйте. Исправьте также назначение ножек портов, макросы LORA_xxx.

260321meshtastic common view

260321meshtastic SCH

260321meshtastic PCB

Для модуля ESP32-C3 Super Mini, модуля E22-900M22S на плате 260321mechtastic:

#ifndef _VARIANT_ESP32C3_SUPER_MINI_
#define _VARIANT_ESP32C3_SUPER_MINI_

/*----------------------------------------------------------------------------
* Headers
*----------------------------------------------------------------------------*/
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus

// I2C (Wire) & OLED
#define WIRE_INTERFACES_COUNT (1)
#define I2C_SDA (8)
#define I2C_SCL (0)

// OLED дисплей 0.96" 128x64, I2C, желто-голубой:
#define USE_SSD1306

// GPS
#undef GPS_RX_PIN
#undef GPS_TX_PIN
#define GPS_RX_PIN (20)
#define GPS_TX_PIN (21)

// Button
#define BUTTON_PIN (9) // BOOT button

// LoRa
//#define USE_LLCC68
#define USE_SX1262
// #define USE_RF95
//#define USE_SX1268

#define LORA_DIO0 RADIOLIB_NC
#define LORA_RESET (4)
#define LORA_DIO1 (3)
#define LORA_RXEN (7)
#define LORA_BUSY (5)
#define LORA_SCK (1)
#define LORA_MISO (2)
#define LORA_MOSI (10)
#define LORA_CS (6)

#define SX126X_CS LORA_CS
#define SX126X_DIO1 LORA_DIO1
#define SX126X_BUSY LORA_BUSY
#define SX126X_RESET LORA_RESET
#define SX126X_RXEN LORA_RXEN

// Напряжение для внешнего TCXO (32 МГц):
#define SX126X_DIO3_TCXO_VOLTAGE (1.8)
#define TCXO_OPTIONAL // чтобы прошивка пробовала и TCXO, и XTAL

#ifdef __cplusplus }
#endif

/*----------------------------------------------------------------------------
* Arduino objects - C++ only
*----------------------------------------------------------------------------*/
#endif

4. Установите правильные параметры мощности. Для модуля E22-900M22S важно указать его максимальную выходную мощность (22 дБм). Обычно это делается с помощью флагов сборки. Найдите их в том же файле variant.h, или добавьте в platformio.ini для вашего окружения следующие строки:

#define EBYTE_E22_900M22S   // Включает поддержку конкретного модуля
#define TX_GAIN_LORA 7 // Усиление встроенного усилителя E22

// --- Параметры вывода радиосигнала ---
// Максимальная выходная мощность модуля = +22 dBm:
#define SX126X_MAX_POWER 22
// Включает DIO2 для управления внешним RF-переключателем:
//#define SX126X_DIO2_AS_RF_SWITCH

// --- Ток и усиление (опционально, для точной настройки) ---
// Лимит тока в мА для достижения макс. мощности:
#define SX126X_CURRENT_LIMIT 140.0

5. Добавьте ваш новый вариант сборки myvariant к списку вариантов Meshtastic. Корневой файл firmware\platformio.ini подключает все .ini файлы из папки variants/*/*.ini, в том числе и ваш файл platformio.ini в папке myvariant.

extra_configs =
variants/*/*.ini
variants/*/*/platformio.ini
# Эта строчка подключит файл platformio.ini в вашей папке myvariant:
variants/*/diy/*/platformio.ini
src/graphics/niche/InkHUD/PlatformioConfig.ini

Откройте файл firmware/variants/esp32c3/diy/myvariant/platformio.ini и внесите в него следующие изменения (измененные значения выделены жирным шрифтом):

; ESP32 C3 Super Mini Development Board
; https://www.espboards.dev/esp32/esp32-c3-super-mini/
[env:myvariant]
extends = esp32c3_base
board = esp32c3_super_mini
build_flags = ${esp32c3_base.build_flags}
-D myvariant
-I variants/esp32c3/diy/myvariant
-D ARDUINO_USB_MODE=1
-D ARDUINO_USB_CDC_ON_BOOT=1
board_level = extra

[Этап 4: Сборка и заливка прошивки]

Теперь, когда конфигурация готова, можно приступить к компиляции. 

1. Перейдите в корневой каталог репозитория (в папку firmware):

cd ..\..\..

2. Запустите сборку. В корневой папке firmware загруженного репозитория выполните команду:

pio run -e myvariant

Первая сборка может занять 10-15 минут, так как PlatformIO загрузит все необходимые инструменты и библиотеки. В случае успеха вы увидите сообщение `SUCCESS`, а готовый файл прошивки (`.bin` или `.uf2`) будет находиться в папке .pio/build/myvariant/.

[Исправление ошибок компиляции, FAQ]

$ pio run -e myvariant
Traceback (most recent call last):
  File "/usr/bin/pio", line 33, in < module>
    sys.exit(load_entry_point('platformio==4.3.4', 'console_scripts', 'pio')())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/bin/pio", line 25, in importlib_load_entry_point
    return next(matches).load()
           ^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/importlib/metadata/__init__.py", line 205, in load
    module = import_module(match.group('module'))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/importlib/__init__.py", line 90, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "< frozen importlib._bootstrap>", line 1387, in _gcd_import
  File "< frozen importlib._bootstrap>", line 1360, in _find_and_load
  File "< frozen importlib._bootstrap>", line 1331, in _find_and_load_unlocked
  File "< frozen importlib._bootstrap>", line 935, in _load_unlocked
  File "< frozen importlib._bootstrap_external>", line 995, in exec_module
  File "< frozen importlib._bootstrap>", line 488, in _call_with_frames_removed
  File "/usr/lib/python3/dist-packages/platformio/__main__.py", line 66, in < module>
    @cli.resultcallback()
     ^^^^^^^^^^^^^^^^^^
AttributeError: 'PlatformioCLI' object has no attribute 'resultcallback'. Did you mean: 'result_callback'?

Способ 1: Обновить PlatformIO через pip (рекомендуется)

Так как PlatformIO был установлен через системный пакетный менеджер, его нужно обновить через pip:

# Сначала удалите старую версию из репозитория
sudo apt remove platformio

# Установите свежую версию через pip
pip install --upgrade platformio

Если pip не установлен:

sudo apt install python3-pip
pip install --upgrade platformio

После установки добавьте PlatformIO в PATH (если ещё не добавлен):

echo 'export PATH="$PATH:$HOME/.local/bin"' >> ~/.bashrc
source ~/.bashrc

Способ 2: Обновить через официальный установщик

# Удалите старую версию
sudo apt remove platformio

# Скачайте и запустите официальный установщик
wget https://raw.githubusercontent.com/platformio/platformio-core-installer \
 /master/get-platformio.py -O get-platformio.py
python3 get-platformio.py

# Добавьте в PATH
echo 'export PATH="$PATH:$HOME/.platformio/penv/bin"' >> ~/.bashrc
source ~/.bashrc

Способ 3: Использовать virtual environment (чистая установка)

sudo apt remove platformio

# Создайте виртуальное окружение
python3 -m venv pio-env
source pio-env/bin/activate

# Установите PlatformIO
pip install platformio

# Теперь pio доступен в этом окружении
pio --version

Проверка успешного обновления:

pio --version

Актуальная версия на момент 18 мая 2026 года — 6.1.16 (или новее). Убедитесь, что версия стала 5.2.1+.

После успешного обновления команда pio run -e myvariant должна работать корректно.

$ pio run -e myvariant
UnknownEnvNamesError: Unknown environment names 'myvariant'.
 Valid names are 'sugarcube, m5stack-stamp-c3, elecrow-adv-35-tft, icarus, muzi-base,
...
heltec-v4, seeed_xiao_nrf52840_kit_i2c, heltec-v4-tft, feather_rp2040_rfm95, betafpv_900_tx_nano'

Ошибка означает, что в вашем проекте нет среды (environment) с именем myvariant. Это имя вы выбрали сами, но его нужно предварительно определить в файле platformio.ini.

[Решение: создать свою среду в platformio.ini]

В корне вашего проекта Meshtastic найдите файл platformio.ini. В нём нужно добавить секцию для вашей пользовательской конфигурации.

Вариант 1: создать новую среду на основе существующей

Скорее всего, для вашего модуля E22-900M22S лучше всего подходит среда `tlora-v2-1-1_6` или `tbeam`. Добавьте в конец файла platformio.ini:

[env:myvariant]
extends = env:tlora-v2-1-1_6
board = ttgo-lora32-v21new
build_flags =
${env:tlora-v2-1-1_6.build_flags}
-I variants/myvariant
; Если нужно переопределить variant.h
;board_build.variant = variants/myvariant

Вариант 2: создать полностью свою конфигурацию для E22-900M22S

[env:myvariant]
platform = espressif32
board = ttgo-lora32-v21new
framework = arduino
build_flags =
-D E22_900M22S
-D USE_SX1262
-D SX126X_MAX_POWER=22
-D SX126X_DIO3_TCXO_VOLTAGE=1.8
-D SX126X_DIO2_AS_RF_SWITCH
-I variants/myvariant

; SPI пины для E22 (настройте под ваш контроллер)
build_unflags =
${env:ttgo-lora32-v21new.build_unflags}

lib_deps =
${env:ttgo-lora32-v21new.lib_deps}

Вариант 3: скопировать и переименовать существующую среду

Посмотрите список доступных сред — например, `tbeam` или `heltec-v3` — и используйте одну из них напрямую:

# Вместо myvariant используйте существующее имя
pio run -e tbeam

# или
pio run -e heltec-v3

# или
pio run -e tlora-v2-1-1_6

Создание директории для variant.h. Если вы создали свою среду myvariant, вам также нужно создать директорию для вашего файла variant.h:

# Создайте папку для вашего варианта
mkdir -p variants/myvariant

# Скопируйте туда файл variant.h (можете взять за основу существующий)
cp variants/tbeam/variant.h variants/myvariant/
# или создайте свой
nano variants/myvariant/variant.h

[Быстрое решение (если хотите просто собрать)]

Если вы не хотите возиться с созданием своей конфигурации, просто используйте существующую среду, которая наиболее близка к вашему железу. Для E22-900M22S попробуйте:

pio run -e tbeam

или:

pio run -e tlora-v2-1-1_6

Эти среды уже имеют правильные настройки для чипа SX1262 и должны работать с вашим модулем. После успешной сборки вы получите прошивку в папке .pio/build/ с именем выбранной среды.

$ pio run -e myvariant
Processing myvariant (board: esp32c3_super_mini; platform: 
https://github.com/pioarduino/platform-espressif32/releases/download/55.03.38-1
 /platform-espressif32.zip; framework: arduino)
-------------------------------------------------------------------------------
Platform Manager: Installing https://github.com/pioarduino/platform-espressif32
 /releases/download/55.03.38-1/platform-espressif32.zip
Downloading  [####################################]  100%
Unpacking  [####################################]  100%
Platform Manager: espressif32@55.3.38 has been installed!
UnknownBoard: Unknown board ID 'esp32c3_super_mini'

Ошибка `Unknown board ID 'esp32c3_super_mini'` возникает, потому что PlatformIO не может найти стандартное определение платы с таким ID в вашей текущей конфигурации. Это похоже на то, как если бы вы попросили кого-то найти книгу, которой нет в библиотеке. В вашем файле platformio.ini указана неизвестная платформа.

Вот как это можно исправить:

1. Проверьте, существует ли такая плата в PlatformIO. Сначала убедитесь, что плата с ID `esp32c3_super_mini` вообще известна PlatformIO. Выполните в терминале команду:

pio boards

Она выведет огромный список всех поддерживаемых плат. Поищите в нём `esp32c3_super_mini`. Если не найдете, значит, её действительно нет. В моем случае был похожий вариант платы:

pio boards | grep esp32c3_super_mini
nologo_esp32c3_super_mini  ESP32C3  160MHz  4MB  320KB  Nologo ESP32C3 SuperMini
nologo_esp32c3_super_mini  ESP32C3  160MHz  4MB  320KB  Nologo ESP32C3 SuperMini

Поэтому было достаточно заменить esp32c3_super_mini на nologo_esp32c3_super_mini в моем файле variants/esp32c3/diy/esp32c3_super_mini/platformio.ini:

; ESP32 C3 Super Mini Development Board
; https://www.espboards.dev/esp32/esp32-c3-super-mini/
[env:myvariant]
extends = esp32c3_base
board = nologo_esp32c3_super_mini
build_flags = ${esp32c3_base.build_flags}
-D myvariant
-I variants/esp32c3/diy/myvariant
-D ARDUINO_USB_MODE=1
-D ARDUINO_USB_CDC_ON_BOOT=1
board_level = extra

2. Используйте официальную плату (рекомендуемый способ). Самый надежный путь — выбрать существующую плату, наиболее близкую по характеристикам к вашему устройству.

Вариант А: `tbeam` — так как вы работаете с LoRa и, вероятно, на базе ESP32, одной из самых популярных плат является `tbeam`. Просто замените `board = esp32c3_super_mini` на `board = tbeam`.

Вариант Б: `ttgo-lora32-v21new` — еще один распространенный вариант для LoRa-проектов.

Как узнать ID: вы можете найти ID нужной платы с помощью команды `pio boards | grep -i "ваше_ключевое_слово"`, например, `pio boards | grep -i "lora"`.

Ваш platformio.ini после правки будет выглядеть так:

[env:myvariant]
platform = espressif32 ; явно укажите платформу
board = tbeam ; замените на существующий ID платы
framework = arduino

3. Создайте свою собственную плату (продвинутый способ). Если вы точно знаете, что ваша плата уникальна и её нет в списке, вы можете определить её сами. Для этого:

(a) Создайте JSON-файл с описанием платы. Создайте файл, например, my_custom_board.json, и поместите его в папку вашего проекта: < ваш_проект>/boards/. Если папки boards нет, создайте её.

(b) Заполните JSON-файл. Минимально жизнеспособный пример для ESP32-платы (исправьте значения под ваше железо):

    {
"build": {
"arduino": {
"ldscript": "esp32_out.ld"
},
"core": "esp32",
"extra_flags": "-DARDUINO_ESP32_DEV",
"f_cpu": "240000000L",
"mcu": "esp32"
},
"frameworks": ["arduino", "espidf"],
"name": "My Custom MechTastic Board",
"upload": {
"maximum_ram_size": 327680,
"maximum_size": 1310720,
"require_upload_port": true,
"speed": 921600
},
"url": "http://example.com",
"vendor": "MechTastic"
}

(c) Используйте его в platformio.ini. Теперь вы можете обратиться к нему по имени файла (без расширения `.json`):

[env:myvariant]
platform = espressif32
board = my_custom_board
framework = arduino

Compiling .pio/build/myvariant/src/detect/ScanI2C.cpp.o
In file included from src/graphics/Screen.h:78,
                 from src/main.h:8,
                 from src/Power.cpp:23:
.pio/libdeps/myvariant/ESP8266 and ESP32 OLED driver for SSD1306 displays/src/SSD1306Wire.h:
 In constructor 'SSD1306Wire::SSD1306Wire(uint8_t, int, int, OLEDDISPLAY_GEOMETRY, HW_I2C, int)':
.pio/libdeps/myvariant/ESP8266 and ESP32 OLED driver for SSD1306 displays/src/SSD1306Wire.h:87:51:
 error: 'Wire1' was not declared in this scope; did you mean 'Wire'?
   87 |       this->_wire = (_i2cBus==I2C_ONE) ? &Wire : &Wire1;
      |                                                   ^~~~~
      |                                                   Wire
In file included from src/graphics/Screen.h:78,
                 from src/PowerFSM.cpp:16:
.pio/libdeps/myvariant/ESP8266 and ESP32 OLED driver for SSD1306 displays/src/SSD1306Wire.h:
 In constructor 'SSD1306Wire::SSD1306Wire(uint8_t, int, int, OLEDDISPLAY_GEOMETRY, HW_I2C, int)':
.pio/libdeps/myvariant/ESP8266 and ESP32 OLED driver for SSD1306 displays/src/SSD1306Wire.h:87:51:
 error: 'Wire1' was not declared in this scope; did you mean 'Wire'?

Проблема в том, что библиотека дисплея пытается использовать `Wire1`, которого нет на вашем ESP32-C3.

[Быстрое решение]

Отредактируйте файл библиотеки, который вызывает ошибку: .pio/libdeps/myvariant/ESP8266\ and\ ESP32\ OLED\ driver\ for\ SSD1306\ displays/src/SSD1306Wire.h. Этот способ самый простой, однако у него есть недостаток: при полной перекомпиляции с нуля содержимое ваших исправлений потеряется, и их придется вносить заново.

Найдите строку 87 (примерно):

this->_wire = (_i2cBus==I2C_ONE) ? &Wire : &Wire1;

Замените её на:

#ifdef Wire1
this->_wire = (_i2cBus==I2C_ONE) ? &Wire : &Wire1;
#else
this->_wire = &Wire;
#endif

[Наложение патча PlatformIO (правильный путь)]

Чтобы изменения не сбросились при обновлении библиотеки, создайте патч. В корне проекта создайте файл ~/firmware/patches/ssd1306_wire1_fix.patch:

--- a/src/SSD1306Wire.h
+++ b/src/SSD1306Wire.h
@@ -80,12 +80,17 @@ this->_sda = _sda; this->_scl = _scl; #if !defined(ARDUINO_ARCH_ESP32) this->_wire = &Wire; #elif defined(CONFIG_IDF_TARGET_ESP32C6) this->_wire = &Wire; #else
- this->_wire = (_i2cBus==I2C_ONE) ? &Wire : &Wire1;
+#ifdef Wire1
+ this->_wire = (_i2cBus==I2C_ONE) ? &Wire : &Wire1;
+#else
+ this->_wire = &Wire;
+#endif #endif this->_frequency = _frequency; }

Создайте файл ~/firmware/extra_scripts/pre_fix_wire1.py:

import os
import subprocess

print("Исправление Wire1 для ESP32-C3...")
project_dir = os.getcwd() env_name = os.environ.get('PIOENV', 'myvariant') wire_h = os.path.join(project_dir, ".pio", "libdeps", env_name, "ESP8266 and ESP32 OLED driver for SSD1306 displays/src/SSD1306Wire.h")

if not os.path.exists(wire_h): print(f"❌ Файл не найден: {wire_h}") exit(0)

# Читаем файл
with open(wire_h, 'r') as f: content = f.read()

# Проверяем, нужно ли исправлять
if '#ifdef Wire1' in content: print("✅ Исправление уже применено") exit(0)

# Заменяем строку old_line = ' this->_wire = (_i2cBus==I2C_ONE) ? &Wire : &Wire1;' new_lines = '''#ifdef Wire1 this->_wire = (_i2cBus==I2C_ONE) ? &Wire : &Wire1;
#else
this->_wire = &Wire;
#endif'''

if old_line in content: content = content.replace(old_line, new_lines) with open(wire_h, 'w') as f: f.write(content) print("✅ Файл успешно исправлен")
else: print("❌ Строка не найдена")

Затем в ~/firmware/variants/esp32c3/diy/myvariant/platformio.ini варианта добавьте:

[env:myvariant]
; ... остальные настройки ...
extra_scripts = pre:extra_scripts/pre_fix_wire1.py

Перекомпилируйте начисто:

cd firmware
rm -rf ./pio
pio run -e myvariant -j $(nproc)

[Ещё проще: отключить дисплей (временное решение)]

Если дисплей вам не критичен для текущей сборки, просто отключите его в variant.h:

// В вашем variants/myvariant/variant.h
#define HAS_SCREEN 0

И добавьте в platformio.ini:

build_flags =
-DHAS_SCREEN=0

После исправления очистите кеш и пересоберите:

rm -rf .pio/build/myvariant
pio run -e myvariant -j $(nproc)

Ошибка должна исчезнуть. Это классическая проблема для ESP32-C3, где `Wire1` физически отсутствует.

Медленная компиляция Meshtastic — действительно распространённая проблема, особенно если это ваша первая сборка. Самое важное, что нужно знать: это нормально, что она идёт долго. Вся сложность в том, что PlatformIO (инструмент сборки) изначально не очень быстр, а Meshtastic — проект огромный и поддерживает кучу разных плат.

Вот что вы можете сделать, чтобы ускорить процесс.

[3 самых эффективных способа ускорить сборку]

Это лучшие методы, которые реально сократят ваше время ожидания.

1. Включить `ccache` (обязательно к применению). Это система кэширования компиляции, которая запоминает результат сборки каждого файла. Если вы перекомпилируете проект снова (или переключитесь между похожими платами), `ccache` просто подставит готовый результат, экономя огромное количество времени.

Чтобы его включить, добавьте в ваш файл platformio.ini варианта эту строчку:

build_cache_dir = .pio/build_cache

Как это поможет: вторая и последующие сборки станут заметно быстрее.

2. Использовать флаг `-j` для параллельной сборки. Этот флаг указывает PlatformIO задействовать все ядра вашего процессора для компиляции. По умолчанию он может работать медленнее.

Выполняйте сборку так:

pio run -e myvariant -j $(nproc)

Как это помогает: сборка становится намного быстрее за счёт параллельной работы. Без этого флага процессор используется не полностью.

3. Собирать только одну конкретную плату. В PlatformIO можно определить множество сред (`[env:...]`). Если запустить сборку без указания среды, он начнёт компилировать всё подряд, что может занять десятки минут даже на современной рабочей станции.

Всегда явно указывайте вашу среду:

pio run -e myvariant

Как это помогает: вы компилируете ровно то, что вам нужно, избегая лишней работы.

[Почему сборка всё ещё может быть медленной]

Даже с этими настройками процесс может идти не мгновенно. Вот несколько причин, с которыми сталкиваются разработчики:

1. "Холостая" сборка всё равно требует времени: даже если вы ничего не меняли в коде, PlatformIO может тратить 30–40 секунд просто на проверку зависимостей и запуск инструментов. Это особенность его внутренней системы SCons.

2. Размер проекта: Meshtastic — это не просто "мигание светодиодом". Это сложная прошивка с поддержкой mesh-сетей, GPS, дисплеев, Bluetooth и многого другого. Большой код требует времени на компиляцию.

3. Антивирус: в некоторых случаях антивирусное ПО в реальном времени может замедлять сборку, проверяя каждый создаваемый файл.

[Краткая инструкция для ускорения]

1. Добавьте `build_cache_dir = .pio/build_cache` в ваш platformio.ini.

2. Всегда используйте `-j` флаг:

pio run -e myvariant -j $(nproc)

3. Для первой сборки запаситесь терпением. Следующие будут быстрее.

В PlatformIO есть несколько способов очистки проекта. Основная команда — pio run -t clean, но в зависимости от ситуации могут потребоваться разные уровни очистки.

[Уровни очистки]

1. Стандартная очистка (clean)

Удаляет только временные объектные файлы для текущей среды сборки, оставляя библиотеки и кеш нетронутыми.

pio run -t clean

Для конкретной среды:

pio run -e myvariant -t clean

Когда использовать: обычные ошибки компиляции, проблемы с инкрементальной сборкой.

2. Полная очистка (prune)

Удаляет всё неиспользуемое кешированное содержимое (неиспользуемые пакеты, библиотеки, кеш платформ).

pio system prune

Показать, что будет удалено, без реального удаления:

pio system prune --dry-run

Пропустить подтверждение:

pio system prune --force

Когда использовать: нехватка места на диске, подозрение на повреждение глобального кеша PlatformIO.

3. Ручная полная очистка

Удаление всех скомпилированных данных проекта и кешированных зависимостей. Самый радикальный метод.

Для текущего проекта:

rm -rf .pio

Полный сброс PlatformIO (все проекты):

rm -rf ~/.platformio

Переустановка пакетов при следующей сборке:

pio run

Когда использовать: переключение между средами вызывает ошибки "No such file or directory", необъяснимые конфликты библиотек, полный сбой после неудачного обновления.

[Какой метод выбрать для вашей ситуации]

Ситуация Рекомендуемая команда
Обычная ошибка компиляции pio run -t clean
Ошибка после смены variant.h rm -rf .pio + пересборка
Смена среды сборки вызывает ошибки библиотек rm -rf .pio/libdeps/[env_name]
или
rm -rf .pio
Нехватка места на диске pio system prune
Полный сбой PlatformIO rm -rf ~/.platformio

Совет: для ситуации сборки Meshtastic с пользовательским variant.h после возникновения ошибок с I2C и Wire1 или подобными рекомендуется выполнить полную очистку проекта, так как изменения в конфигурации затронули несколько файлов:

rm -rf .pio
pio run -e myvariant

Это гарантирует, что все объектные файлы будут перекомпилированы заново с вашими обновлёнными настройками.

In file included from src/mesh/MemoryPool.h:9,
                 from src/mesh/MeshRadio.h:3,
                 from src/mesh/Default.h:2,
                 from src/SerialConsole.cpp:2:
src/configuration.h:68:2: error: #error APP_VERSION must be set by the build environment
   68 | #error APP_VERSION must be set by the build environment
      |  ^~~~~

Добавьте в файл variants/esp32c3/diy/myvariant/platformio.ini:

[env:myvariant]
...
build_flags =
...
-D APP_VERSION=\"2.5.0.myvariant\" # Временное значение
-D HW_VERSION=\"1.0\"

src/main.cpp:174:52: error: 'USERPREFS_TZ_STRING' was not declared in this scope
  174 | volatile static const char slipstreamTZString[] = {USERPREFS_TZ_STRING};
      |                                                    ^~~~~~~~~~~~~~~~~~~

Добавьте в файл variants/esp32c3/diy/myvariant/platformio.ini:

[env:myvariant]
build_flags =
...
-D USERPREFS_TZ_STRING=\"MSK-3\"

src/modules/ExternalNotificationModule.cpp: In constructor 'ExternalNotificationModule::ExternalNotificationModule()':
src/modules/ExternalNotificationModule.cpp:314:43: error: 'USERPREFS_RINGTONE_RTTTL' was not declared in this scope
  314 |             strncpy(rtttlConfig.ringtone, USERPREFS_RINGTONE_RTTTL, sizeof(rtttlConfig.ringtone));
      |                                           ^~~~~~~~~~~~~~~~~~~~~~~~

Добавьте в файл variants/esp32c3/diy/myvariant/platformio.ini:

[env:myvariant]
extends = esp32c3_base
board = nologo_esp32c3_super_mini
build_flags =
${esp32c3_base.build_flags}
-D myvariant
-I variants/esp32c3/diy/myvariant
-D ARDUINO_USB_MODE=1
-D ARDUINO_USB_CDC_ON_BOOT=1
-D USERPREFS_TZ_STRING=\"MSK-3\"
-D USERPREFS_RINGTONE_RTTTL=\"\" # Добавьте эту строку
board_level = extra
extra_scripts = pre:extra_scripts/pre_fix_wire1.py

После успешной сборки файл с прошивкой, готовый для загрузки на устройство, находится в папке вашего проекта по следующему пути:

путь_к_вашему_проекту/firmware/.pio/build/myvariant/firmware.bin

Итоговый файл называется firmware.bin. Все промежуточные объектные файлы и результаты компиляции отдельных модулей также находятся в этой директории .pio/build/myvariant/.

[Как это работает]

myvariant: это название конкретной конфигурации сборки (окружения), которое вы указали в файле platformio.ini через флаг `-e myvariant`. Если бы вы собирали другую конфигурацию, например, `pio run -e tbeam`, папка с результатом называлась бы tbeam.

firmware.bin: самый главный файл — это и есть ваша готовая прошивка, которую можно записывать на устройство.

Другие файлы: рядом с ним вы можете найти и другие артефакты сборки, например, firmware.elf (отладочный файл с дополнительной информацией) или partitions.bin (файл с таблицей разделов памяти), но для прошивки обычно нужен только `.bin`.

Если вы захотите изменить стандартное расположение этой папки (например, чтобы не засорять проект), это можно сделать, добавив в ваш platformio.ini в секцию `[platformio]` директиву `build_dir`.

Пример лога:

..
Linking .pio/build/myvariant/firmware.elf
Memory Type Usage Summary:
+----------------------+--------------+----------+----------------+---------------+
| Memory Type/Section  | Used [bytes] | Used [%] | Remain [bytes] | Total [bytes] |
+----------------------+--------------+----------+----------------+---------------+
| Flash Code           | 127478       |          |                |               |
|    .text             | 127478       |          |                |               |
| DRAM                 | 45996        | 14.32    |         275300 |        321296 |
|    .text             | 36344        | 11.31    |                |               |
|    .bss              | 5648         | 1.76     |                |               |
|    .data             | 4004         | 1.25     |                |               |
| Flash Data           | 39456        |          |                |               |
|    .rodata           | 39200        |          |                |               |
|    .appdesc          | 256          |          |                |               |
| RTC SLOW             | 72           | 0.88     |           8120 |          8192 |
|    .rtc_reserved     | 40           | 0.49     |                |               |
|    .force_slow       | 32           | 0.39     |                |               | 
+----------------------+--------------+----------+----------------+---------------+
Total image size: 207314 bytes (.bin may be padded larger)
Note: The reported total sizes may be smaller than those in the technical reference manual
due to reserved memory and application configuration. The total flash size available for the
application is not included by default, as it cannot be reliably determined due to the presence
of other data like the bootloader, partition table, and application partition size. Retrieving
maximum program size .pio/build/myvariant/firmware.elf
Checking size .pio/build/myvariant/firmware.elf Advanced Memory Usage is available via
 "PlatformIO Home > Project Inspect"
RAM: [ ] 2.9% (used 9652 bytes from 327680 bytes)
Flash: [= ] 8.5% (used 207026 bytes from 2424832 bytes)
*** Copied compiled esp32c3 IDF libraries to Arduino framework ***
*** Starting Arduino compile myvariant with custom libraries ***
Processing myvariant (board: nologo_esp32c3_super_mini;
platform: https://github.com/pioarduino/platform-espressif32/releases/download/55.03.38-1/
 platform-espressif32.zip; framework: arduino)
--------------------------------------------------------------------------------
Tool Manager: Installing https://github.com/pioarduino/scons/releases/download/4.8.1/
scons-local-4.8.1.tar.gz
Downloading 0% 10% 20% 30% 40%
Unpacking 0% 10% 20% 30% 40% 50% 60% 70% 80% 90% 100%
Tool Manager: tool-scons@4.40801.0 has been installed!
Verbose mode can be enabled via `-v, --verbose` option Исправление Wire1 для ESP32-C3...
Исправление уже применено
========================= [SUCCESS] Took 7.99 seconds =========================
Environment Status Duration myvariant SUCCESS 00:00:07.987
========================= 1 succeeded in 00:00:07.987 =========================
*** Original Arduino "idf_component.yml" restored
*** Building .pio/build/myvariant/firmware.bin esptool v5.2.0
Usage: esptool elf2image [OPTIONS] FILENAME Try 'esptool elf2image -h' for help
 ╭─ Error ─────────────────────────────────────────────────────────────────────────────────╮
 │ Invalid value for 'FILENAME': Path '.pio/build/myvariant/firmware.elf' does not exist. │
 ╰─────────────────────────────────────────────────────────────────────────────────────────╯
 *** [.pio/build/myvariant/firmware.bin] Error 2
 ================================ [FAILED] Took 509.68 seconds ============================
 Environment Status Duration myvariant FAILED 00:08:29.682
 ================================ 1 failed, 0 succeeded in 00:08:29.682 ===================

Сделайте полную очистку и выполните сборку заново:

rm -rf .pio
pio run -e myvariant -j $(nproc)

Прошить ESP32-C3 можно напрямую из PlatformIO — это самый удобный способ, так как вы уже используете эту среду для сборки. Вот как это сделать правильно для вашей платы Nologo ESP32-C3 SuperMini.

[Прошивка через PlatformIO (рекомендуемый способ)]

PlatformIO может автоматически найти порт и прошить устройство. Просто выполните команду:

pio run -e myvariant -t upload

Если нужно указать порт вручную (например, когда подключено несколько устройств), добавьте параметр `--upload-port`:

pio run -e myvariant -t upload --upload-port /dev/ttyUSB0

PlatformIO автоматически переведёт плату в режим загрузки, прошьёт `firmware.bin` и перезапустит устройство.

[Ручная прошивка через esptool.py]

Если вы хотите прошить плату вручную или у вас нет PlatformIO, используйте официальный инструмент esptool.py.

1. Установите esptool.py (если ещё не установлен):

pip install esptool

2. Сотрите старую прошивку (рекомендуется):

esptool.py --chip esp32c3 --port /dev/ttyUSB0 erase_flash

3. Запишите новую прошивку:

esptool.py --chip esp32c3 --port /dev/ttyUSB0 --baud 460800 write_flash \
  --flash_mode dio --flash_size 4MB --flash_freq 80m \
  0x0 .pio/build/myvariant/bootloader.bin \
  0x8000 .pio/build/myvariant/partitions.bin \
  0x10000 .pio/build/myvariant/firmware.bin

[Настройка PlatformIO для стабильной работы]

Добавьте в ваш platformio.ini параметры для порта и монитора:

[env:myvariant]
; ... остальные настройки ...
upload_port = /dev/ttyUSB0
monitor_port = ${this.upload_port}
monitor_speed = 115200

Если вы не знаете, какой порт используется в Linux, выполните команду ls /dev/tty* до и после подключения платы — новый появившийся порт и будет вашим.

[Особенности ESP32-C3 SuperMini]

Платы Nologo ESP32-C3 SuperMini имеют несколько особенностей:

1. USB CDC включён: в вашей конфигурации уже есть -DARDUINO_USB_CDC_ON_BOOT=1, что правильно для этой платы. Таким образом, через этот виртуальный последовательный порт осуществляется вывод отладочных сообщений, перепрошивка Meshtastic и управление его настройками (с помощью утилит Python CLI [2] и Web UI [3]).

2. Ручной вход в режим загрузки: на некоторых платах C3 может потребоваться нажать и удерживать кнопку BOOT, затем кратковременно нажать RESET (или RST, EN), после чего отпустить BOOT. Только после этого плата войдёт в режим загрузки. Иногда помогает нажатие BOOT в момент начала прошивки.

3. Сброс после прошивки: некоторые платы C3 не перезагружаются автоматически после прошивки. Если программа не запускается, нажмите кнопку RESET вручную или отключите/подключите плату по USB.

[Проверка работы]

После прошивки откройте монитор порта:

pio run -e myvariant -t monitor

Если вы видите лог Meshtastic с инициализацией модулей — плата успешно прошита и работает.

Если возникли проблемы, проверьте драйверы USB и права доступа к порту в Linux (можно добавить пользователя в группу `dialout`).

Узнать список соседних узлов в сети Meshtastic можно, но для этого необходимо сначала включить специальный модуль Neighbor Info, так как по умолчанию эта функция отключена.

[Что такое модуль Neighbor Info]

Это встроенная, но опциональная функция прошивки Meshtastic. Когда она включена, ваш узел будет периодически отправлять в mesh-сеть список своих прямых соседей (0-hop neighbors) и качество связи с ними (SNR). Это позволяет всем участникам сети (или узлам, подключенным к MQTT) построить карту связей.

Важно: эта информация носит исключительно информационный характер и не влияет на маршрутизацию пакетов в сети.

[Как включить и настроить модуль]

Управление модулем осуществляется через Python CLI [2]. Все примеры команд подходят для версий firmware 2.2.0 и выше.

1. Включить модуль:

meshtastic --set neighbor_info.enabled true

2. Настроить интервал отправки (опционально): интервал по умолчанию — 6 часов (21600 секунд) и не может быть меньше 4 часов (14400 секунд). Чтобы установить интервал, например, в 5 часов:

meshtastic --set neighbor_info.update_interval 18000

3. Разрешить отправку по LoRa (опционально): по умолчанию информация о соседях отправляется только через MQTT и в подключенное приложение. Чтобы отправлять её также по LoRa, используйте эту команду. Функция доступна с версии firmware 2.5.13:

meshtastic --set neighbor_info.transmit_over_lora true

4. Проверить текущую конфигурацию модуля:

meshtastic --get neighbor_info

[Где смотреть список соседей]

После включения модуля данные о соседях будут отправляться, но, по состоянию на октябрь 2023 года, не существовало стандартных клиентов для их визуализации. Вы можете использовать следующие подходы:

MQTT: если ваша сеть имеет MQTT-шлюз, данные о соседях будут накапливаться на MQTT-сервере. Их можно собирать и обрабатывать для построения графа сети.

Traceroute: альтернативный способ увидеть сетевой путь. Вы можете отправить traceroute до конкретного узла, чтобы увидеть последовательность узлов на пути к нему. В некоторых клиентах, например, в Meshtastic.Cli, для этого есть специальная команда `trace-route`.

[Настройка в приложениях]

Python CLI [2]: кроссплатформенная консольная утилита. В ней доступен самый полный функционал по управлению устройством Meshtastic.

Android: все настройки модуля Neighbor Info доступны в приложении версии 2.2.0 и выше. Путь к настройкам: вертикальное меню (три точки) > Radio Configuration > Neighbor Info.

Apple (iOS): на момент написания официальной документации функция еще не была реализована.

Web UI [3]: все настройки модуля доступны в веб-интерфейсе.

Стоит отметить, что модуль Neighbor Info может обнаруживать соседей даже на узлах, где он не включен (начиная с версии firmware 2.3.2), но для полной и регулярной картины сети его лучше активировать на всех возможных узлах.

Приложение Meshtastic для Android в Google Play установить не получается, оно "Недоступно в вашей стране". Даже VPN не помогает. Как быть?

Хорошая новость в том, что у Meshtastic есть несколько официальных и безопасных способов установки помимо Google Play.

Вот три надежных метода, которые помогут вам установить приложение:

Самый безопасный и рекомендуемый способ — F-Droid

F-Droid — это официальный магазин приложений с открытым исходным кодом. Meshtastic рекомендует его как основной способ установки .

1.  Скачайте и установите приложение F-Droid с официального сайта: f-droid.org.
2.  Откройте F-Droid. Возможно, потребуется разрешить установку из неизвестных источников (телефон сам подскажет, как это сделать).
3.  Найдите в поиске приложение Meshtastic.
4.  Установите его.

Самый быстрый и прямой способ — установка APK (с ручным обновлением)

Этот метод подходит, если вы не хотите устанавливать лишние магазины приложений. Вы просто скачиваете установочный файл.

1.  Перейдите на официальную страницу Releases (Релизы) проекта на GitHub: github.com/meshtastic/Meshtastic-Android/releases.
2.  Найдите самый последний файл с расширением `.apk` (например, `meshtastic_x.x.x.apk`). Скачайте его на телефон.
3.  Нажмите на скачанный файл. Телефон попросит разрешить установку из источника (браузера или менеджера файлов), согласитесь.
4.  Установка завершена.

Важно: приложения, установленные вручную, не получают автоматических обновлений. Вам придется повторять эти шаги, чтобы обновить приложение вручную.

Резервный способ — проверенные зеркала APK

Если GitHub работает медленно, можно воспользоваться крупными и надежными зеркалами.

APKMirror: зайдите на сайт `apkmirror.com`, найдите "Meshtastic" и скачайте последнюю версию. Этот сайт проверяет подписи приложений, что делает его более безопасным, чем случайные сайты.

[Краткая инструкция для новичка]

Если вы не очень знакомы GitHub, просто следуйте этому плану:

1.  Самый правильный путь: установите магазин F-Droid, а из него — Meshtastic. Так приложение будет обновляться само.
2.  Самый быстрый путь: скачайте последний файл `.apk` из официального репозитория Meshtastic на GitHub и откройте его на телефоне.

Все эти методы абсолютно легальны и безопасны, так как Meshtastic — это проект с открытым исходным кодом.

[Ссылки]

1. Meshtastic: компиляция прошивки.
2. Meshtastic Python CLI Guide.
3. Meshtastic Web Client Overview.