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

← - Руководство Arduino и примеры. | Содержание | Далее: Компонент ESPHome →

Руководство ESP-IDF и примеры

Универсальная библиотека для управления яркостью для ESP32. Руководство по фреймворку ESP-IDF и примеры на C.

Перед началом прочитайте обзор библиотеки: Универсальная библиотека для ESP32

Требования и совместимость

  • Минимальная версия ESP-IDF: 5.3
  • Поддерживаемые чипы: ESP32, ESP32-S2, ESP32-S3, ESP32-C3, ESP32-C6
  • Библиотека использует стандартный Kconfig для конфигурации сборки (переименован из Kconfig.txt в v2.0.0)

Новое в v2.0.0

Версия 2.0.0 — это крупная переработка внутренней структуры. Открытый API полностью обратно совместим — не требуются никакие изменения в коде приложения.

Внутренние улучшения:

  • Модульная архитектура — кодовая база разделена на 7 внутренних модулей (ядро фазовой обработки, менеджер каналов, таблицы кривых, ядро ISR и т. д.). Единственный открытый заголовок rbdimmerESP32.h — это всё, что вам нужно включить.
  • Все ISR используют IRAM_ATTR и таймеры используют диспетчеризацию ESP_TIMER_ISR для детерминированного микросекундного взаимодействия.
  • Фильтр шума нулевого пересечения — настраиваемое окно защиты от дребезга отклоняет электрические помехи и ложные срабатывания на входе нулевого пересечения. По умолчанию: 3000 мкс.
  • Двухпроходный ISR для синхронизации многоканальной системы — когда несколько каналов используют одну фазу, ISR предварительно сортирует их по задержке и запускает импульсы TRIAC в одном консолидированном проходе, исключая временные колебания между каналами.
  • Конфигурация сборки Kconfig — файл теперь называется Kconfig (стандартное соглашение ESP-IDF; ранее Kconfig.txt).

Новые параметры Kconfig:

Параметр По умолчанию Описание
CONFIG_RBDIMMER_ZC_DEBOUNCE_US 3000 Окно защиты от дребезга нулевого пересечения в микросекундах
CONFIG_RBDIMMER_MIN_DELAY_US 100 Минимальная задержка запуска TRIAC в микросекундах
CONFIG_RBDIMMER_LEVEL_MIN 3 Минимальный уровень затемнения (%). Значения ниже этого рассматриваются как ВЫКЛ
CONFIG_RBDIMMER_LEVEL_MAX 99 Максимальный уровень затемнения (%)

Установка

Использование CMake с ESP-IDF

  1. Загрузите библиотеку rbdimmerESP32 из репозитория GitHub:
bash
git clone https://github.com/your-username/rbdimmerESP32 components/rbdimmer
  1. Configure your project's CMakeLists.txt to include the library:
cmake
# Main project CMakeLists.txt
cmake_minimum_required(VERSION 3.5)
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
project(your_project_name)
  1. Add component dependency in your application's CMakeLists.txt:
cmake
# App CMakeLists.txt
idf_component_register(
    SRCS "main.c"
    INCLUDE_DIRS "."
    REQUIRES rbdimmer
)
  1. The library's CMakeLists.txt and Kconfig are included automatically when placed in components/rbdimmer/. The component CMakeLists.txt registers sources, includes, and dependencies:
cmake
# components/rbdimmer/CMakeLists.txt
idf_component_register(
    SRCS "rbdimmerESP32.c"
    INCLUDE_DIRS "include"
    REQUIRES driver esp_timer freertos
)

Конфигурация Kconfig

Библиотека предоставляет параметры настройки через систему menuconfig ESP-IDF. Для их изменения:

bash
idf.py menuconfig
# Navigate to: Component config → RBDimmer Configuration

Доступные параметры:

  • Zero-Cross Debounce (us)CONFIG_RBDIMMER_ZC_DEBOUNCE_US (по умолчанию 3000). Увеличьте, если видите ложные срабатывания нулевого пересечения из-за электрических помех.
  • Minimum TRIAC Delay (us)CONFIG_RBDIMMER_MIN_DELAY_US (по умолчанию 100). Предотвращает запуск TRIAC слишком близко к нулевому пересечению, что может вызвать мерцание при высокой яркости.
  • Level Min (%)CONFIG_RBDIMMER_LEVEL_MIN (по умолчанию 3). Уровни ниже этого порога рассматриваются как ВЫКЛ, чтобы избежать нестабильного поведения TRIAC.
  • Level Max (%)CONFIG_RBDIMMER_LEVEL_MAX (по умолчанию 99). Ограничивает максимальный угол срабатывания.

