← Компиляция | Содержание | Далее: Режимы роутера →
3. Структура приложения
3.1 Обзор модулей
ACRouter построен на модульной архитектуре с чёткой иерархией компонентов.
Архитектура компонентов
┌─────────────────────────────────────────────────────────────┐
│ main.cpp │
│ (Application Entry) │
└────────────┬────────────────────────────────────────────────┘
│
├─────────────────────────────────────────────────┐
│ │
┌───────▼──────┐ ┌─────────▼─────────┐
│ acrouter │ │ comm │
│ _hal │◄───────────────────────────────│ (Communication) │
│ (Hardware) │ └─────────┬─────────┘
└───────┬──────┘ │
│ │
│ ┌──────────────────┐ │
├──► RouterController│ │
│ └──────────────────┘ │
│ │
│ ┌──────────────────┐ │
├──► DimmerHAL │ │
│ └──────────────────┘ │
│ │
│ ┌──────────────────┐ │
└──► PowerMeterADC │ │
└──────────────────┘ │
│
┌──────────────────┐ ┌────────▼────────┐
│ utils │◄────────────────────────────│ WiFiManager │
│ (Utilities) │ ├─────────────────┤
└───────┬──────────┘ │ WebServerManager│
│ ├─────────────────┤
├──► ConfigManager │ NTPManager │
│ ├─────────────────┤
├──► HardwareConfigManager │ OTAManager │
│ └─────────────────┘
└──► SerialCommand
┌──────────────────┐
│ rbdimmer │
│ (External lib) │
└──────────────────┘
┌──────────────────┐
│ sensors │
│ (Sensor Types) │
└──────────────────┘
3.2 Модуль acrouter_hal (Hardware Abstraction Layer)
Путь: components/acrouter_hal/
Назначение: Уровень аппаратной абстракции для работы с датчиками, диммером и алгоритмами управления.
Компоненты
3.2.1 RouterController
Файлы:
Описание:
Основной контроллер солнечного роутера. Реализует алгоритмы управления для всех 6 режимов работы (OFF, AUTO, ECO, OFFGRID, MANUAL, BOOST).
Функции:
- Пропорциональный регулятор для балансировки P_grid → 0
- Управление диммером в зависимости от режима
- Архитектура на основе колбэков (вызывается каждые 200 мс из PowerMeterADC)
- Ограничение уровня диммера (0–100%)
- Определение состояния (IDLE, INCREASING, DECREASING, AT_MAXIMUM, AT_MINIMUM)
Основные параметры:
namespace RouterConfig {
constexpr float DEFAULT_CONTROL_GAIN = 200.0f; // Kp coefficient
constexpr float DEFAULT_BALANCE_THRESHOLD = 10.0f; // Balance threshold (W)
constexpr uint8_t MIN_DIMMER_PERCENT = 0;
constexpr uint8_t MAX_DIMMER_PERCENT = 100;
constexpr uint32_t UPDATE_INTERVAL_MS = 200; // Update frequency
}
Режимы работы:
enum class RouterMode : uint8_t {
OFF = 0, // Dimmer disabled
AUTO, // Solar Router (P_grid → 0)
ECO, // Export prevention
OFFGRID, // Off-grid mode
MANUAL, // Fixed level
BOOST // Forced 100%
};
Публичные методы:
// Initialization
bool begin(DimmerHAL* dimmer);
// Mode control
void setMode(RouterMode mode);
RouterMode getMode() const;
// Control parameters
void setControlGain(float gain); // Set Kp
void setBalanceThreshold(float threshold); // Set balance threshold
void setManualLevel(uint8_t percent); // For MANUAL mode
// Main loop (called from PowerMeterADC callback)
void updateControl(const PowerData& data);
// Emergency stop
void emergencyStop();
// Status information
RouterStatus getStatus() const;
3.2.2 PowerMeterADC
Файлы:
Описание:
Высокопроизводительный измеритель мощности на базе ADC с DMA в режиме непрерывного чтения.
Архитектура:
ADC DMA (80 kHz) → ISR callback (10 ms) → Processing Task → RMS calc (200 ms) → User Callback
Характеристики:
- Частота дискретизации: 10 кГц на канал (80 кГц суммарно для 8 каналов)
- Период RMS: 200 мс (10 периодов AC при 50 Гц)
- Разрядность: 12-битный ADC (0–4095)
- Диапазон: 0–3.3 В (ADC_ATTEN_DB_12)
- Каналы: До 4 каналов (напряжение + 3× ток)
Конфигурация DMA:
namespace PowerMeterConfig {
constexpr uint32_t SAMPLING_FREQ_HZ = 20000; // 20 kHz on ADC1, 5 kHz per channel for 4 channels
constexpr uint8_t MAX_CHANNELS = 4;
constexpr uint32_t FRAME_TIME_MS = 10; // DMA callback every 10 ms
constexpr uint32_t SAMPLES_PER_FRAME = 200; // 200 samples/channel/frame
constexpr uint16_t RMS_FRAMES_COUNT = 20; // 20 frames = 200 ms
constexpr uint32_t RMS_UPDATE_INTERVAL_MS = 200; // RMS update
}
Поддерживаемые датчики:
enum class SensorType : uint8_t {
NONE = 0, // Channel not used
VOLTAGE_AC, // ZMPT107 (voltage)
CURRENT_LOAD, // ACS-712 (load current, dimmer current sensor)
CURRENT_GRID, // SCT-013 (grid current)
CURRENT_SOLAR, // SCT-013 (solar panel current)
CURRENT_AUX1, // Additional channel 1
CURRENT_AUX2 // Additional channel 2
};
Публичные методы:
// Initialization
bool begin();
void setCallback(std::function callback);
// Control
bool start();
void stop();
bool isRunning() const;
// Calibration
void setVoltageCalibration(float multiplier, float offset = 0.0f);
void setCurrentCalibration(uint8_t channel, float multiplier, float offset = 0.0f);
// Data retrieval
PowerData getPowerData() const;
float getVoltageRMS() const;
float getCurrentRMS(CurrentChannel channel) const;
float getPower(CurrentChannel channel) const;
Структура данных колбэка:
struct PowerData {
float voltage_rms; // RMS voltage (V)
float current_rms[3]; // RMS currents [LOAD, GRID, SOLAR] (A)
float power[3]; // Power [LOAD, GRID, SOLAR] (W)
float power_dimmer; // Dimmer power (W)
uint32_t timestamp_ms; // Timestamp
bool valid; // Data is valid
};
3.2.3 DimmerHAL
Файлы:
Описание:
HAL для управления AC-диммером с TRIAC и детектором перехода через ноль.
Возможности:
- Двухканальный диммер (2 независимые нагрузки)
- Детектирование перехода через ноль для синхронизации с формой AC-сигнала
- Автоматическое определение частоты сети (50/60 Гц)
- RMS-компенсированная кривая мощности
- Плавные переходы
Конфигурация железа:
namespace DimmerConfig {
constexpr uint8_t PHASE_NUM = 0; // Single phase
constexpr uint16_t MAINS_FREQUENCY = 0; // 0 = auto-detect
constexpr uint8_t MAX_CHANNELS = 2; // 2 channels
constexpr uint32_t DEFAULT_TRANSITION_MS = 500; // Transition time
}
GPIO-пины (по умолчанию):
- Zero-Cross: GPIO 18
- Dimmer Ch1: GPIO 19
- Dimmer Ch2: GPIO 23
Публичные методы:
// Initialization
bool begin();
// Channel control
void setPower(DimmerChannel channel, uint8_t percent);
void setPowerSmooth(DimmerChannel channel, uint8_t percent, uint32_t transition_ms);
uint8_t getPower(DimmerChannel channel) const;
// Quick turn off
void turnOff(DimmerChannel channel);
void turnOffAll();
// Power curve
void setCurve(DimmerChannel channel, DimmerCurve curve);
// Information
DimmerStatus getStatus(DimmerChannel channel) const;
bool isInitialized() const;
Типы кривых:
enum class DimmerCurve : uint8_t {
LINEAR, // Linear
RMS, // RMS-compensated (recommended for heating elements)
LOGARITHMIC // Logarithmic (for LED)
};
3.2.4 PinDefinitions.h
Файл: include/PinDefinitions.h
Описание:
Централизованные определения GPIO-пинов для всего проекта.
Пины по умолчанию:
// ADC pins (ADC1 only!)
constexpr uint8_t ADC_VOLTAGE_PIN = 35; // ZMPT107 voltage sensor
constexpr uint8_t ADC_CURRENT_LOAD_PIN = 39; // SCT-013 load current
constexpr uint8_t ADC_CURRENT_GRID_PIN = 36; // SCT-013 grid current
constexpr uint8_t ADC_CURRENT_SOLAR_PIN = 34;// SCT-013 solar current
// Dimmer pins
constexpr uint8_t DIMMER_ZEROCROSS_PIN = 18; // Zero-cross detector
constexpr uint8_t DIMMER_CH1_PIN = 19; // Dimmer channel 1
constexpr uint8_t DIMMER_CH2_PIN = 23; // Dimmer channel 2 (Phase 2)
// LED indicators
constexpr uint8_t LED_STATUS_PIN = 17; // Status LED
constexpr uint8_t LED_LOAD_PIN = 5; // Load indicator LED
// Relays (Phase 2)
constexpr uint8_t RELAY_CH1_PIN = 15; // Relay 1
constexpr uint8_t RELAY_CH2_PIN = 2; // Relay 2
Примечание: Пины можно переназначить через HardwareConfigManager и веб-интерфейс.
3.3 Модуль utils (Утилиты)
Путь: components/utils/
Назначение: Вспомогательные классы для конфигурации, команд и типов данных.
Компоненты
3.3.1 ConfigManager
Файлы:
Описание:
Менеджер конфигурации системы с автоматическим сохранением в NVS.
Пространство имён NVS: "acrouter"
Хранимые параметры:
struct SystemConfig {
// Router parameters
uint8_t router_mode; // RouterMode (0-5)
float control_gain; // Kp coefficient (10-1000)
float balance_threshold; // Balance threshold (W)
uint8_t manual_level; // Level for MANUAL mode (0-100%)
// Sensor calibration
float voltage_coef; // Voltage coefficient
float current_coef; // Current coefficient (A/V)
float current_threshold; // Minimum current (A)
float power_threshold; // Minimum power (W)
};
Ключи NVS:
namespace ConfigKeys {
constexpr const char* ROUTER_MODE = "router_mode";
constexpr const char* CONTROL_GAIN = "ctrl_gain";
constexpr const char* BALANCE_THRESHOLD = "bal_thresh";
constexpr const char* MANUAL_LEVEL = "manual_lvl";
constexpr const char* VOLTAGE_COEF = "volt_coef";
constexpr const char* CURRENT_COEF = "curr_coef";
// ... etc.
}
Публичные методы:
// Initialization
bool begin();
// Get configuration
const SystemConfig& getConfig() const;
// Set parameters (automatically saved to NVS)
bool setRouterMode(uint8_t mode);
bool setControlGain(float gain);
bool setBalanceThreshold(float threshold);
bool setManualLevel(uint8_t level);
bool setVoltageCoefficient(float coef);
bool setCurrentCoefficient(float coef);
// Bulk operations
bool saveAll();
bool loadAll();
bool resetToDefaults();
Описание:
namespace ConfigDefaults {
constexpr uint8_t ROUTER_MODE = 1; // AUTO
constexpr float CONTROL_GAIN = 200.0f;
constexpr float BALANCE_THRESHOLD = 10.0f;
constexpr uint8_t MANUAL_LEVEL = 0;
constexpr float VOLTAGE_COEF = 230.0f;
constexpr float CURRENT_COEF = 50.0f; // SCT-013 50A/1V
}
cpp
Файлы:
- struct HardwareConfig { ADCChannelConfig adc[4]; // 4 ADC-канала DimmerChannelConfig dimmer[2]; // 2 канала диммера RelayChannelConfig relay[2]; // 2 реле uint8_t zerocross_gpio; // GPIO перехода через ноль bool zerocross_enabled; uint8_t led_status_gpio; // Статусный LED };
- Публичные методы:
Описание:
📋 Copy
// Инициализация bool begin(); // ADC-каналы void setADCChannel(uint8_t idx, const ADCChannelConfig& config); ADCChannelConfig getADCChannel(uint8_t idx) const; // Диммер void setDimmerChannel(uint8_t idx, const DimmerChannelConfig& config); DimmerChannelConfig getDimmerChannel(uint8_t idx) const; // Сохранение/загрузка bool save(); bool load(); void resetToDefaults(); // Диагностика void printConfig();
Пример:
struct HardwareConfig {
ADCChannelConfig adc_channels[4]; // 4 ADC channels
DimmerChannelConfig dimmer_ch1; // Dimmer 1
DimmerChannelConfig dimmer_ch2; // Dimmer 2
uint8_t zerocross_gpio; // Zero-cross pin
bool zerocross_enabled;
RelayChannelConfig relay_ch1; // Relay 1
RelayChannelConfig relay_ch2; // Relay 2
uint8_t led_status_gpio; // Status LED
uint8_t led_load_gpio; // Load LED
};
Структуры данных
struct ADCChannelConfig {
uint8_t gpio; // GPIO pin (ADC1 only: 32,33,34,35,36,39)
SensorType type; // Sensor type
float multiplier; // Calibration multiplier
float offset; // Calibration offset
bool enabled; // Channel enabled
};
Публичные методы:
// Initialization
bool begin();
// ADC channel configuration
bool setADCChannel(uint8_t channel, const ADCChannelConfig& config);
ADCChannelConfig getADCChannel(uint8_t channel) const;
// Dimmer configuration
bool setDimmerChannel(uint8_t channel, const DimmerChannelConfig& config);
// Relay configuration
bool setRelayChannel(uint8_t channel, const RelayChannelConfig& config);
// Zero-cross
bool setZeroCross(uint8_t gpio, bool enabled = true);
// LED
bool setStatusLED(uint8_t gpio);
bool setLoadLED(uint8_t gpio);
// Validation
bool validate(String* error_msg = nullptr) const;
// Bulk operations
bool saveAll();
bool loadAll();
bool resetToDefaults();
void printConfig() const;
struct DimmerChannelConfig { uint8_t gpio; // GPIO-пин bool enabled; // Канал включён };
- RelayChannelConfig
- cpp
- 📋 Copy
- struct RelayChannelConfig { uint8_t gpio; // GPIO-пин bool active_high; // true=Active HIGH, false=Active LOW bool enabled; // Канал включён };
3.3.3 SerialCommand
// ADC channels
ADC0: GPIO35, VOLTAGE_AC, mult=230.0, offset=0.0, ENABLED
ADC1: GPIO39, CURRENT_LOAD, mult=30.0, offset=0.0, ENABLED
ADC2: GPIO36, CURRENT_GRID, mult=30.0, offset=0.0, ENABLED
ADC3: GPIO34, CURRENT_SOLAR, mult=30.0, offset=0.0, ENABLED
// Dimmer
Ch1: GPIO19, ENABLED
Ch2: GPIO23, DISABLED
// Zero-Cross
GPIO18, ENABLED
Описание:
Файлы:
Описание:
Команды конфигурации WiFi
Мониторинг статуса
# Information
help # Show all commands
status # Current state
metrics # Power metrics
config-show # Show configuration
hw-config-show # Show hardware configuration
# Mode control
set-mode <0-5> # Set mode (0=OFF, 1=AUTO, ...)
set-manual <0-100> # Set level for MANUAL
# Parameters
set-kp # Set Kp coefficient
set-threshold # Set balance threshold
# Calibration
calibrate-voltage [offset]
calibrate-current [offset]
# Configuration
config-save # Save configuration
config-reset # Reset to factory defaults
hw-config-reset # Reset hardware configuration
# System
reboot # Reboot
factory-reset # Full reset (all settings)
Публичные методы:
// Initialization
void begin();
// Main loop (call from loop())
void update();
// Command registration
void registerCommand(const char* cmd, CommandHandler handler);
Компоненты
Файл: Файлы:
Описание:
src/WiFiManager.cpp
Описание:
// Power data
struct PowerData {
float voltage_rms;
float current_rms[3]; // [LOAD, GRID, SOLAR]
float power[3]; // [LOAD, GRID, SOLAR]
float power_dimmer;
uint32_t timestamp_ms;
bool valid;
};
// System metrics
struct SystemMetrics {
PowerData power;
uint8_t dimmer_percent;
RouterMode mode;
RouterState state;
uint32_t uptime_ms;
uint32_t free_heap;
};
📋 Copy
enum class WiFiState : uint8_t { IDLE, // Не инициализирован AP_ONLY, // Только AP (нет учётных данных STA) STA_CONNECTING, // Подключение к STA STA_CONNECTED, // Подключён к STA AP_STA, // Оба режима активны STA_FAILED // STA не удался, AP активен };
Конфигурация по умолчанию:
Компоненты
📋 Copy
Файлы:
Описание:
WiFi management with simultaneous AP+STA support (ESP32 dual mode).
Режимы работы:
enum class WiFiState : uint8_t {
IDLE, // Not initialized
AP_ONLY, // AP only (no STA credentials)
STA_CONNECTING, // Connecting to STA
STA_CONNECTED, // Connected to STA
AP_STA, // Both modes active
STA_FAILED // STA failed, AP active
};
Описание:
AP SSID: "ACRouter_XXXXXX" // XXXXXX = last 6 digits of MAC
AP Password: "12345678"
AP IP: 192.168.4.1
STA Timeout: 15 seconds
Публичные методы:
// Initialization
bool begin();
// AP mode
bool startAP(const char* ssid = nullptr, const char* password = nullptr);
void stopAP();
bool isAPActive() const;
// STA mode
bool connectSTA(const char* ssid, const char* password);
void disconnectSTA();
bool isSTAConnected() const;
// WiFi scan
std::vector scanNetworks();
// Status
WiFiStatus getStatus() const;
GET /api/status — Статус системы
Файлы:
Описание:
POST /api/manual — Установить ручной уровень
POST /api/calibrate — Калибровка датчиков
REST API — WiFi:
GET /api/wifi/status— Статус WiFiGET /api/wifi/scan— Сканирование сетейPOST /api/wifi/connect— Подключиться к сети
POST /api/wifi/disconnect — Отключиться
POST /api/wifi/forget— Забыть сеть- REST API — Конфигурация железа:
GET /api/hardware/config— Получить конфигурацию
POST /api/hardware/config — Сохранить конфигурацию
POST /api/hardware/validate— Валидация конфигурации- REST API — Система:
POST /api/system/reboot— Перезагрузка
Публичные методы:
- cpp
- 📋 Copy
- // Инициализация bool begin(uint16_t http_port = 80); // Управление void start(); void stop(); bool isRunning() const; // Обработка (вызывать из loop()) void handleClient();
- Интерфейс Material UI:
- Отдельные CSS-стили (
web/styles/MaterialStyles.h
- )
- Переиспользуемый макет (
- web/components/Layout.h
)
- Отдельные страницы (
Публичные методы:
// Initialization
bool begin(uint16_t http_port = 80);
// Control
void start();
void stop();
bool isRunning() const;
// Processing (call from loop())
void handleClient();
include/NTPManager.h
- src/NTPManager.cppОписание:Менеджер синхронизации времени по NTP (для будущих функций: режим SCHEDULE, ведение журнала).
- Возможности:Автоматическая синхронизация с NTP-серверамиМенеджер синхронизации времени по NTP (для будущих функций: режим SCHEDULE, ведение журнала).
- Периодическое обновление времениСтатус: Фаза 2 (не критично для текущей версии)Менеджер синхронизации времени по NTP (для будущих функций: режим SCHEDULE, ведение журнала).
Файлы:
Файлы:
Описание:
Возможности:
Возможности:
- Проверка целостности (MD5)
- Безопасный откат при ошибках
- Использует разделы app0/app1
Статус: Фаза 2 (инфраструктура готова в таблице разделов)
3.5 Модуль rbdimmer (Внешняя библиотека)
Файлы:
Описание:
Фазовое управление TRIAC
Возможности:
- Поддержка нескольких кривых мощности (LINEAR, RMS, LOGARITHMIC)
- Автоматическое определение частоты сети (50/60 Гц)
- Примечание: DimmerHAL является обёрткой над rbdimmer для удобства использования.
- 3.6 Модуль sensors (Типы датчиков)
Путь: components/sensors/
Файл:
include/SensorTypes.h
Описание:
Определения типов датчиков и конфигурации ADC-каналов.
Типы датчиков:
- cpp
- 📋 Copy
- enum class SensorType : uint8_t { NONE = 0, // Канал не используется VOLTAGE_AC, // ZMPT107 (напряжение AC) CURRENT_LOAD, // SCT-013 (ток нагрузки) CURRENT_GRID, // SCT-013 (ток сети, импорт/экспорт) CURRENT_SOLAR, // SCT-013 (ток солнечных панелей) CURRENT_AUX1, // Дополнительный датчик 1 CURRENT_AUX2 // Дополнительный датчик 2 };
- Автоматическое определение частоты сети (50/60 Гц)
cpp
📋 Copy
struct ADCChannelConfig { uint8_t gpio; // GPIO-пин SensorType type; // Тип датчика float multiplier; // Калибровочный коэффициент float offset; // Смещение bool enabled; // Канал активен };
Файл: Граф зависимостей
Описание:
📋 Copy
main.cpp │ ├─► acrouter_hal │ ├─► RouterController │ │ └─► DimmerHAL → rbdimmer │ ├─► DimmerHAL → rbdimmer │ └─► PowerMeterADC → sensors │ ├─► comm │ ├─► WiFiManager │ ├─► WebServerManager │ ├─► NTPManager │ └─► OTAManager │ └─► utils ├─► ConfigManager ├─► HardwareConfigManager → sensors ├─► SerialCommand └─► DataTypes
enum class SensorType : uint8_t {
NONE = 0, // Channel not used
VOLTAGE_AC, // ZMPT107 (AC voltage)
CURRENT_LOAD, // SCT-013 (load current)
CURRENT_GRID, // SCT-013 (grid current, import/export)
CURRENT_SOLAR, // SCT-013 (solar panel current)
CURRENT_AUX1, // Additional sensor 1
CURRENT_AUX2 // Additional sensor 2
};
Используется в
struct ADCChannelConfig {
uint8_t gpio; // GPIO pin
SensorType type; // Sensor type
float multiplier; // Calibration multiplier
float offset; // Offset
bool enabled; // Channel active
};
DimmerHAL
rbdimmer, PinDefinitions
main.cpp
│
├─► acrouter_hal
│ ├─► RouterController
│ │ └─► DimmerHAL → rbdimmer
│ ├─► DimmerHAL → rbdimmer
│ └─► PowerMeterADC → sensors
│
├─► comm
│ ├─► WiFiManager
│ ├─► WebServerManager
│ ├─► NTPManager
│ └─► OTAManager
│
└─► utils
├─► ConfigManager
├─► HardwareConfigManager → sensors
├─► SerialCommand
└─► DataTypes
RouterController, WebServerManager
| ConfigManager | NVS | main.cpp, WebServerManager |
|---|---|---|
| HardwareConfigManager | SensorTypes, NVS | main.cpp, WebServerManager |
| WiFiManager | ESP32 WiFi | main.cpp, WebServerManager |
| WebServerManager | WiFiManager, все | main.cpp |
| SerialCommand | ConfigManager, RouterController | main.cpp |
| 3.8 Настройки модулей | ConfigManager (пространство имён NVS: «acrouter») | main.cpp |
| Ключ NVS | Тип | main.cpp |
| Диапазон | Режим роутера | main.cpp, WebServerManager |
| uint8_t | 1 (AUTO) | main.cpp, WebServerManager |
Коэффициент Kp
ConfigManager (NVS namespace: "acrouter")
| float | 200.0 | 10.0-1000.0 | Порог баланса | bal_thresh |
|---|---|---|---|---|
| float | 10.0 | 0.0-100.0 | Ручной уровень | manual_lvl |
| uint8_t | 0 | 0-100 | Коэффициент напряжения | volt_coef |
| float | 230.0 | 0-100 | Коэффициент тока | curr_coef |
| float | 50.0 | 0.0-100.0 | HardwareConfigManager (пространство имён NVS: «hw_config») | Компонент |
| Ключи NVS | Пример | 0-100 | adc0_gpio, adc0_type, adc0_mult, adc0_offset, adc0_en |
GPIO35, VOLTAGE_AC, 230.0, 0.0, true |
| ADC1 | adc1_gpio, adc1_type, adc1_mult, adc1_offset, adc1_en |
0-100 | Dimmer1 | GPIO35, VOLTAGE_AC, 230.0, 0.0, true |
HardwareConfigManager (NVS namespace: "hw_config")
| Zero-Cross | zc_gpio, zc_en |
GPIO18, true |
|---|---|---|
| Relay1 | rel1_gpio, rel1_pol, rel1_en |
GPIO15, true, false |
| LED Status | led_st_gpio |
GPIO17 |
| ← Компиляция | | | Содержание |
| | | Далее: Режимы роутера → | | |
| Далее: Режимы роутера → | rel1_gpio, rel1_pol, rel1_en |
GPIO15, true, false |
| LED Status | led_st_gpio |
GPIO17 |