Added a multi channel example with run limit, tilting and channel selection features. Refs #1104 and closes #1111.
176 lines
10 KiB
Markdown
176 lines
10 KiB
Markdown
# Relay Channel Multi Example
|
|
|
|
## Introduction
|
|
|
|
This example demonstrates how to use the relay channel component to control a 3-channel setup with button inputs and LED status indication. It showcases:
|
|
|
|
- Basic relay channel operations (forward/reverse running, stopping)
|
|
- Secondary operations (tilting, direction flipping)
|
|
- State change event handling with a listener
|
|
- Relay channel run limit
|
|
- Button event handling using esp-iot-solution's button component
|
|
- Visual feedback using esp-iot-solution's LED indicator component
|
|
|
|
## How to Use Example
|
|
|
|
This example has been tested on an `ESP32-C3-DevKitM-1U` board. However, it can be adapted to any ESP32-based board with at least six available GPIO pins by adjusting the configuration options.
|
|
|
|
### Hardware Required
|
|
|
|
* An ESP32-based development board
|
|
* 2 relays connected to GPIO pins (default: GPIO4, GPIO5)
|
|
* 3 buttons connected to GPIO pins:
|
|
- UP button (default: GPIO0)
|
|
- DOWN button (default: GPIO1)
|
|
- STOP button (default: GPIO2)
|
|
- SELECT button (default: GPIO3)
|
|
* LED indicators for status indication of each channel (default: GPIO4, GPIO10 and GPIO9 respectively)
|
|
|
|
#### Hardware Schematic
|
|
|
|
Relay blocks are ommitted for simplicity. You can refer to schematic of the [Single-channel example](/examples/relay_chn_single/README.md) for a fully implemented relay block.
|
|
|
|
> [!NOTE]
|
|
> A single relay channel consists of two relay block and two GPIO pins.
|
|
|
|