Подключение оборудования

Инструкции по подключению управляющей схемы к микроконтроллеру и нагрузке переменного тока:

  • Подключите Zero-Cross Pin к любому GPIO с функцией ISR. Проверьте документацию вашего чипа ESP32
  • Подключите Dimmer Pin к любому GPIO
  • VCC к 3.3В (для ESP32, VCC = 3.3В)
  • GND к GND

Базовый пример (ESP-IDF / C)

c
#include 
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"
#include "rbdimmerESP32.h"
static const char *TAG = "DIMMER_EXAMPLE";
// Pins
#define ZERO_CROSS_PIN  18   // Zero-Cross pin
#define DIMMER_PIN      19   // Dimming control pin
#define PHASE_NUM       0    // Phase N (0 for single phase)
// Global variables. Dimmer object
rbdimmer_channel_t* dimmer_channel = NULL;
void app_main(void)
{
    ESP_LOGI(TAG, "AC Dimmer Test");
    // Dimmer lib init
    if (rbdimmer_init() != RBDIMMER_OK) {
        ESP_LOGE(TAG, "Failed to initialize AC Dimmer library");
        return;
    }
    // Zero-cross detector and phase registry
    if (rbdimmer_register_zero_cross(ZERO_CROSS_PIN, PHASE_NUM, 0) != RBDIMMER_OK) {
        ESP_LOGE(TAG, "Failed to register zero-cross detector");
        return;
    }
    // Dimmer channel. Configuration data structure.
    rbdimmer_config_t config_channel = {
        .gpio_pin = DIMMER_PIN,
        .phase = PHASE_NUM,
        .initial_level = 50,  // Initial dimming level 50%
        .curve_type = RBDIMMER_CURVE_RMS  // Level Curve Selection. RMS-curve
    };
    if (rbdimmer_create_channel(&config_channel, &dimmer_channel) != RBDIMMER_OK) {
        ESP_LOGE(TAG, "Failed to create dimmer channel");
        return;
    }
    ESP_LOGI(TAG, "AC Dimmer initialized successfully");
    // Main loop
    while (1) {
        // dimming from 10% to 90% with step 10
        for (int brightness = 10; brightness <= 90; brightness += 10) {
            ESP_LOGI(TAG, "Setting brightness to %d%%", brightness);
            rbdimmer_set_level(dimmer_channel, brightness);
            vTaskDelay(2000 / portTICK_PERIOD_MS);
        }
        // Smooth transition from current level to 0 level in 5 sec
        ESP_LOGI(TAG, "Smooth transition to 0%%");
        rbdimmer_set_level_transition(dimmer_channel, 0, 5000);
        vTaskDelay(6000 / portTICK_PERIOD_MS); // delay 6 sec
        // Smooth transition from current level (0) to 100 level in 5 sec
        ESP_LOGI(TAG, "Smooth transition to 100%%");
        rbdimmer_set_level_transition(dimmer_channel, 100, 5000);
        vTaskDelay(6000 / portTICK_PERIOD_MS); // delay 6 sec
    }
}

Справочник API

Работа библиотеки

Подготовка:

  1. Инициализируйте библиотеку с помощью rbdimmer_init()
  2. Зарегистрируйте детектор нулевого пересечения с помощью rbdimmer_register_zero_cross()
  3. Создайте канал управляющей схемы с помощью rbdimmer_create_channel()

Управление затемнением:

  • Установите уровень затемнения с помощью rbdimmer_set_level(). Уровень затемнения задаётся в диапазоне 0(ВЫКЛ) ~ 100(ВКЛ)
  • Плавный переход уровня затемнения с помощью rbdimmer_set_level_transition(). Плавный переход от текущего уровня к установленному уровню в течение периода времени (в миллисекундах, 1s=1000ms)

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

rbdimmer_config_t

