Перейти к содержимому

← Компиляция | Содержание | Далее: Режимы роутера →

3. Структура приложения



3.1 Обзор модулей

ACRouter построен на модульной архитектуре с чёткой иерархией компонентов.


Архитектура компонентов

python
┌─────────────────────────────────────────────────────────────┐
│                        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)

Основные параметры:

cpp
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
}

Режимы работы:

cpp
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%
};

Публичные методы:

cpp
// 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 в режиме непрерывного чтения.

Архитектура:

python
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:

cpp
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
}

Поддерживаемые датчики:

cpp
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
};

Публичные методы:

cpp
// 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;

Структура данных колбэка:

cpp
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-компенсированная кривая мощности
  • Плавные переходы

Конфигурация железа:

cpp
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

Публичные методы:

cpp
// 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;

Типы кривых:

cpp
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-пинов для всего проекта.

Пины по умолчанию:

cpp
// 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"

Хранимые параметры:

cpp
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:

cpp
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.
}

Публичные методы:

cpp
// 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();

Описание:

cpp
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

Файлы:

Описание:

📋 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();

Пример:

cpp
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
};

Структуры данных

cpp
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
};

Публичные методы:

cpp
// 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

cpp
// 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)

Публичные методы:

cpp
// Initialization
void begin();

// Main loop (call from loop())
void update();

// Command registration
void registerCommand(const char* cmd, CommandHandler handler);

Компоненты

Файл: Файлы:

Описание:

src/WiFiManager.cpp

Описание:

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

Режимы работы:

cpp
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
};

Описание:

cpp
AP SSID: "ACRouter_XXXXXX"  // XXXXXX = last 6 digits of MAC
AP Password: "12345678"
AP IP: 192.168.4.1
STA Timeout: 15 seconds

Публичные методы:

cpp
// 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 — Статус WiFi
  • GET /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

)

  • Отдельные страницы (

Публичные методы:

cpp
// 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


Файлы:

Файлы:

Описание:

Возможности:

Возможности:

  • Проверка целостности (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

cpp
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
};

Используется в

cpp
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

python
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

← Компиляция | Содержание | Далее: Режимы роутера →