|
|
|
|
### Configuration
|
|
|
|
The example can be configured through `menuconfig` under "Relay Channel Multi Example Configuration":
|
|
|
|
1. Button active level (`EXAMPLE_RLCHN_BTN_ACTIVE_LEVEL`)
|
|
- Select between active LOW or HIGH logic level for buttons
|
|
|
|
2. GPIO assignments:
|
|
- UP button pin (`EXAMPLE_RLCHN_BTN_UP_IO_NUM`, default: 0)
|
|
- DOWN button pin (`EXAMPLE_RLCHN_BTN_DOWN_IO_NUM`, default: 1)
|
|
- STOP button pin (`EXAMPLE_RLCHN_BTN_STOP_IO_NUM`, default: 2)
|
|
- SELECT button pin (`EXAMPLE_RLCHN_BTN_SELECT_IO_NUM`, default: 3)
|
|
- LED indicator pin (`EXAMPLE_RLCHN_LED_INDICATOR1_IO_NUM`, default: 4)
|
|
- LED indicator pin (`EXAMPLE_RLCHN_LED_INDICATOR2_IO_NUM`, default: 10)
|
|
- LED indicator pin (`EXAMPLE_RLCHN_LED_INDICATOR3_IO_NUM`, default: 9)
|
|
|
|
3. Long press timing:
|
|
- `EXAMPLE_RLCHN_BTN_LONG_PRESS_TIME_MS`: Duration for long press actions (1500-3000ms, default: 2000ms)
|
|
|
|
### Button Operations
|
|
|
|
The example uses esp-iot-solution's `button` component to handle the following operations:
|
|
|
|
- **UP button**:
|
|
* Short press: Start forward movement
|
|
* Long press: Start forward tilt (stops on release)
|
|
|
|
- **DOWN button**:
|
|
* Short press: Start reverse movement
|
|
* Long press: Start reverse tilt (stops on release)
|
|
|
|
- **STOP button**:
|
|
* Short press: Stop movement
|
|
* Long press: Flip movement direction
|
|
|
|
- **SELECT button**:
|
|
* Short press: Selects a channel to operate
|
|
* Long press: Selects all channels to operate in batch
|
|
|
|
### LED Indicator States
|
|
|
|
The example uses esp-iot-solution's `led_indicator` component to show different states:
|
|
|
|
- **Running**: LED blinks at 300ms on, 100ms off
|
|
- **Tilting**: Fast blink at 100ms on, 50ms off
|
|
- **Operation Success**: Two quick blinks
|
|
- **Operation Fail**: One long blink
|
|
|
|
### Dependencies
|
|
|
|
This example requires:
|
|
- ESP-IDF v4.1 or later
|
|
- esp-iot-solution components:
|
|
* button v4.1.1 or later
|
|
* led_indicator v1.1.1 or later
|
|
- relay_chn component
|
|
|
|
## Example Output
|
|
|
|
When the application boots, it will wait for a button event. Then ta state listener will print state changes.
|
|
|
|
```log
|
|
I (269) main_task: Calling app_main()
|
|
I (269) RELAY_CHN_MULTI_EXAMPLE: Initializing relay channel
|
|
I (279) gpio: GPIO[18]| InputEn: 0| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0
|
|
I (279) gpio: GPIO[19]| InputEn: 0| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0
|
|
I (289) gpio: GPIO[5]| InputEn: 0| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0
|
|
I (299) gpio: GPIO[6]| InputEn: 0| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0
|
|
I (309) gpio: GPIO[7]| InputEn: 0| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0
|
|
I (319) gpio: GPIO[8]| InputEn: 0| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0
|
|
I (329) RELAY_CHN_MULTI_EXAMPLE: Initializing buttons
|
|
I (329) RELAY_CHN_MULTI_EXAMPLE: Initializing buttons with active level: 0
|
|
I (339) gpio: GPIO[0]| InputEn: 1| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0
|
|
I (339) button: IoT Button Version: 4.1.3
|
|
I (349) gpio: GPIO[1]| InputEn: 1| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0
|
|
I (359) gpio: GPIO[2]| InputEn: 1| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0
|
|
I (359) gpio: GPIO[3]| InputEn: 1| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0
|
|
I (369) RELAY_CHN_MULTI_EXAMPLE: Setting up button callbacks. Configured long press time: 2000 ms
|
|
I (379) RELAY_CHN_MULTI_EXAMPLE: Initializing LED indicator
|
|
I (389) gpio: GPIO[4]| InputEn: 0| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0
|
|
I (389) led_indicator: LED Indicator Version: 1.1.1
|
|
I (399) gpio: GPIO[4]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 0| Pulldown: 0| Intr:0
|
|
I (409) led_indicator: Indicator create successfully. type:GPIO mode, hardware_data:0x3fc96498, blink_lists:custom
|
|
I (419) gpio: GPIO[10]| InputEn: 0| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0
|
|
I (429) led_indicator: LED Indicator Version: 1.1.1
|
|
I (429) gpio: GPIO[10]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 0| Pulldown: 0| Intr:0
|
|
I (439) led_indicator: Indicator create successfully. type:GPIO mode, hardware_data:0x3fc965a4, blink_lists:custom
|
|
I (449) gpio: GPIO[9]| InputEn: 0| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0
|
|
I (459) led_indicator: LED Indicator Version: 1.1.1
|
|
I (459) gpio: GPIO[9]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 0| Pulldown: 0| Intr:0
|
|
I (469) led_indicator: Indicator create successfully. type:GPIO mode, hardware_data:0x3fc966b0, blink_lists:custom
|
|
I (479) RELAY_CHN_MULTI_EXAMPLE: Relay Channel Multi Example is ready to operate
|
|
I (489) main_task: Returned from app_main()
|
|
I (3759) RELAY_CHN_MULTI_EXAMPLE: example_event_listener: State change for #0, from IDLE to FORWARD
|
|
I (6639) RELAY_CHN_MULTI_EXAMPLE: example_event_listener: State change for #0, from FORWARD to STOPPED
|
|
I (7439) RELAY_CHN_MULTI_EXAMPLE: example_event_listener: State change for #0, from STOPPED to IDLE
|
|
I (7439) RELAY_CHN_MULTI_EXAMPLE: example_event_listener: State change for #0, from IDLE to TILT_FORWARD
|
|
I (8119) RELAY_CHN_MULTI_EXAMPLE: example_event_listener: State change for #0, from TILT_FORWARD to IDLE
|
|
I (13579) RELAY_CHN_MULTI_EXAMPLE: example_event_listener: State change for #0, from IDLE to TILT_REVERSE
|
|
I (14419) RELAY_CHN_MULTI_EXAMPLE: example_event_listener: State change for #0, from TILT_REVERSE to IDLE
|
|
I (20319) RELAY_CHN_MULTI_EXAMPLE: Selected channel: 1
|
|
I (21479) RELAY_CHN_MULTI_EXAMPLE: Selected channel: 2
|
|
I (22229) RELAY_CHN_MULTI_EXAMPLE: Selected channel: 0
|
|
I (23169) RELAY_CHN_MULTI_EXAMPLE: Selected channel: 1
|
|
I (29039) RELAY_CHN_MULTI_EXAMPLE: Selected all channels
|
|
I (35419) RELAY_CHN_MULTI_EXAMPLE: example_event_listener: State change for #0, from IDLE to FORWARD
|
|
I (35419) RELAY_CHN_MULTI_EXAMPLE: example_event_listener: State change for #1, from IDLE to FORWARD
|
|
I (35419) RELAY_CHN_MULTI_EXAMPLE: example_event_listener: State change for #2, from IDLE to FORWARD
|
|
I (39349) RELAY_CHN_MULTI_EXAMPLE: example_event_listener: State change for #0, from FORWARD to STOPPED
|
|
I (39349) RELAY_CHN_MULTI_EXAMPLE: example_event_listener: State change for #1, from FORWARD to STOPPED
|
|
I (39359) RELAY_CHN_MULTI_EXAMPLE: example_event_listener: State change for #2, from FORWARD to STOPPED
|
|
I (40149) RELAY_CHN_MULTI_EXAMPLE: example_event_listener: State change for #0, from STOPPED to IDLE
|
|
I (40149) RELAY_CHN_MULTI_EXAMPLE: example_event_listener: State change for #0, from IDLE to TILT_FORWARD
|
|
I (40159) RELAY_CHN_MULTI_EXAMPLE: example_event_listener: State change for #1, from STOPPED to IDLE
|
|
I (40169) RELAY_CHN_MULTI_EXAMPLE: example_event_listener: State change for #1, from IDLE to TILT_FORWARD
|
|
I (40179) RELAY_CHN_MULTI_EXAMPLE: example_event_listener: State change for #2, from STOPPED to IDLE
|
|
I (40189) RELAY_CHN_MULTI_EXAMPLE: example_event_listener: State change for #2, from IDLE to TILT_FORWARD
|
|
I (41699) RELAY_CHN_MULTI_EXAMPLE: example_event_listener: State change for #0, from TILT_FORWARD to IDLE
|
|
I (41699) RELAY_CHN_MULTI_EXAMPLE: example_event_listener: State change for #1, from TILT_FORWARD to IDLE
|
|
I (41709) RELAY_CHN_MULTI_EXAMPLE: example_event_listener: State change for #2, from TILT_FORWARD to IDLE
|
|
I (64129) RELAY_CHN_MULTI_EXAMPLE: example_event_listener: State change for #0, from IDLE to TILT_REVERSE
|
|
I (64129) RELAY_CHN_MULTI_EXAMPLE: example_event_listener: State change for #1, from IDLE to TILT_REVERSE
|
|
I (64139) RELAY_CHN_MULTI_EXAMPLE: example_event_listener: State change for #2, from IDLE to TILT_REVERSE
|
|
I (68929) RELAY_CHN_MULTI_EXAMPLE: example_event_listener: State change for #0, from TILT_REVERSE to IDLE
|
|
I (68929) RELAY_CHN_MULTI_EXAMPLE: example_event_listener: State change for #1, from TILT_REVERSE to IDLE
|
|
I (68939) RELAY_CHN_MULTI_EXAMPLE: example_event_listener: State change for #2, from TILT_REVERSE to IDLE
|
|
I (280109) RELAY_CHN_MULTI_EXAMPLE: example_event_listener: State change for #0, from IDLE to FORWARD
|
|
I (280109) RELAY_CHN_MULTI_EXAMPLE: example_event_listener: State change for #1, from IDLE to FORWARD
|
|
I (280109) RELAY_CHN_MULTI_EXAMPLE: example_event_listener: State change for #2, from IDLE to FORWARD
|
|
I (283219) RELAY_CHN_MULTI_EXAMPLE: example_event_listener: State change for #0, from FORWARD to STOPPED
|
|
I (283219) RELAY_CHN_MULTI_EXAMPLE: example_event_listener: State change for #0, from STOPPED to REVERSE_PENDING
|
|
I (283229) RELAY_CHN_MULTI_EXAMPLE: example_event_listener: State change for #1, from FORWARD to STOPPED
|
|
I (283239) RELAY_CHN_MULTI_EXAMPLE: example_event_listener: State change for #1, from STOPPED to REVERSE_PENDING
|
|
I (283249) RELAY_CHN_MULTI_EXAMPLE: example_event_listener: State change for #2, from FORWARD to STOPPED
|
|
I (283259) RELAY_CHN_MULTI_EXAMPLE: example_event_listener: State change for #2, from STOPPED to REVERSE_PENDING
|
|
I (284019) RELAY_CHN_MULTI_EXAMPLE: example_event_listener: State change for #0, from REVERSE_PENDING to REVERSE
|
|
I (284019) RELAY_CHN_MULTI_EXAMPLE: example_event_listener: State change for #1, from REVERSE_PENDING to REVERSE
|
|
I (284029) RELAY_CHN_MULTI_EXAMPLE: example_event_listener: State change for #2, from REVERSE_PENDING to REVERSE
|
|
``` |