c
typedef struct {
    uint8_t gpio_pin;                 // Dimmer GPIO
    uint8_t phase;                    // Phase number
    uint8_t initial_level;            // Initial dimming level
    rbdimmer_curve_t curve_type;      // Level Curve type
} rbdimmer_config_t;

Перечисления

rbdimmer_curve_t

Типы кривых уровней:

c
typedef enum {
    RBDIMMER_CURVE_LINEAR,      // Linear curve
    RBDIMMER_CURVE_RMS,         // RMS-compensated curve (for incandescent bulbs)
    RBDIMMER_CURVE_LOGARITHMIC  // Logarithmic curve (for dimmable LED)
} rbdimmer_curve_t;

rbdimmer_err_t

Ответы функций библиотеки:

c
typedef enum {
    RBDIMMER_OK = 0,            // Successful execution
    RBDIMMER_ERR_INVALID_ARG,   // Invalid argument
    RBDIMMER_ERR_NO_MEMORY,     // Not enough memory
    RBDIMMER_ERR_NOT_FOUND,     // Object not found
    RBDIMMER_ERR_ALREADY_EXIST, // Object already exists
    RBDIMMER_ERR_TIMER_FAILED,  // Timer initialization error
    RBDIMMER_ERR_GPIO_FAILED    // GPIO initialization error
} rbdimmer_err_t;

Константы и макросы

В v2.0.0 большинство параметров настройки перемещены в Kconfig (см. Конфигурация Kconfig выше). Следующие константы остаются в rbdimmerESP32.h:

c
#define RBDIMMER_MAX_PHASES 4                 // Maximum number of phases
#define RBDIMMER_MAX_CHANNELS 8               // Maximum number of channels
#define RBDIMMER_DEFAULT_PULSE_WIDTH_US 50    // Pulse width (us)

Следующие теперь настраиваются через idf.py menuconfig:

c
// Kconfig defaults (override via menuconfig):
// CONFIG_RBDIMMER_ZC_DEBOUNCE_US  = 3000   // Zero-cross debounce (us)
// CONFIG_RBDIMMER_MIN_DELAY_US    = 100    // Minimum TRIAC delay (us)
// CONFIG_RBDIMMER_LEVEL_MIN       = 3      // Minimum level (%)
// CONFIG_RBDIMMER_LEVEL_MAX       = 99     // Maximum level (%)

Функции

Инициализация и настройка

c
// Initialize the library
rbdimmer_err_t rbdimmer_init(void);
// Register a zero-cross detector
rbdimmer_err_t rbdimmer_register_zero_cross(uint8_t pin, uint8_t phase, uint16_t frequency);
// Create a dimmer channel
rbdimmer_err_t rbdimmer_create_channel(rbdimmer_config_t* config, rbdimmer_channel_t** channel);
// Set callback function for zero-cross events
rbdimmer_err_t rbdimmer_set_callback(uint8_t phase, void (*callback)(void*), void* user_data);

Управление затемнением

c
// Set dimming level
rbdimmer_err_t rbdimmer_set_level(rbdimmer_channel_t* channel, uint8_t level_percent);
// Set brightness with smooth transition
rbdimmer_err_t rbdimmer_set_level_transition(rbdimmer_channel_t* channel, uint8_t level_percent, uint32_t transition_ms);
// Set brightness curve type
rbdimmer_err_t rbdimmer_set_curve(rbdimmer_channel_t* channel, rbdimmer_curve_t curve_type);
// Activate/deactivate channel
rbdimmer_err_t rbdimmer_set_active(rbdimmer_channel_t* channel, bool active);

Информационные запросы

c
// Get current channel brightness
uint8_t rbdimmer_get_level(rbdimmer_channel_t* channel);
// Get measured mains frequency for the specified phase
uint16_t rbdimmer_get_frequency(uint8_t phase);
// Check if channel is active
bool rbdimmer_is_active(rbdimmer_channel_t* channel);
// Get channel curve type
rbdimmer_curve_t rbdimmer_get_curve(rbdimmer_channel_t* channel);
// Get current channel delay
uint32_t rbdimmer_get_delay(rbdimmer_channel_t* channel);

Пошаговое руководство

Структура проекта

text
your_project/
├── CMakeLists.txt
├── main/
│   ├── CMakeLists.txt
│   └── main.c
└── components/
    └── rbdimmer/
        ├── CMakeLists.txt
        ├── Kconfig
        ├── include/
        │   └── rbdimmer.h
        └── rbdimmerESP32.c

