readme
This commit is contained in:
861
README.md
Normal file
861
README.md
Normal file
@@ -0,0 +1,861 @@
|
|||||||
|
# LED Manager Library for ESP32
|
||||||
|
|
||||||
|
A comprehensive and feature-rich LED control library for ESP32 development with ESP-IDF framework. This library provides high-level LED management with support for WS2812/NeoPixel LED strips, color control, blinking functionality, and hardware-accelerated drivers.
|
||||||
|
|
||||||
|
## 📋 Features
|
||||||
|
|
||||||
|
- ✅ **High-level LED management** - Simple API for complex LED operations
|
||||||
|
- ✅ **WS2812/NeoPixel support** - Compatible with popular RGB LED strips
|
||||||
|
- ✅ **Hardware acceleration** - RMT and SPI driver support for precise timing
|
||||||
|
- ✅ **Color management** - Predefined colors with easy-to-use names
|
||||||
|
- ✅ **Blinking functionality** - Non-blocking blinking with configurable rates
|
||||||
|
- ✅ **Thread-safe operations** - Uses FreeRTOS tasks for background operations
|
||||||
|
- ✅ **RGB control** - Full 24-bit color control (0-255 per channel)
|
||||||
|
- ✅ **Multiple driver backends** - RMT (recommended) and SPI implementations
|
||||||
|
- ✅ **Status indication** - Perfect for system status visualization
|
||||||
|
- ✅ **Memory efficient** - Optimized for single-LED or small strip usage
|
||||||
|
|
||||||
|
## 📦 Installation
|
||||||
|
|
||||||
|
### Method 1: Git Submodule
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd your_project_directory/lib
|
||||||
|
git submodule add https://home.arcoa.eu:8413/esp32libs/led_manager.git
|
||||||
|
```
|
||||||
|
|
||||||
|
### Method 2: Manual Copy
|
||||||
|
|
||||||
|
1. Clone or download this repository
|
||||||
|
2. Copy the `led_manager` folder to your project's `lib/` or `components/` directory
|
||||||
|
3. Include the header in your code: `#include "led_manager.h"`
|
||||||
|
|
||||||
|
### Method 3: PlatformIO Library
|
||||||
|
|
||||||
|
Add to your `platformio.ini`:
|
||||||
|
|
||||||
|
```ini
|
||||||
|
lib_deps =
|
||||||
|
git+https://home.arcoa.eu:8413/esp32libs/led_manager.git
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🚀 Quick Start
|
||||||
|
|
||||||
|
### Basic Usage
|
||||||
|
|
||||||
|
```c
|
||||||
|
#include "led_manager.h"
|
||||||
|
|
||||||
|
void app_main(void) {
|
||||||
|
// Initialize LED manager on GPIO 8
|
||||||
|
esp_err_t ret = led_manager_init(GPIO_NUM_8);
|
||||||
|
if (ret != ESP_OK) {
|
||||||
|
printf("LED manager initialization failed: %s\n", esp_err_to_name(ret));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set solid green color
|
||||||
|
led_manager_set_color_by_name("Green", false);
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(2000));
|
||||||
|
|
||||||
|
// Set blinking red color
|
||||||
|
led_manager_set_color_by_name("Red", true);
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(5000));
|
||||||
|
|
||||||
|
// Clear LED and cleanup
|
||||||
|
led_manager_clear();
|
||||||
|
led_manager_deinit();
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Status Indication Example
|
||||||
|
|
||||||
|
```c
|
||||||
|
#include "led_manager.h"
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
STATUS_INITIALIZING,
|
||||||
|
STATUS_CONNECTING,
|
||||||
|
STATUS_CONNECTED,
|
||||||
|
STATUS_ERROR
|
||||||
|
} system_status_t;
|
||||||
|
|
||||||
|
void set_system_status(system_status_t status) {
|
||||||
|
switch (status) {
|
||||||
|
case STATUS_INITIALIZING:
|
||||||
|
led_manager_set_color_by_name("Blue", false);
|
||||||
|
break;
|
||||||
|
case STATUS_CONNECTING:
|
||||||
|
led_manager_set_color_by_name("Orange", true); // Blinking orange
|
||||||
|
break;
|
||||||
|
case STATUS_CONNECTED:
|
||||||
|
led_manager_set_color_by_name("Green", false); // Solid green
|
||||||
|
break;
|
||||||
|
case STATUS_ERROR:
|
||||||
|
led_manager_set_color_by_name("Red", true); // Blinking red
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void app_main(void) {
|
||||||
|
led_manager_init(GPIO_NUM_8);
|
||||||
|
|
||||||
|
// System startup sequence
|
||||||
|
set_system_status(STATUS_INITIALIZING);
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(1000));
|
||||||
|
|
||||||
|
set_system_status(STATUS_CONNECTING);
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(3000));
|
||||||
|
|
||||||
|
set_system_status(STATUS_CONNECTED);
|
||||||
|
|
||||||
|
// Your application logic here...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Advanced RGB Control
|
||||||
|
|
||||||
|
```c
|
||||||
|
#include "led_manager.h"
|
||||||
|
|
||||||
|
void rgb_demo(void) {
|
||||||
|
led_manager_init(GPIO_NUM_8);
|
||||||
|
|
||||||
|
// Set custom colors using RGB values
|
||||||
|
led_manager_set_rgb(255, 0, 128); // Pink
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(1000));
|
||||||
|
|
||||||
|
led_manager_set_rgb(128, 255, 0); // Lime green
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(1000));
|
||||||
|
|
||||||
|
led_manager_set_rgb(0, 128, 255); // Sky blue
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(1000));
|
||||||
|
|
||||||
|
// Use color enum for predefined colors
|
||||||
|
led_manager_set_color(LED_COLOR_YELLOW, false);
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(1000));
|
||||||
|
|
||||||
|
// Configure custom blink rate
|
||||||
|
led_manager_set_blink_rate(250); // Fast blinking (250ms)
|
||||||
|
led_manager_set_color(LED_COLOR_RED, true);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📚 API Reference
|
||||||
|
|
||||||
|
### Data Types
|
||||||
|
|
||||||
|
#### `led_color_t` (Enum)
|
||||||
|
|
||||||
|
Predefined color constants for easy color selection:
|
||||||
|
|
||||||
|
| Value | Color | RGB Values | Use Case |
|
||||||
|
| ------------------ | ------ | ------------- | -------------------------- |
|
||||||
|
| `LED_COLOR_RED` | Red | (200, 0, 0) | Error states, alerts |
|
||||||
|
| `LED_COLOR_ORANGE` | Orange | (200, 40, 0) | Warning states, connecting |
|
||||||
|
| `LED_COLOR_YELLOW` | Yellow | (200, 160, 0) | Caution states, processing |
|
||||||
|
| `LED_COLOR_GREEN` | Green | (0, 180, 0) | Success states, ready |
|
||||||
|
| `LED_COLOR_BLUE` | Blue | (0, 0, 160) | Information states, idle |
|
||||||
|
|
||||||
|
### Constants & Variables
|
||||||
|
|
||||||
|
#### Default Configuration Values
|
||||||
|
|
||||||
|
| Constant | Value | Description |
|
||||||
|
| ------------------ | ------------ | ------------------------------------------- |
|
||||||
|
| Default GPIO | User-defined | GPIO pin for LED strip connection |
|
||||||
|
| Default Blink Rate | 500ms | Standard blinking interval |
|
||||||
|
| LED Count | 1 | Single LED configuration (configurable) |
|
||||||
|
| Color Depth | 24-bit | Full RGB color support (8 bits per channel) |
|
||||||
|
|
||||||
|
#### Predefined RGB Colors
|
||||||
|
|
||||||
|
```c
|
||||||
|
// Internal color definitions (read-only)
|
||||||
|
static const struct {
|
||||||
|
uint8_t red; // Red component (0-255)
|
||||||
|
uint8_t green; // Green component (0-255)
|
||||||
|
uint8_t blue; // Blue component (0-255)
|
||||||
|
const char *name; // Color name string
|
||||||
|
led_color_t enum_val; // Enum identifier
|
||||||
|
} rgb_colors[] = {
|
||||||
|
{200, 0, 0, "Red", LED_COLOR_RED},
|
||||||
|
{200, 40, 0, "Orange", LED_COLOR_ORANGE},
|
||||||
|
{200, 160, 0, "Yellow", LED_COLOR_YELLOW},
|
||||||
|
{0, 180, 0, "Green", LED_COLOR_GREEN},
|
||||||
|
{0, 0, 160, "Blue", LED_COLOR_BLUE}
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Internal State Variables
|
||||||
|
|
||||||
|
```c
|
||||||
|
// Library state (internal use only)
|
||||||
|
static led_strip_handle_t led_strip = NULL; // LED strip handle
|
||||||
|
static bool is_initialized = false; // Initialization state
|
||||||
|
static TaskHandle_t blink_task_handle = NULL; // Blinking task handle
|
||||||
|
static bool is_blinking = false; // Blinking state
|
||||||
|
static uint8_t current_red = 0; // Current red component
|
||||||
|
static uint8_t current_green = 0; // Current green component
|
||||||
|
static uint8_t current_blue = 0; // Current blue component
|
||||||
|
static uint32_t blink_rate_ms = 500; // Current blink rate
|
||||||
|
static bool blink_state = false; // Current blink phase
|
||||||
|
```
|
||||||
|
|
||||||
|
### Functions
|
||||||
|
|
||||||
|
#### Initialization Functions
|
||||||
|
|
||||||
|
##### `esp_err_t led_manager_init(int gpio_pin)`
|
||||||
|
|
||||||
|
Initialize the LED manager with the specified GPIO pin.
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `gpio_pin`: GPIO pin number where LED strip data line is connected
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
|
||||||
|
- `ESP_OK`: Initialization successful
|
||||||
|
- `ESP_ERR_INVALID_ARG`: Invalid GPIO pin
|
||||||
|
- `ESP_ERR_INVALID_STATE`: Already initialized
|
||||||
|
- `ESP_FAIL`: Hardware initialization failed
|
||||||
|
|
||||||
|
**Technical Details:**
|
||||||
|
|
||||||
|
- Configures RMT peripheral for precise timing
|
||||||
|
- Sets up single LED strip configuration
|
||||||
|
- Initializes internal state variables
|
||||||
|
- Clears LED to off state
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
|
||||||
|
```c
|
||||||
|
esp_err_t ret = led_manager_init(GPIO_NUM_8);
|
||||||
|
if (ret != ESP_OK) {
|
||||||
|
ESP_LOGE("APP", "LED init failed: %s", esp_err_to_name(ret));
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
##### `esp_err_t led_manager_deinit(void)`
|
||||||
|
|
||||||
|
Deinitialize the LED manager and free all resources.
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
|
||||||
|
- `ESP_OK`: Success
|
||||||
|
- Error code on failure
|
||||||
|
|
||||||
|
**Technical Details:**
|
||||||
|
|
||||||
|
- Stops blinking task if running
|
||||||
|
- Clears LED strip
|
||||||
|
- Deletes RMT peripheral configuration
|
||||||
|
- Frees allocated memory
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
|
||||||
|
```c
|
||||||
|
// Cleanup before restart
|
||||||
|
led_manager_clear();
|
||||||
|
led_manager_deinit();
|
||||||
|
esp_restart();
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Color Setting Functions
|
||||||
|
|
||||||
|
##### `esp_err_t led_manager_set_color_by_name(const char *color_name, bool blink)`
|
||||||
|
|
||||||
|
Set LED color using string name with optional blinking.
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `color_name`: Color name string (case-insensitive matching)
|
||||||
|
- Valid values: `"Red"`, `"Orange"`, `"Yellow"`, `"Green"`, `"Blue"`
|
||||||
|
- `blink`: Enable blinking (`true`) or solid color (`false`)
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
|
||||||
|
- `ESP_OK`: Color set successfully
|
||||||
|
- `ESP_ERR_INVALID_STATE`: LED manager not initialized
|
||||||
|
- `ESP_ERR_INVALID_ARG`: Invalid color name or NULL pointer
|
||||||
|
|
||||||
|
**Technical Details:**
|
||||||
|
|
||||||
|
- Performs case-insensitive string matching
|
||||||
|
- Automatically stops existing blinking when setting new color
|
||||||
|
- Creates FreeRTOS task for blinking if enabled
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
|
||||||
|
```c
|
||||||
|
// Status indication
|
||||||
|
led_manager_set_color_by_name("Green", false); // Connected
|
||||||
|
led_manager_set_color_by_name("Orange", true); // Connecting
|
||||||
|
led_manager_set_color_by_name("Red", true); // Error
|
||||||
|
```
|
||||||
|
|
||||||
|
##### `esp_err_t led_manager_set_color(led_color_t color, bool blink)`
|
||||||
|
|
||||||
|
Set LED color using color enum with optional blinking.
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `color`: Color enum value from `led_color_t`
|
||||||
|
- `blink`: Enable blinking (`true`) or solid color (`false`)
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
|
||||||
|
- Same as `led_manager_set_color_by_name()`
|
||||||
|
|
||||||
|
**Technical Details:**
|
||||||
|
|
||||||
|
- More efficient than string-based function
|
||||||
|
- Direct enum-to-RGB lookup
|
||||||
|
- Fallback to red color for invalid enum values
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
|
||||||
|
```c
|
||||||
|
// Using enum for better performance
|
||||||
|
led_manager_set_color(LED_COLOR_GREEN, false);
|
||||||
|
led_manager_set_color(LED_COLOR_RED, true);
|
||||||
|
```
|
||||||
|
|
||||||
|
##### `esp_err_t led_manager_set_rgb(uint8_t red, uint8_t green, uint8_t blue)`
|
||||||
|
|
||||||
|
Set LED color using direct RGB values.
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `red`: Red component (0-255)
|
||||||
|
- `green`: Green component (0-255)
|
||||||
|
- `blue`: Blue component (0-255)
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
|
||||||
|
- `ESP_OK`: Color set successfully
|
||||||
|
- `ESP_ERR_INVALID_STATE`: LED manager not initialized
|
||||||
|
- Hardware error codes on failure
|
||||||
|
|
||||||
|
**Technical Details:**
|
||||||
|
|
||||||
|
- Direct RGB control for custom colors
|
||||||
|
- Stops blinking and sets solid color
|
||||||
|
- Updates internal color state variables
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
|
||||||
|
```c
|
||||||
|
// Custom colors
|
||||||
|
led_manager_set_rgb(255, 0, 128); // Pink
|
||||||
|
led_manager_set_rgb(128, 255, 0); // Lime
|
||||||
|
led_manager_set_rgb(255, 165, 0); // Orange variant
|
||||||
|
led_manager_set_rgb(75, 0, 130); // Indigo
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Control Functions
|
||||||
|
|
||||||
|
##### `esp_err_t led_manager_clear(void)`
|
||||||
|
|
||||||
|
Turn off the LED (set to black/off state).
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
|
||||||
|
- `ESP_OK`: LED cleared successfully
|
||||||
|
- `ESP_ERR_INVALID_STATE`: LED manager not initialized
|
||||||
|
- Hardware error codes on failure
|
||||||
|
|
||||||
|
**Technical Details:**
|
||||||
|
|
||||||
|
- Sets RGB values to (0, 0, 0)
|
||||||
|
- Does not stop blinking task (use `led_manager_stop_blinking()` first)
|
||||||
|
- Immediate effect
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
|
||||||
|
```c
|
||||||
|
// Turn off LED completely
|
||||||
|
led_manager_clear();
|
||||||
|
|
||||||
|
// Or stop blinking first, then clear
|
||||||
|
led_manager_stop_blinking();
|
||||||
|
led_manager_clear();
|
||||||
|
```
|
||||||
|
|
||||||
|
##### `esp_err_t led_manager_stop_blinking(void)`
|
||||||
|
|
||||||
|
Stop blinking and maintain current solid color.
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
|
||||||
|
- `ESP_OK`: Blinking stopped successfully
|
||||||
|
- `ESP_ERR_INVALID_STATE`: LED manager not initialized
|
||||||
|
|
||||||
|
**Technical Details:**
|
||||||
|
|
||||||
|
- Stops FreeRTOS blinking task
|
||||||
|
- Restores solid color using current RGB values
|
||||||
|
- Graceful task termination with cleanup
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
|
||||||
|
```c
|
||||||
|
// Stop blinking but keep current color
|
||||||
|
led_manager_set_color_by_name("Red", true); // Start blinking red
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(5000)); // Blink for 5 seconds
|
||||||
|
led_manager_stop_blinking(); // Stop blinking, keep red
|
||||||
|
```
|
||||||
|
|
||||||
|
##### `esp_err_t led_manager_set_blink_rate(uint32_t rate_ms)`
|
||||||
|
|
||||||
|
Configure the blinking rate for future blink operations.
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `rate_ms`: Blink interval in milliseconds (recommended: 100-2000ms)
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
|
||||||
|
- `ESP_OK`: Blink rate set successfully
|
||||||
|
- `ESP_ERR_INVALID_STATE`: LED manager not initialized
|
||||||
|
|
||||||
|
**Technical Details:**
|
||||||
|
|
||||||
|
- Affects all subsequent blinking operations
|
||||||
|
- Does not change currently running blink rate
|
||||||
|
- Minimum recommended value: 50ms
|
||||||
|
- Maximum recommended value: 5000ms
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
|
||||||
|
```c
|
||||||
|
// Configure different blink speeds
|
||||||
|
led_manager_set_blink_rate(1000); // Slow blink (1 second)
|
||||||
|
led_manager_set_color_by_name("Blue", true);
|
||||||
|
|
||||||
|
led_manager_set_blink_rate(200); // Fast blink (200ms)
|
||||||
|
led_manager_set_color_by_name("Red", true);
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔧 Hardware Setup
|
||||||
|
|
||||||
|
### Supported LED Types
|
||||||
|
|
||||||
|
- **WS2812** - Most common RGB LED strip
|
||||||
|
- **WS2812B** - Improved version with better timing
|
||||||
|
- **SK6812** - RGBW variant support
|
||||||
|
- **NeoPixel** - Adafruit brand WS2812-based LEDs
|
||||||
|
|
||||||
|
### Wiring Diagram
|
||||||
|
|
||||||
|
```
|
||||||
|
WS2812 LED Strip ESP32
|
||||||
|
----------------- -----
|
||||||
|
VCC (5V/3.3V) ---- 5V/3.3V Power Supply
|
||||||
|
GND ---- GND
|
||||||
|
DIN (Data) ---- GPIO_NUM_X
|
||||||
|
```
|
||||||
|
|
||||||
|
### GPIO Recommendations
|
||||||
|
|
||||||
|
**Compatible GPIO pins:**
|
||||||
|
|
||||||
|
- ESP32: GPIO 2, 4, 5, 16, 17, 18, 19, 21, 22, 23
|
||||||
|
- ESP32-C3/C6: GPIO 0-10, 18-21 (avoid USB pins 18,19 when using serial)
|
||||||
|
- ESP32-S2/S3: GPIO 1-17, 21, 26-45
|
||||||
|
|
||||||
|
**Recommended pins:**
|
||||||
|
|
||||||
|
- **GPIO 8** - Primary recommendation for ESP32-C6
|
||||||
|
- **GPIO 2** - Built-in LED pin on many boards
|
||||||
|
- **GPIO 16, 17** - Good alternatives for ESP32
|
||||||
|
|
||||||
|
### Power Considerations
|
||||||
|
|
||||||
|
- **Single LED**: ~20mA @ 3.3V (60mA max at full white)
|
||||||
|
- **Short strips**: ESP32 can power 5-10 LEDs directly
|
||||||
|
- **Longer strips**: External 5V power supply required
|
||||||
|
- **Data voltage**: 3.3V logic levels work with most LED strips
|
||||||
|
|
||||||
|
### Pull-up Resistor
|
||||||
|
|
||||||
|
Most LED strips work without additional components, but for reliability:
|
||||||
|
|
||||||
|
```
|
||||||
|
ESP32 GPIO ----[330Ω]---- LED Strip Data
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📖 Usage Patterns
|
||||||
|
|
||||||
|
### System Status Indication
|
||||||
|
|
||||||
|
```c
|
||||||
|
void system_status_demo(void) {
|
||||||
|
led_manager_init(GPIO_NUM_8);
|
||||||
|
|
||||||
|
// Boot sequence
|
||||||
|
led_manager_set_color_by_name("Blue", false); // System starting
|
||||||
|
|
||||||
|
// WiFi connection
|
||||||
|
led_manager_set_color_by_name("Orange", true); // Connecting to WiFi
|
||||||
|
|
||||||
|
// Connected successfully
|
||||||
|
led_manager_set_color_by_name("Green", false); // All systems go
|
||||||
|
|
||||||
|
// Error occurred
|
||||||
|
led_manager_set_color_by_name("Red", true); // Alert user
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Custom Color Schemes
|
||||||
|
|
||||||
|
```c
|
||||||
|
void custom_color_demo(void) {
|
||||||
|
led_manager_init(GPIO_NUM_8);
|
||||||
|
|
||||||
|
// Pastel colors
|
||||||
|
led_manager_set_rgb(255, 182, 193); // Light pink
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(1000));
|
||||||
|
|
||||||
|
led_manager_set_rgb(173, 216, 230); // Light blue
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(1000));
|
||||||
|
|
||||||
|
led_manager_set_rgb(144, 238, 144); // Light green
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(1000));
|
||||||
|
|
||||||
|
// High-intensity colors
|
||||||
|
led_manager_set_rgb(255, 0, 0); // Pure red
|
||||||
|
led_manager_set_rgb(0, 255, 0); // Pure green
|
||||||
|
led_manager_set_rgb(0, 0, 255); // Pure blue
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Breathing Effect Simulation
|
||||||
|
|
||||||
|
```c
|
||||||
|
void breathing_effect_demo(void) {
|
||||||
|
led_manager_init(GPIO_NUM_8);
|
||||||
|
|
||||||
|
// Simulate breathing with different blink rates
|
||||||
|
led_manager_set_blink_rate(2000); // Very slow blink
|
||||||
|
led_manager_set_color_by_name("Blue", true);
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(10000));
|
||||||
|
|
||||||
|
led_manager_set_blink_rate(1000); // Medium blink
|
||||||
|
led_manager_set_color_by_name("Green", true);
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(10000));
|
||||||
|
|
||||||
|
led_manager_set_blink_rate(500); // Fast blink
|
||||||
|
led_manager_set_color_by_name("Red", true);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Multi-State Application
|
||||||
|
|
||||||
|
```c
|
||||||
|
typedef enum {
|
||||||
|
APP_STATE_IDLE,
|
||||||
|
APP_STATE_WORKING,
|
||||||
|
APP_STATE_SUCCESS,
|
||||||
|
APP_STATE_WARNING,
|
||||||
|
APP_STATE_ERROR
|
||||||
|
} app_state_t;
|
||||||
|
|
||||||
|
void set_led_for_state(app_state_t state) {
|
||||||
|
switch (state) {
|
||||||
|
case APP_STATE_IDLE:
|
||||||
|
led_manager_set_color(LED_COLOR_BLUE, false);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case APP_STATE_WORKING:
|
||||||
|
led_manager_set_blink_rate(500);
|
||||||
|
led_manager_set_color(LED_COLOR_YELLOW, true);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case APP_STATE_SUCCESS:
|
||||||
|
led_manager_stop_blinking();
|
||||||
|
led_manager_set_color(LED_COLOR_GREEN, false);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case APP_STATE_WARNING:
|
||||||
|
led_manager_set_blink_rate(1000);
|
||||||
|
led_manager_set_color(LED_COLOR_ORANGE, true);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case APP_STATE_ERROR:
|
||||||
|
led_manager_set_blink_rate(250); // Fast blinking for urgent attention
|
||||||
|
led_manager_set_color(LED_COLOR_RED, true);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🧩 Integration Examples
|
||||||
|
|
||||||
|
### With WiFi Manager
|
||||||
|
|
||||||
|
```c
|
||||||
|
#include "led_manager.h"
|
||||||
|
#include "wifi_manager.h"
|
||||||
|
|
||||||
|
void wifi_status_indication(void) {
|
||||||
|
led_manager_init(GPIO_NUM_8);
|
||||||
|
|
||||||
|
// WiFi connecting
|
||||||
|
led_manager_set_color_by_name("Orange", true);
|
||||||
|
|
||||||
|
wifi_manager_config_t config = {
|
||||||
|
.ssid = "YourSSID",
|
||||||
|
.password = "YourPassword"
|
||||||
|
};
|
||||||
|
|
||||||
|
esp_err_t ret = wifi_manager_init(&config);
|
||||||
|
|
||||||
|
if (ret == ESP_OK) {
|
||||||
|
// Connected successfully
|
||||||
|
led_manager_set_color_by_name("Green", false);
|
||||||
|
} else {
|
||||||
|
// Connection failed
|
||||||
|
led_manager_set_color_by_name("Red", true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### With MQTT Manager
|
||||||
|
|
||||||
|
```c
|
||||||
|
#include "led_manager.h"
|
||||||
|
#include "mqtt_manager.h"
|
||||||
|
|
||||||
|
void mqtt_status_callback(mqtt_event_t event) {
|
||||||
|
switch (event) {
|
||||||
|
case MQTT_EVENT_CONNECTING:
|
||||||
|
led_manager_set_color_by_name("Orange", true);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MQTT_EVENT_CONNECTED:
|
||||||
|
led_manager_set_color_by_name("Green", false);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MQTT_EVENT_DISCONNECTED:
|
||||||
|
led_manager_set_color_by_name("Red", true);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MQTT_EVENT_DATA:
|
||||||
|
// Brief flash to indicate data received
|
||||||
|
led_manager_set_color_by_name("Blue", false);
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(100));
|
||||||
|
led_manager_set_color_by_name("Green", false);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### With Sensor Readings
|
||||||
|
|
||||||
|
```c
|
||||||
|
#include "led_manager.h"
|
||||||
|
#include "dht22_sensor.h"
|
||||||
|
|
||||||
|
void sensor_status_indication(void) {
|
||||||
|
led_manager_init(GPIO_NUM_8);
|
||||||
|
dht22_init(GPIO_NUM_4);
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
float temperature, humidity;
|
||||||
|
dht22_result_t result = dht22_read(&temperature, &humidity);
|
||||||
|
|
||||||
|
if (result == DHT22_OK) {
|
||||||
|
// Good reading - brief green flash
|
||||||
|
led_manager_set_color_by_name("Green", false);
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(100));
|
||||||
|
led_manager_clear();
|
||||||
|
|
||||||
|
// Check for warning conditions
|
||||||
|
if (temperature > 35.0 || humidity > 80.0) {
|
||||||
|
led_manager_set_color_by_name("Yellow", true); // Warning
|
||||||
|
} else if (temperature > 40.0 || humidity > 90.0) {
|
||||||
|
led_manager_set_color_by_name("Red", true); // Critical
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Sensor error
|
||||||
|
led_manager_set_color_by_name("Red", true);
|
||||||
|
}
|
||||||
|
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(5000)); // Check every 5 seconds
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔍 Troubleshooting
|
||||||
|
|
||||||
|
### Common Issues
|
||||||
|
|
||||||
|
1. **LED not lighting up**
|
||||||
|
|
||||||
|
```c
|
||||||
|
// Check initialization
|
||||||
|
esp_err_t ret = led_manager_init(GPIO_NUM_8);
|
||||||
|
if (ret != ESP_OK) {
|
||||||
|
ESP_LOGE("LED", "Init failed: %s", esp_err_to_name(ret));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verify GPIO pin is correct
|
||||||
|
// Try basic RGB test
|
||||||
|
led_manager_set_rgb(255, 0, 0); // Should show red
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Colors appear wrong**
|
||||||
|
|
||||||
|
```c
|
||||||
|
// LED strip may have different color order (GRB vs RGB)
|
||||||
|
// Try each primary color individually:
|
||||||
|
led_manager_set_rgb(255, 0, 0); // Should be red
|
||||||
|
led_manager_set_rgb(0, 255, 0); // Should be green
|
||||||
|
led_manager_set_rgb(0, 0, 255); // Should be blue
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Blinking not working**
|
||||||
|
|
||||||
|
```c
|
||||||
|
// Check if blinking task is created
|
||||||
|
led_manager_set_color_by_name("Red", true);
|
||||||
|
|
||||||
|
// Verify FreeRTOS configuration allows task creation
|
||||||
|
// Check available heap memory
|
||||||
|
```
|
||||||
|
|
||||||
|
4. **Intermittent operation**
|
||||||
|
- Check power supply stability
|
||||||
|
- Verify wiring connections
|
||||||
|
- Add pull-up resistor to data line
|
||||||
|
- Check for electromagnetic interference
|
||||||
|
|
||||||
|
### Hardware Troubleshooting
|
||||||
|
|
||||||
|
**Power Issues:**
|
||||||
|
|
||||||
|
- Ensure adequate power supply (5V/1A for 10+ LEDs)
|
||||||
|
- Check voltage levels with multimeter
|
||||||
|
- Verify ground connections
|
||||||
|
|
||||||
|
**Signal Issues:**
|
||||||
|
|
||||||
|
- Add 330Ω resistor in series with data line
|
||||||
|
- Keep wiring short (< 1 meter for reliable operation)
|
||||||
|
- Use twisted pair or shielded cable for longer runs
|
||||||
|
|
||||||
|
**Performance Issues:**
|
||||||
|
|
||||||
|
- Monitor FreeRTOS heap usage
|
||||||
|
- Check for task stack overflow
|
||||||
|
- Verify GPIO pin capabilities
|
||||||
|
|
||||||
|
### Debug Functions
|
||||||
|
|
||||||
|
```c
|
||||||
|
void led_debug_sequence(void) {
|
||||||
|
ESP_LOGI("LED", "Starting LED debug sequence");
|
||||||
|
|
||||||
|
// Test all predefined colors
|
||||||
|
const char* colors[] = {"Red", "Orange", "Yellow", "Green", "Blue"};
|
||||||
|
for (int i = 0; i < 5; i++) {
|
||||||
|
ESP_LOGI("LED", "Testing color: %s", colors[i]);
|
||||||
|
led_manager_set_color_by_name(colors[i], false);
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(1000));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test blinking
|
||||||
|
ESP_LOGI("LED", "Testing blinking");
|
||||||
|
led_manager_set_color_by_name("Red", true);
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(3000));
|
||||||
|
|
||||||
|
// Test RGB values
|
||||||
|
ESP_LOGI("LED", "Testing RGB values");
|
||||||
|
led_manager_set_rgb(255, 128, 64); // Custom orange
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(1000));
|
||||||
|
|
||||||
|
led_manager_clear();
|
||||||
|
ESP_LOGI("LED", "Debug sequence complete");
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## ⚙️ Configuration
|
||||||
|
|
||||||
|
### Compile-time Configuration
|
||||||
|
|
||||||
|
The library uses default configurations that work for most applications. Advanced users can modify the source code for specific requirements:
|
||||||
|
|
||||||
|
```c
|
||||||
|
// In led_manager.c - modify these values if needed:
|
||||||
|
#define LED_STRIP_LED_COUNT 1 // Number of LEDs
|
||||||
|
#define LED_STRIP_RMT_RESOLUTION 10000000 // 10MHz resolution
|
||||||
|
#define LED_STRIP_TASK_PRIORITY 5 // Blinking task priority
|
||||||
|
#define LED_STRIP_TASK_STACK_SIZE 2048 // Task stack size
|
||||||
|
```
|
||||||
|
|
||||||
|
### Runtime Configuration
|
||||||
|
|
||||||
|
```c
|
||||||
|
void configure_led_advanced(void) {
|
||||||
|
// Initialize with custom settings
|
||||||
|
led_manager_init(GPIO_NUM_8);
|
||||||
|
|
||||||
|
// Set custom blink rates for different scenarios
|
||||||
|
led_manager_set_blink_rate(1000); // Slow for warnings
|
||||||
|
led_manager_set_blink_rate(200); // Fast for alerts
|
||||||
|
led_manager_set_blink_rate(2000); // Very slow for info
|
||||||
|
|
||||||
|
// Custom color intensity (dimmer colors)
|
||||||
|
led_manager_set_rgb(100, 0, 0); // Dim red
|
||||||
|
led_manager_set_rgb(0, 100, 0); // Dim green
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📄 License
|
||||||
|
|
||||||
|
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
|
||||||
|
|
||||||
|
## 🤝 Contributing
|
||||||
|
|
||||||
|
1. Fork the repository
|
||||||
|
2. Create your feature branch (`git checkout -b feature/AmazingFeature`)
|
||||||
|
3. Commit your changes (`git commit -m 'Add some AmazingFeature'`)
|
||||||
|
4. Push to the branch (`git push origin feature/AmazingFeature`)
|
||||||
|
5. Open a Pull Request
|
||||||
|
|
||||||
|
## 📈 Version History
|
||||||
|
|
||||||
|
See [CHANGELOG.md](CHANGELOG.md) for version history and changes.
|
||||||
|
|
||||||
|
## 🆘 Support
|
||||||
|
|
||||||
|
- Create an [issue](../../issues) for bug reports or feature requests
|
||||||
|
- Check existing issues for known problems and solutions
|
||||||
|
|
||||||
|
## ⚡ Performance Notes
|
||||||
|
|
||||||
|
- **Memory usage**: ~500 bytes RAM (including task stack)
|
||||||
|
- **CPU impact**: Minimal, hardware-accelerated timing
|
||||||
|
- **Task overhead**: Single FreeRTOS task for blinking (when enabled)
|
||||||
|
- **Response time**: Immediate color changes, ~1ms update time
|
||||||
|
- **Power consumption**:
|
||||||
|
- Single LED: 0-60mA depending on color and brightness
|
||||||
|
- ESP32 overhead: ~2mA for library management
|
||||||
|
- Blinking task: ~1% CPU usage
|
||||||
|
|
||||||
|
## 🔗 Related Libraries
|
||||||
|
|
||||||
|
- **[dht22_sensor](../dht22_sensor/README.md)** - Temperature/humidity sensor
|
||||||
|
- **[wifi_manager](../wifi_manager/README.md)** - WiFi connection management
|
||||||
|
- **[mqtt_manager](../mqtt_manager/README.md)** - MQTT communication
|
||||||
|
|
||||||
|
## 🎯 Use Cases
|
||||||
|
|
||||||
|
- **IoT Status Indication** - Visual feedback for device states
|
||||||
|
- **Debugging Aid** - Color-coded debug information
|
||||||
|
- **User Interface** - Simple visual feedback system
|
||||||
|
- **Ambient Lighting** - Mood lighting and notification system
|
||||||
|
- **Industrial Monitoring** - Equipment status visualization
|
||||||
|
- **Home Automation** - Status displays for smart devices
|
||||||
Reference in New Issue
Block a user