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`.

Прошить 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), но для полной и регулярной картины сети его лучше активировать на всех возможных узлах.

[Ссылки]

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