Этапы реализации

  1. Определите библиотеку и пины в вашем файле main.c:
c
#include "rbdimmer.h"
// Pins
#define ZERO_CROSS_PIN  18   // Zero-Cross pin
#define DIMMER_PIN      19   // Dimming control pin
#define PHASE_NUM       0    // Phase N (0 for single phase)
  1. Создайте объект управляющей схемы (один для каждого управления):
c
rbdimmer_channel_t* dimmer_channel = NULL;
  1. Инициализируйте библиотеку управления яркостью:
c
rbdimmer_init();
  1. Зарегистрируйте детектор нулевого пересечения и фазу:
c
rbdimmer_register_zero_cross(ZERO_CROSS_PIN, PHASE_NUM, 0);
  1. Настройте канал управляющей схемы и создайте его:
c
rbdimmer_config_t config_channel = {
    .gpio_pin = DIMMER_PIN,
    .phase = PHASE_NUM,
    .initial_level = 50,  // Initial dimming level 50%
    .curve_type = RBDIMMER_CURVE_RMS  // Level Curve Selection. RMS-curve
};
rbdimmer_create_channel(&config_channel, &dimmer_channel);
  1. Управляйте затемнением:
c
// Set specific level
rbdimmer_set_level(dimmer_channel, level);
// Smooth transition
rbdimmer_set_level_transition(dimmer_channel, 0, 5000);

Расширенные примеры

Многоканальные системы управления яркостью

c
#include 
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"
#include "rbdimmer.h"
#define ZERO_CROSS_PIN  18
#define DIMMER_PIN_1    19
#define DIMMER_PIN_2    21
#define PHASE_NUM       0
static const char *TAG = "DIMMER_EXAMPLE";
rbdimmer_channel_t* channel1 = NULL;
rbdimmer_channel_t* channel2 = NULL;
void app_main(void)
{
    // Initialize library
    rbdimmer_init();
    // Register zero-cross detector (one per phase)
    rbdimmer_register_zero_cross(ZERO_CROSS_PIN, PHASE_NUM, 0);
    // Create first channel (incandescent bulbs)
    rbdimmer_config_t config1 = {
        .gpio_pin = DIMMER_PIN_1,
        .phase = PHASE_NUM,
        .initial_level = 50,
        .curve_type = RBDIMMER_CURVE_RMS
    };
    rbdimmer_create_channel(&config1, &channel1);
    // Create second channel (dimmable LED lighting)
    rbdimmer_config_t config2 = {
        .gpio_pin = DIMMER_PIN_2,
        .phase = PHASE_NUM,
        .initial_level = 50,
        .curve_type = RBDIMMER_CURVE_LOGARITHMIC
    };
    rbdimmer_create_channel(&config2, &channel2);
    // Main control loop
    while (1) {
        // Control channels independently
        rbdimmer_set_level(channel1, 75);
        rbdimmer_set_level(channel2, 25);
        vTaskDelay(2000 / portTICK_PERIOD_MS);
        rbdimmer_set_level(channel1, 25);
        rbdimmer_set_level(channel2, 75);
        vTaskDelay(2000 / portTICK_PERIOD_MS);
    }
}

Использование функций обратного вызова прерывания нулевого пересечения

