# Relay This component is designed to provide an abstraction layer for controlling relays on ESP32-based systems using ESP-IDF. It includes flexible functions to manage Normally Open (NO) and Normally Closed (NC) relays, time-based control, and automatic scheduling of relay operations. ## Features - **Relay Types**: Supports Normally Open (NO) and Normally Closed (NC) configurations. - **Timed Control**: Allows for precise relay control, including scheduled on/off operations. - **Automatic Shutdown**: Functions to activate the relay and automatically turn it off after a specified duration. ## Installation To install this component, use the ESP-IDF Component Manager. Add the following to your `idf_component.yml` in your main project folder: ```yaml dependencies: relay: "1.0.0" # Replace with the desired version ``` Then, in your project directory, run: ```bash idf.py add-dependency ``` This command will download and add the component to your ESP-IDF project. ## Usage After including the component in your project, include the header file `relay.h` in your source files. Initialize and control your relay by following the steps below. ### Initialization To initialize the relay, use `relay_init`. Specify the GPIO pin, relay type (NO or NC), and initial state (on or off). ```c #include "relay.h" Relay my_relay; void app_main(void) { // Initialize the relay as Normally Open (NO), starting in the "off" state relay_init(&my_relay, RELAY_PIN, RELAY_NO, 0); } ``` ### Basic Control #### Turning the Relay On and Off Use `relay_turn_on` and `relay_turn_off` to manually control the relay. ```c // Turn the relay on relay_turn_on(&my_relay); // Turn the relay off relay_turn_off(&my_relay); ``` #### Checking Relay Status To get the current state of the relay, use `relay_get_status`. This function returns `1` if the relay is on and `0` if it is off. ```c int status = relay_get_status(&my_relay); ``` ### Timed Control #### Delayed Turn On and Off The functions `relay_turn_on_after` and `relay_turn_off_after` allow for delayed activation or deactivation of the relay. ```c // Turn on the relay after 3 seconds relay_turn_on_after(&my_relay, 3000); // Delay in milliseconds // Turn off the relay after 5 seconds relay_turn_off_after(&my_relay, 5000); // Delay in milliseconds ``` #### Pulse Control The `relay_pulse` function turns on the relay for a specified duration, then automatically turns it off. ```c // Turn on the relay for 5 seconds, then turn it off automatically relay_pulse(&my_relay, 5000); // Duration in milliseconds ``` #### Turn On and Turn Off Automatically After a Duration To immediately turn on the relay and automatically turn it off after a set duration, use `relay_turn_on_and_turn_off_after`. ```c // Immediately turn on the relay and turn it off after 7 seconds relay_turn_on_and_turn_off_after(&my_relay, 7000); // Duration in milliseconds ``` ### Full Example Here's a full example of using the relay component in an ESP-IDF project. ```c #include <stdio.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "relay.h" #include "esp_log.h" #define RELAY_PIN 18 // GPIO pin connected to the relay static const char *TAG = "RelayExample"; void app_main(void) { ESP_LOGI(TAG, "Initializing relay example..."); // Initialize the relay as Normally Open, initially off Relay my_relay; relay_init(&my_relay, RELAY_PIN, RELAY_NO, 0); // Example 1: Turn the relay on immediately ESP_LOGI(TAG, "Turning relay on immediately..."); relay_turn_on(&my_relay); vTaskDelay(pdMS_TO_TICKS(2000)); // Wait 2 seconds // Example 2: Schedule the relay to turn off after 3 seconds ESP_LOGI(TAG, "Scheduling relay to turn off after 3 seconds..."); relay_turn_off_after(&my_relay, 3000); vTaskDelay(pdMS_TO_TICKS(4000)); // Wait 4 seconds to observe // Example 3: Pulse the relay for 5 seconds ESP_LOGI(TAG, "Pulsing relay for 5 seconds..."); relay_pulse(&my_relay, 5000); vTaskDelay(pdMS_TO_TICKS(6000)); // Wait 6 seconds to observe // Example 4: Turn the relay on and automatically turn off after 7 seconds ESP_LOGI(TAG, "Turning relay on and scheduling it to turn off after 7 seconds..."); relay_turn_on_and_turn_off_after(&my_relay, 7000); vTaskDelay(pdMS_TO_TICKS(8000)); // Wait 8 seconds to observe ESP_LOGI(TAG, "Relay example complete."); } ``` ## License This component is licensed under the Apache-2.0 license. See [license.txt](license.txt) for details.
e911f0c5604ba606a0563c6d43e5fd8d1ed3a275
idf.py add-dependency "fbseletronica/relay^1.0.1"