← Режимы роутера | Содержание | Далее: Основное приложение →
5. API модулей и структуры данных
5.1 API RouterController
Файлы:
- components/acrouter_hal/include/RouterController.h
- components/acrouter_hal/src/RouterController.cpp
Паттерн: Singleton
Получение экземпляра
RouterController& router = RouterController::getInstance();
Инициализация
begin()
bool begin(DimmerHAL* dimmer, DimmerChannel channel = DimmerChannel::CHANNEL_1);
Описание: инициализация контроллера с привязкой к диммеру.
Parameters:
- dimmer - pointer to initialized DimmerHAL
- channel - dimmer channel (CHANNEL_1 or CHANNEL_2)
Возвращает: true при успехе, false при ошибке
Пример:
DimmerHAL& dimmer = DimmerHAL::getInstance();
RouterController& router = RouterController::getInstance();
dimmer.begin();
if (router.begin(&dimmer, DimmerChannel::CHANNEL_1)) {
Serial.println("RouterController initialized");
} else {
Serial.println("RouterController init failed");
}
Управление режимами
setMode()
void setMode(RouterMode mode);
Описание: установить режим работы контроллера.
Parameters:
- mode - one of 6 modes (OFF=0, AUTO=1, ECO=2, OFFGRID=3, MANUAL=4, BOOST=5)
Пример:
router.setMode(RouterMode::AUTO); // Automatic mode
router.setMode(RouterMode::MANUAL); // Manual mode
getMode()
RouterMode getMode() const;
Описание: получить текущий режим работы.
Возвращает: текущий RouterMode
Пример:
RouterMode current = router.getMode();
if (current == RouterMode::AUTO) {
Serial.println("Running in AUTO mode");
}
Параметры управления
setControlGain()
void setControlGain(float gain);
Описание: установить коэффициент пропорционального регулятора (Kp).
Parameters:
- gain - gain coefficient (10.0 - 1000.0)
Effect:
- Lower Kp � faster response, possible oscillations
- Higher Kp � slower response, more stable
Пример:
router.setControlGain(200.0f); // Standard value
router.setControlGain(100.0f); // Faster response
router.setControlGain(400.0f); // Slower, more stable
getControlGain()
float getControlGain() const;
Возвращает: текущее значение Kp
setBalanceThreshold()
void setBalanceThreshold(float threshold);
Описание: установить порог баланса в Ваттах.
Parameters:
- threshold - threshold in W (typically 5.0 - 50.0)
Effect:
- If |P_grid| < threshold, system is considered balanced
- Lower threshold � more accurate balance, more switching
- Higher threshold � less switching, less accurate balance
Пример:
router.setBalanceThreshold(10.0f); // �10 W considered balanced
router.setBalanceThreshold(20.0f); // �20 W for larger loads
getBalanceThreshold()
float getBalanceThreshold() const;
Возвращает: текущий порог баланса (Вт)
Ручное управление (режим MANUAL)
setManualLevel()
void setManualLevel(uint8_t percent);
Описание: установить фиксированный уровень диммера для режима MANUAL.
Parameters:
- percent - dimmer level 0-100%
Пример:
router.setMode(RouterMode::MANUAL);
router.setManualLevel(75); // Set to 75%
getManualLevel()
uint8_t getManualLevel() const;
Возвращает: заданный уровень для режима MANUAL
Основной цикл обновления
update()
void update(const PowerMeterADC::Measurements& measurements);
Описание: основная функция управления. Вызывается автоматически из колбэка PowerMeterADC каждые 200 мс.
Parameters:
- measurements - structure with power measurements
Примечание: обычно вызывается автоматически, ручной вызов не требуется.
Внутренняя логика:
void update(const Measurements& meas) {
switch (mode) {
case OFF: processOffMode(); break;
case AUTO: processAutoMode(P_grid); break;
case ECO: processEcoMode(P_grid); break;
case OFFGRID: processOffgridMode(meas); break;
case MANUAL: processManualMode(); break;
case BOOST: processBoostMode(); break;
}
}
Аварийная остановка
emergencyStop()
void emergencyStop();
Описание: немедленное отключение диммера (0%) и переход в режим OFF.
When to use:
- System overheating
- Sensor error
- Critical situation
Пример:
if (temperature > 80.0f) {
router.emergencyStop();
Serial.println("EMERGENCY STOP: Overheating!");
}
Получение статуса
getStatus()
RouterStatus getStatus() const;
Описание: получить полную информацию о состоянии контроллера.
Возвращает: структуру RouterStatus
Пример:
RouterStatus status = router.getStatus();
Serial.printf("Mode: %d\n", static_cast(status.mode));
Serial.printf("State: %d\n", static_cast(status.state));
Serial.printf("Dimmer: %d%%\n", status.dimmer_percent);
Serial.printf("P_grid: %.1f W\n", status.power_grid);
Serial.printf("Kp: %.1f\n", status.control_gain);
Структуры данных
RouterStatus
struct RouterStatus {
RouterMode mode; // Current mode
RouterState state; // State (IDLE, INCREASING, etc.)
uint8_t dimmer_percent; // Dimmer level (0-100%)
float target_level; // Target level (float for smoothness)
float power_grid; // Current grid power (W)
float control_gain; // Kp coefficient
float balance_threshold; // Balance threshold (W)
uint32_t last_update_ms; // Last update timestamp
bool valid; // Status is valid
};
RouterMode
enum class RouterMode : uint8_t {
OFF = 0, // Disabled
AUTO, // Automatic Solar Router
ECO, // Economic (anti-export)
OFFGRID, // Autonomous
MANUAL, // Manual
BOOST // Forced 100%
};
RouterState
enum class RouterState : uint8_t {
IDLE, // No action
INCREASING, // Increasing dimmer (exporting)
DECREASING, // Decreasing dimmer (importing)
AT_MAXIMUM, // At maximum (100%)
AT_MINIMUM, // At minimum (0%)
ERROR // Error state
};
5.2 API PowerMeterADC
Файлы:
- components/acrouter_hal/include/PowerMeterADC.h
- components/acrouter_hal/src/PowerMeterADC.cpp
Паттерн: Singleton
Получение экземпляра
PowerMeterADC& powerMeter = PowerMeterADC::getInstance();
Инициализация
begin()
bool begin();
Описание: инициализация DMA ADC и создание задачи обработки FreeRTOS.
Возвращает: true при успехе
Пример:
PowerMeterADC& powerMeter = PowerMeterADC::getInstance();
if (powerMeter.begin()) {
Serial.println("PowerMeterADC initialized");
} else {
Serial.println("PowerMeterADC init failed");
}
Управление измерениями
start()
bool start();
Описание: запустить непрерывные измерения DMA ADC.
Возвращает: true при успешном запуске
Пример:
if (powerMeter.start()) {
Serial.println("Measurements started");
}
stop()
void stop();
Описание: остановить измерения.
Пример:
powerMeter.stop();
Serial.println("Measurements stopped");
isRunning()
bool isRunning() const;
Описание: проверить, идут ли измерения.
Возвращает: true, если измерения активны
Колбэк результатов
setCallback()
void setCallback(std::function callback);
Описание: установить функцию колбэка, которая будет вызываться каждые 200 мс с результатами RMS.
Parameters:
- callback - function of type void callback(const Measurements& meas)
Пример:
// Option 1: Lambda
powerMeter.setCallback([](const PowerMeterADC::Measurements& meas) {
Serial.printf("V: %.1f V, I_grid: %.2f A, P_grid: %.1f W\n",
meas.voltage_rms,
meas.current_rms[PowerMeterADC::CURRENT_GRID],
meas.power_active[PowerMeterADC::CURRENT_GRID]);
});
// Option 2: Global function
void onMeasurements(const PowerMeterADC::Measurements& meas) {
// Process measurements
}
powerMeter.setCallback(onMeasurements);
// Option 3: Class method
powerMeter.setCallback([this](const auto& meas) {
this->handleMeasurements(meas);
});
Калибровка датчиков
setVoltageCalibration()
void setVoltageCalibration(float multiplier, float offset = 0.0f);
Описание: установить калибровочные коэффициенты для датчика напряжения.
Parameters:
- multiplier - multiplier (V/V_adc)
- offset - offset (V)
Формула: V_real = V_adc * multiplier + offset
Пример:
// ZMPT107: 230V � 1V (scale 1:230)
powerMeter.setVoltageCalibration(230.0f, 0.0f);
// With offset correction
powerMeter.setVoltageCalibration(235.0f, -2.5f);
setCurrentCalibration()
void setCurrentCalibration(CurrentChannel channel, float multiplier, float offset = 0.0f);
Описание: установить калибровочные коэффициенты для датчика тока.
Parameters:
- channel - channel (CURRENT_LOAD, CURRENT_GRID, CURRENT_SOLAR)
- multiplier - multiplier (A/V_adc)
- offset - offset (A)
Формула: I_real = I_adc * multiplier + offset
Пример:
// SCT-013-030: 30A � 1V
powerMeter.setCurrentCalibration(PowerMeterADC::CURRENT_GRID, 30.0f, 0.0f);
// ACS-712-20A: 0A=2.5V, sensitivity 100mV/A
powerMeter.setCurrentCalibration(PowerMeterADC::CURRENT_LOAD, 10.0f, -25.0f);
Получение данных
getPowerData()
Measurements getPowerData() const;
Описание: получить последние измерения (потокобезопасно).
Возвращает: структуру Measurements
Пример:
PowerMeterADC::Measurements data = powerMeter.getPowerData();
if (data.valid) {
Serial.printf("Voltage: %.1f V\n", data.voltage_rms);
Serial.printf("Current Grid: %.2f A\n", data.current_rms[PowerMeterADC::CURRENT_GRID]);
Serial.printf("Power Grid: %.1f W\n", data.power_active[PowerMeterADC::CURRENT_GRID]);
}
getVoltageRMS()
float getVoltageRMS() const;
Описание: получить только RMS-напряжение.
Возвращает: напряжение в Вольтах
getCurrentRMS()
float getCurrentRMS(CurrentChannel channel) const;
Описание: получить RMS-ток для указанного канала.
Parameters:
- channel - CURRENT_LOAD, CURRENT_GRID or CURRENT_SOLAR
Возвращает: ток в Амперах
Пример:
float i_grid = powerMeter.getCurrentRMS(PowerMeterADC::CURRENT_GRID);
float i_solar = powerMeter.getCurrentRMS(PowerMeterADC::CURRENT_SOLAR);
Serial.printf("Grid: %.2f A, Solar: %.2f A\n", i_grid, i_solar);
getPower()
float getPower(CurrentChannel channel) const;
Описание: получить активную мощность для указанного канала.
Parameters:
- channel - CURRENT_LOAD, CURRENT_GRID or CURRENT_SOLAR
Возвращает: мощность в Ваттах
Пример:
float p_grid = powerMeter.getPower(PowerMeterADC::CURRENT_GRID);
if (p_grid < 0) {
Serial.println("Exporting to grid");
} else {
Serial.println("Importing from grid");
}
Структуры данных
Measurements
struct Measurements {
float voltage_rms; // RMS voltage (V)
float current_rms[3]; // RMS currents [LOAD, GRID, SOLAR] (A)
float power_active[3]; // Active power [LOAD, GRID, SOLAR] (W)
float power_reactive[3]; // Reactive power (VAR) - Phase 2
float power_apparent[3]; // Apparent power (VA) - Phase 2
float power_factor[3]; // Power factor - Phase 2
uint32_t timestamp_ms; // Timestamp
bool valid; // Data is valid
};
CurrentChannel
enum CurrentChannel : uint8_t {
CURRENT_LOAD = 0, // Load current (dimmer)
CURRENT_GRID = 1, // Grid current (import/export)
CURRENT_SOLAR = 2, // Solar panel current
CURRENT_COUNT = 3
};
5.3 API DimmerHAL
Файлы:
- components/acrouter_hal/include/DimmerHAL.h
- components/acrouter_hal/src/DimmerHAL.cpp
Паттерн: Singleton
Получение экземпляра
DimmerHAL& dimmer = DimmerHAL::getInstance();
Инициализация
begin()
bool begin();
Описание: инициализация диммера с детектором перехода через ноль.
Возвращает: true при успехе
Пример:
DimmerHAL& dimmer = DimmerHAL::getInstance();
if (dimmer.begin()) {
Serial.println("DimmerHAL initialized");
} else {
Serial.println("DimmerHAL init failed");
}
Управление мощностью
setPower()
void setPower(DimmerChannel channel, uint8_t percent);
Описание: мгновенно установить мощность диммера.
Parameters:
- channel - CHANNEL_1 or CHANNEL_2
- percent - power 0-100%
Пример:
dimmer.setPower(DimmerChannel::CHANNEL_1, 75); // 75%
dimmer.setPower(DimmerChannel::CHANNEL_2, 50); // 50% on second channel
setPowerSmooth()
void setPowerSmooth(DimmerChannel channel, uint8_t percent, uint32_t transition_ms);
Описание: плавно изменить мощность.
Parameters:
- channel - CHANNEL_1 or CHANNEL_2
- percent - target power 0-100%
- transition_ms - transition time in milliseconds
Пример:
// Smoothly transition to 80% over 2 seconds
dimmer.setPowerSmooth(DimmerChannel::CHANNEL_1, 80, 2000);
// Smooth shutdown over 1 second
dimmer.setPowerSmooth(DimmerChannel::CHANNEL_1, 0, 1000);
getPower()
uint8_t getPower(DimmerChannel channel) const;
Описание: получить текущую мощность канала.
Возвращает: мощность 0–100%
Пример:
uint8_t current_power = dimmer.getPower(DimmerChannel::CHANNEL_1);
Serial.printf("Dimmer 1: %d%%\n", current_power);
Быстрое управление
turnOff()
void turnOff(DimmerChannel channel);
Описание: быстро отключить канал (0%).
Пример:
dimmer.turnOff(DimmerChannel::CHANNEL_1);
turnOffAll()
void turnOffAll();
Описание: отключить все каналы.
Пример:
dimmer.turnOffAll(); // Emergency shutdown
Кривая мощности
setCurve()
void setCurve(DimmerChannel channel, DimmerCurve curve);
Описание: установить тип кривой мощности.
Parameters:
- channel - CHANNEL_1 or CHANNEL_2
- curve - LINEAR, RMS or LOGARITHMIC
Recommendations:
- RMS - for resistive loads (heaters, water heaters) - recommended
- LINEAR - linear dependency
- LOGARITHMIC - for LED lamps
Пример:
// RMS curve for heater (recommended)
dimmer.setCurve(DimmerChannel::CHANNEL_1, DimmerCurve::RMS);
// Linear curve
dimmer.setCurve(DimmerChannel::CHANNEL_1, DimmerCurve::LINEAR);
Статус и информация
getStatus()
DimmerStatus getStatus(DimmerChannel channel) const;
Описание: получить детальный статус канала.
Возвращает: структуру DimmerStatus
Пример:
DimmerStatus status = dimmer.getStatus(DimmerChannel::CHANNEL_1);
Serial.printf("Initialized: %s\n", status.initialized ? "Yes" : "No");
Serial.printf("Active: %s\n", status.active ? "Yes" : "No");
Serial.printf("Power: %d%%\n", status.power_percent);
Serial.printf("Target: %d%%\n", status.target_percent);
isInitialized()
bool isInitialized() const;
Описание: проверить, инициализирован ли диммер.
Возвращает: true, если инициализирован
Структуры данных
DimmerChannel
enum class DimmerChannel : uint8_t {
CHANNEL_1 = 0, // First channel (GPIO 19)
CHANNEL_2 = 1 // Second channel (GPIO 23)
};
DimmerCurve
enum class DimmerCurve : uint8_t {
LINEAR, // Linear
RMS, // RMS-compensated (recommended)
LOGARITHMIC // Logarithmic
};
DimmerStatus
struct DimmerStatus {
bool initialized; // Initialized
bool active; // Active
uint8_t power_percent; // Current power (0-100%)
uint8_t target_percent; // Target power (during transition)
DimmerCurve curve; // Curve type
uint32_t last_update_ms; // Last update time
};
5.4 API ConfigManager
Файлы:
- components/utils/include/ConfigManager.h
- components/utils/src/ConfigManager.cpp
Паттерн: Singleton
Пространство имён NVS: "acrouter"
Получение экземпляра
ConfigManager& config = ConfigManager::getInstance();
Инициализация
begin()
bool begin();
Описание: инициализация NVS и загрузка конфигурации.
Возвращает: true при успехе
Пример:
ConfigManager& config = ConfigManager::getInstance();
if (config.begin()) {
Serial.println("ConfigManager initialized");
Serial.printf("Router mode: %d\n", config.getConfig().router_mode);
}
Получение конфигурации
getConfig()
const SystemConfig& getConfig() const;
Описание: получить ссылку на текущую конфигурацию.
Возвращает: константную ссылку на SystemConfig
Пример:
const SystemConfig& cfg = config.getConfig();
Serial.printf("Mode: %d\n", cfg.router_mode);
Serial.printf("Kp: %.1f\n", cfg.control_gain);
Serial.printf("Threshold: %.1f W\n", cfg.balance_threshold);
Установка параметров
setRouterMode()
bool setRouterMode(uint8_t mode);
Описание: установить режим роутера (автоматически сохраняется в NVS).
Parameters:
- mode - mode 0-5
Возвращает: true при успешном сохранении
Пример:
config.setRouterMode(1); // AUTO mode
setControlGain()
bool setControlGain(float gain);
Описание: установить коэффициент Kp.
Parameters:
- gain - coefficient (10.0 - 1000.0)
Пример:
config.setControlGain(200.0f);
setBalanceThreshold()
bool setBalanceThreshold(float threshold);
Описание: установить порог баланса.
Parameters:
- threshold - threshold in Watts (0.0 - 100.0)
Пример:
config.setBalanceThreshold(10.0f);
setManualLevel()
bool setManualLevel(uint8_t level);
Описание: установить уровень для режима MANUAL.
Parameters:
- level - level 0-100%
Пример:
config.setManualLevel(75);
setVoltageCoefficient()
bool setVoltageCoefficient(float coef);
Описание: установить калибровочный коэффициент напряжения.
Пример:
config.setVoltageCoefficient(230.0f);
setCurrentCoefficient()
bool setCurrentCoefficient(float coef);
Описание: установить калибровочный коэффициент тока.
Пример:
config.setCurrentCoefficient(30.0f); // SCT-013-030
Групповые операции
saveAll()
bool saveAll();
Описание: сохранить все параметры в NVS.
Примечание: обычно не требуется, так как каждый метод set*() сохраняет автоматически.
loadAll()
bool loadAll();
Описание: перезагрузить конфигурацию из NVS.
resetToDefaults()
bool resetToDefaults();
Описание: сбросить все настройки до заводских значений и сохранить в NVS.
Пример:
if (config.resetToDefaults()) {
Serial.println("Config reset to defaults");
}
Структуры данных
SystemConfig
struct SystemConfig {
// Router parameters
uint8_t router_mode; // RouterMode (0-5)
float control_gain; // Kp (10.0 - 1000.0)
float balance_threshold; // Balance threshold (W)
uint8_t manual_level; // MANUAL level (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)
};
5.5 API HardwareConfigManager
Файлы:
- components/utils/include/HardwareConfigManager.h
- components/utils/src/HardwareConfigManager.cpp
Паттерн: Singleton
Пространство имён NVS: "hw_config"
Получение экземпляра
HardwareConfigManager& hwConfig = HardwareConfigManager::getInstance();
Инициализация
begin()
bool begin();
Описание: инициализация и загрузка конфигурации железа из NVS.
Пример:
HardwareConfigManager& hwConfig = HardwareConfigManager::getInstance();
if (hwConfig.begin()) {
Serial.println("HardwareConfigManager initialized");
}
Конфигурация ADC-каналов
setADCChannel()
bool setADCChannel(uint8_t channel, const ADCChannelConfig& config);
Описание: настроить ADC-канал.
Parameters:
- channel - channel number (0-3)
- config - channel configuration
Возвращает: true при успехе
Пример:
ADCChannelConfig voltage_cfg;
voltage_cfg.gpio = 35;
voltage_cfg.type = SensorType::VOLTAGE_AC;
voltage_cfg.multiplier = 230.0f;
voltage_cfg.offset = 0.0f;
voltage_cfg.enabled = true;
hwConfig.setADCChannel(0, voltage_cfg);
getADCChannel()
ADCChannelConfig getADCChannel(uint8_t channel) const;
Описание: получить конфигурацию ADC-канала.
Пример:
ADCChannelConfig cfg = hwConfig.getADCChannel(0);
Serial.printf("ADC0: GPIO%d, Type=%d, Mult=%.1f\n",
cfg.gpio, static_cast(cfg.type), cfg.multiplier);
Конфигурация диммера
setDimmerChannel()
bool setDimmerChannel(uint8_t channel, const DimmerChannelConfig& config);
Описание: настроить канал диммера.
Parameters:
- channel - 0 (Channel 1) or 1 (Channel 2)
- config - configuration
Пример:
DimmerChannelConfig dim_cfg;
dim_cfg.gpio = 19;
dim_cfg.enabled = true;
hwConfig.setDimmerChannel(0, dim_cfg);
Конфигурация Zero-Cross
setZeroCross()
bool setZeroCross(uint8_t gpio, bool enabled = true);
Описание: настроить GPIO для детектора перехода через ноль.
Пример:
hwConfig.setZeroCross(18, true); // GPIO18, enabled
Сохранение и загрузка
save()
bool setRelayChannel(uint8_t channel, const RelayChannelConfig& config);
Описание: сохранить конфигурацию железа в NVS.
Parameters:
- channel - 0 or 1
- config - relay configuration
Пример:
RelayChannelConfig relay_cfg;
relay_cfg.gpio = 15;
relay_cfg.active_high = true; // Active HIGH
relay_cfg.enabled = true;
hwConfig.setRelayChannel(0, relay_cfg);
resetToDefaults()
cpp
bool setStatusLED(uint8_t gpio);
printConfig()
Пример:
hwConfig.setStatusLED(17);
Пример:
bool setLoadLED(uint8_t gpio);
Структуры данных
ADCChannelConfig
cpp
bool validate(String* error_msg = nullptr) const;
cpp
Parameters:
- error_msg - pointer to String for error message (optional)
struct DimmerChannelConfig { uint8_t gpio; // GPIO-пин bool enabled; // Канал включён };
Checks:
- GPIO conflicts (one pin = one function)
- Pin validity for ADC (ADC1 only: 32-39)
- Input-only pins (34,35,36,39 cannot be outputs)
Пример:
String error;
if (!hwConfig.validate(&error)) {
Serial.printf("Validation failed: %s\n", error.c_str());
} else {
Serial.println("Configuration is valid");
}
Групповые операции
saveAll()
bool saveAll();
components/comm/include/WiFiManager.h
loadAll()
bool loadAll();
cpp
resetToDefaults()
bool resetToDefaults();
cpp
📋 Copy
void printConfig() const;
Пример:
Пример:
hwConfig.printConfig();
// Output:
// === Hardware Configuration ===
// ADC0: GPIO35, VOLTAGE_AC, mult=230.0, enabled
// ADC1: GPIO39, CURRENT_LOAD, mult=30.0, enabled
// ...
Структуры данных
cpp
struct ADCChannelConfig {
uint8_t gpio; // GPIO pin (32-39 for ADC1)
SensorType type; // Sensor type
float multiplier; // Calibration multiplier
float offset; // Offset
bool enabled; // Channel enabled
};
Параметры:
- ssid — SSID сети (nullptr = авто: "ACRouter_XXXXXX")
- password — пароль (nullptr = "12345678")
struct DimmerChannelConfig {
uint8_t gpio; // GPIO pin
bool enabled; // Channel enabled
};
// С автогенерируемым SSID wifi.startAP(); // С заданным SSID wifi.startAP("MyACRouter", "mypassword123");
struct RelayChannelConfig {
uint8_t gpio; // GPIO pin
bool active_high; // true=Active HIGH, false=Active LOW
bool enabled; // Channel enabled
};
void stopAP();
enum class SensorType : uint8_t {
NONE = 0, // Not used
VOLTAGE_AC, // ZMPT107 (AC voltage)
CURRENT_LOAD, // ACS-712 (dimmer load current)
CURRENT_GRID, // SCT-013 (grid current)
CURRENT_SOLAR, // SCT-013 (solar current)
CURRENT_AUX1, // Auxiliary channel 1
CURRENT_AUX2 // Auxiliary channel 2
};
📋 Copy
Файлы:
- Возвращает: true, если AP активна
- connectSTA()
Паттерн: Singleton
Получение экземпляра
WiFiManager& wifi = WiFiManager::getInstance();
Инициализация
begin()
bool begin();
disconnectSTA()
Возвращает: true при успехе
Пример:
WiFiManager& wifi = WiFiManager::getInstance();
if (wifi.begin()) {
Serial.println("WiFiManager initialized");
WiFiStatus status = wifi.getStatus();
Serial.printf("AP IP: %s\n", status.ap_ip.toString().c_str());
}
cpp
📋 Copy
bool startAP(const char* ssid = nullptr, const char* password = nullptr);
scanNetworks()
Parameters:
- ssid - network SSID (nullptr = auto: "ACRouter_XXXXXX")
- password - password (nullptr = "12345678")
Пример:
// With auto-generated SSID
wifi.startAP();
// With custom SSID
wifi.startAP("MyACRouter", "mypassword123");
Пример:
void stopAP();
Статус
getStatus()
bool isAPActive() const;
Описание: получить полный статус WiFi.
Пример:
cpp
bool connectSTA(const char* ssid, const char* password);
WiFiState
Parameters:
- ssid - network SSID
- password - password
📋 Copy
Пример:
if (wifi.connectSTA("HomeNetwork", "password123")) {
Serial.println("Connected to WiFi");
WiFiStatus status = wifi.getStatus();
Serial.printf("STA IP: %s\n", status.sta_ip.toString().c_str());
}
struct WiFiStatus { WiFiState state; bool sta_connected; bool ap_active; IPAddress sta_ip; IPAddress ap_ip; String sta_ssid; String ap_ssid; int8_t rssi; uint8_t sta_clients; // Клиенты на AP };
void disconnectSTA();
struct WiFiNetwork { String ssid; int8_t rssi; bool encrypted; };
5.7 API WebServerManager
bool isSTAConnected() const;
components/comm/src/WebServerManager.cpp
Паттерн: Singleton
Получение экземпляра
std::vector scanNetworks();
Инициализация
begin()
Пример:
std::vector networks = wifi.scanNetworks();
Serial.printf("Found %d networks:\n", networks.size());
for (const auto& net : networks) {
Serial.printf(" %s (RSSI: %d, Encrypted: %s)\n",
net.ssid.c_str(),
net.rssi,
net.encrypted ? "Yes" : "No");
}
Параметры:
- http_port — HTTP-порт (по умолчанию 80)
getStatus()
WiFiStatus getStatus() const;
Управление
Пример:
WiFiStatus status = wifi.getStatus();
Serial.printf("State: %d\n", static_cast(status.state));
Serial.printf("STA connected: %s\n", status.sta_connected ? "Yes" : "No");
Serial.printf("AP active: %s\n", status.ap_active ? "Yes" : "No");
if (status.sta_connected) {
Serial.printf("STA IP: %s\n", status.sta_ip.toString().c_str());
Serial.printf("RSSI: %d dBm\n", status.rssi);
}
if (status.ap_active) {
Serial.printf("AP IP: %s\n", status.ap_ip.toString().c_str());
Serial.printf("Clients: %d\n", status.sta_clients);
}
Структуры данных
stop()
enum class WiFiState : uint8_t {
IDLE, // Not initialized
AP_ONLY, // AP only
STA_CONNECTING, // Connecting to STA
STA_CONNECTED, // Connected to STA
AP_STA, // Both modes
STA_FAILED // STA failed
};
Описание: остановить веб-сервер.
struct WiFiStatus {
WiFiState state;
bool sta_connected;
bool ap_active;
IPAddress sta_ip;
IPAddress ap_ip;
String sta_ssid;
String ap_ssid;
int8_t rssi;
uint8_t sta_clients; // Clients on AP
};
bool isRunning() const;
struct WiFiNetwork {
String ssid;
int8_t rssi;
bool encrypted;
};
cpp
Файлы:
- void handleClient();
- Пример:
Паттерн: Singleton
Получение экземпляра
WebServerManager& webServer = WebServerManager::getInstance();
Инициализация
begin()
bool begin(uint16_t http_port = 80);
Веб-страницы: /, /wifi, /settings/hardware
Parameters:
- http_port - HTTP port (default 80)
Пример:
WebServerManager& webServer = WebServerManager::getInstance();
if (webServer.begin(80)) {
Serial.println("WebServer started on port 80");
}
← Режимы роутера
start()
void start();
|
stop()
void stop();
Description: Stop web server.
isRunning()
bool isRunning() const;
Returns: true if server is running
Request Handling
handleClient()
void handleClient();
Description: Handle incoming HTTP requests. Call from loop().
Пример:
void loop() {
webServer.handleClient();
// ... rest of code
}
REST API Endpoints
For complete endpoint list see Section 8: GET endpoints and Section 9: POST endpoints.
Main groups:
- Web pages:
/,/wifi,/settings/hardware - Status:
/api/status,/api/metrics,/api/config - Control:
/api/mode,/api/manual,/api/calibrate - WiFi:
/api/wifi/* - Hardware:
/api/hardware/* - System:
/api/system/reboot
← Режимы роутера | Содержание | Далее: Основное приложение →