c
#include 
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "driver/gpio.h"
#include "esp_log.h"
#include "rbdimmer.h"
#define ZERO_CROSS_PIN  18
#define DIMMER_PIN      19
#define LED_PIN         2  // Built-in LED for zero-cross visualization
#define PHASE_NUM       0
static const char *TAG = "DIMMER_CALLBACK";
rbdimmer_channel_t* dimmer = NULL;
QueueHandle_t zero_cross_queue;
// Simple message for our queue
typedef struct {
    uint32_t timestamp;
} ZeroCrossEvent_t;
// Callback function for zero-cross events
void zero_cross_callback(void* arg)
{
    ZeroCrossEvent_t event;
    event.timestamp = esp_timer_get_time() / 1000; // Current time in ms
    // Send to queue from ISR
    BaseType_t higher_priority_task_woken = pdFALSE;
    xQueueSendFromISR(zero_cross_queue, &event, &higher_priority_task_woken);
    if (higher_priority_task_woken) {
        portYIELD_FROM_ISR();
    }
}
// Task to process zero-cross events
void zero_cross_processing_task(void *pvParameters)
{
    ZeroCrossEvent_t event;
    while (1) {
        if (xQueueReceive(zero_cross_queue, &event, portMAX_DELAY)) {
            // Toggle LED to visualize zero-crossing
            gpio_set_level(LED_PIN, !gpio_get_level(LED_PIN));
            // Additional processing can be done here safely
            ESP_LOGI(TAG, "Zero-cross event at time: %lu ms", event.timestamp);
        }
    }
}
void app_main(void)
{
    // Setup LED
    gpio_reset_pin(LED_PIN);
    gpio_set_direction(LED_PIN, GPIO_MODE_OUTPUT);
    // Create the queue
    zero_cross_queue = xQueueCreate(10, sizeof(ZeroCrossEvent_t));
    if (zero_cross_queue == NULL) {
        ESP_LOGE(TAG, "Failed to create queue");
        return;
    }
    // Create the task to process zero-cross events
    BaseType_t task_created = xTaskCreate(
        zero_cross_processing_task,
        "ZeroCrossTask",
        2048,
        NULL,
        5,
        NULL
    );
    if (task_created != pdPASS) {
        ESP_LOGE(TAG, "Failed to create task");
        return;
    }
    // Initialize dimmer
    rbdimmer_init();
    rbdimmer_register_zero_cross(ZERO_CROSS_PIN, PHASE_NUM, 0);
    // Register callback
    rbdimmer_set_callback(PHASE_NUM, zero_cross_callback, NULL);
    // Create dimmer channel
    rbdimmer_config_t config = {
        .gpio_pin = DIMMER_PIN,
        .phase = PHASE_NUM,
        .initial_level = 60,
        .curve_type = RBDIMMER_CURVE_RMS
    };
    rbdimmer_create_channel(&config, &dimmer);
    ESP_LOGI(TAG, "Dimmer with callback initialized");
    // Main loop - print frequency information
    while (1) {
        uint16_t frequency = rbdimmer_get_frequency(PHASE_NUM);
        ESP_LOGI(TAG, "Detected frequency: %u Hz", frequency);
        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
}

Многофазные системы

c
#include 
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"
#include "rbdimmer.h"
#define ZERO_CROSS_PIN_PHASE_A  18
#define ZERO_CROSS_PIN_PHASE_B  19
#define ZERO_CROSS_PIN_PHASE_C  21
#define DIMMER_PIN_PHASE_A      22
#define DIMMER_PIN_PHASE_B      23
#define DIMMER_PIN_PHASE_C      25
#define PHASE_A  0
#define PHASE_B  1
#define PHASE_C  2
static const char *TAG = "DIMMER_MULTIPHASE";
rbdimmer_channel_t* channel_a = NULL;
rbdimmer_channel_t* channel_b = NULL;
rbdimmer_channel_t* channel_c = NULL;
void app_main(void)
{
    // Initialize library
    rbdimmer_init();
    // Register zero-cross detectors for each phase
    rbdimmer_register_zero_cross(ZERO_CROSS_PIN_PHASE_A, PHASE_A, 0);
    rbdimmer_register_zero_cross(ZERO_CROSS_PIN_PHASE_B, PHASE_B, 0);
    rbdimmer_register_zero_cross(ZERO_CROSS_PIN_PHASE_C, PHASE_C, 0);
    // Create channels for each phase
    rbdimmer_config_t config_a = {
        .gpio_pin = DIMMER_PIN_PHASE_A,
        .phase = PHASE_A,
        .initial_level = 50,
        .curve_type = RBDIMMER_CURVE_RMS
    };
    rbdimmer_create_channel(&config_a, &channel_a);
    rbdimmer_config_t config_b = {
        .gpio_pin = DIMMER_PIN_PHASE_B,
        .phase = PHASE_B,
        .initial_level = 50,
        .curve_type = RBDIMMER_CURVE_RMS
    };
    rbdimmer_create_channel(&config_b, &channel_b);
    rbdimmer_config_t config_c = {
        .gpio_pin = DIMMER_PIN_PHASE_C,
        .phase = PHASE_C,
        .initial_level = 50,
        .curve_type = RBDIMMER_CURVE_RMS
    };
    rbdimmer_create_channel(&config_c, &channel_c);
    ESP_LOGI(TAG, "Multi-phase dimmer system initialized");
    // Main control loop
    while (1) {
        // Control phases with different levels
        ESP_LOGI(TAG, "Setting phase A: 75%%, phase B: 50%%, phase C: 25%%");
        rbdimmer_set_level(channel_a, 75);
        rbdimmer_set_level(channel_b, 50);
        rbdimmer_set_level(channel_c, 25);
        vTaskDelay(3000 / portTICK_PERIOD_MS);
        ESP_LOGI(TAG, "Setting phase A: 25%%, phase B: 50%%, phase C: 75%%");
        rbdimmer_set_level(channel_a, 25);
        rbdimmer_set_level(channel_b, 50);
        rbdimmer_set_level(channel_c, 75);
        vTaskDelay(3000 / portTICK_PERIOD_MS);
    }
}

Мониторинг работы и отладка

c
void print_dimmer_status(rbdimmer_channel_t* channel, uint8_t phase)
{
    ESP_LOGI(TAG, "=== Dimmer Status ===");
    ESP_LOGI(TAG, "Mains frequency: %d Hz", rbdimmer_get_frequency(phase));
    ESP_LOGI(TAG, "Brightness: %d%%", rbdimmer_get_level(channel));
    ESP_LOGI(TAG, "Active: %s", rbdimmer_is_active(channel) ? "Yes" : "No");
    ESP_LOGI(TAG, "Curve type: %d", rbdimmer_get_curve(channel));
    ESP_LOGI(TAG, "Delay: %d us", rbdimmer_get_delay(channel));
    ESP_LOGI(TAG, "====================");
}

Устранение неполадок

Общие вопросы

  • If the dimmer doesn't work correctly, check your hardware connections, especially the zero-cross detector
  • Убедитесь, что пин нулевого пересечения подключён к GPIO, поддерживающему прерывания
  • Используйте функции ESP_LOG для мониторинга работы в реальном времени
  • Для многоканальных систем убедитесь, что каждый канал управления имеет отдельный пин GPIO
  • Библиотека поддерживает автоматическое обнаружение частоты. Если вы знаете частоту сети в вашем регионе (обычно 50Гц или 60Гц), вы можете установить её явно для лучшей начальной производительности

Проблемы мерцания и стабильности (исправления v2.0.0)

Случайное мерцание или ложные срабатывания: Фильтр шума нулевого пересечения (CONFIG_RBDIMMER_ZC_DEBOUNCE_US, по умолчанию 3000 мкс) фильтрует электрические помехи на линии нулевого пересечения. Если вы всё ещё видите случайное мерцание, попробуйте увеличить значение защиты от дребезга через idf.py menuconfig.

Мерцание на 100% (полная яркость): Минимальная задержка TRIAC (CONFIG_RBDIMMER_MIN_DELAY_US, по умолчанию 100 мкс) предотвращает запуск TRIAC слишком близко к краю нулевого пересечения. По умолчанию v2.0.0 100 мкс устраняет мерцание, которое возникало с предыдущим значением по умолчанию 50 мкс.

Нестабильное поведение ниже 3%: Уровни ниже CONFIG_RBDIMMER_LEVEL_MIN (по умолчанию 3%) теперь рассматриваются как ВЫКЛ. TRIAC не может надёжно поддерживать проводимость при очень малых углах срабатывания, поэтому библиотека переходит в режим ВЫКЛ вместо выдачи нестабильного выхода.

Колебания многоканальной системы: Когда несколько каналов используют одну и ту же фазу, v2.0.0 использует двухпроходный ISR, который предварительно сортирует каналы по задержке и запускает их последовательно в одном прерывании. Это устраняет временные колебания, которые могли возникнуть, когда каналы имели похожие значения задержки в более ранних версиях.

Непрерывная интеграция

Библиотека тестируется в CI против следующей матрицы:

  • Версии ESP-IDF: v5.3, v5.4, v5.5
  • Целевые чипы: ESP32, ESP32-S2, ESP32-S3, ESP32-C3, ESP32-C6

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

Журнал изменений

Полный список изменений см. в CHANGELOG.md.

← - Руководство Arduino и примеры. | Содержание | Далее: Компонент ESPHome →