# 🟢 LED
Control LEDs or relays. A simple library with some artful gimmicks.
This library is a simple, convenient wrapper around [Circuits.GPIO](https://hexdocs.pm/circuits_gpio/)
for controlling LEDs or relays. Beyond basic on/off control, it enables artful, experimental,
and even random noise light effects through overlapping repeating patterns — offering creative flexibility.
## ✨ Features
- ⚡ Control single LEDs or relays on GPIO pins
- ✔ Easy on/off control
- ⏰ Blink and repeat patterns with configurable intervals and counts
- 💡 Toggle LED state
- 🎛️ Optional named LED processes for multiple devices
- Supports overlapping repeat patterns for creative effects
- Defaults to GPIO pin `22` with LED initially on
## Installation
Add to your `mix.exs`:
```elixir
def deps do
[
{:led, "~> 0.1.0"}
]
end
```
## 🛠 Usage
### Start an LED
* Default (gpio_pin: 22, initially on):
```elixir
{:ok, _pid} = LED.start_link()
```
* Named (gpio_pin: 23, initially off):
```elixir
{:ok, _pid} = LED.start_link(name: :green_led, gpio_pin: 23, initial_value: 0)
```
### Turn it on or off
* Default:
```elixir
LED.on()
LED.off()
```
* Named:
```elixir
LED.on(:green_led)
LED.off(:green_led)
```
### Toggle LED
```elixir
LED.toggle()
LED.toggle(:green_led)
```
### Set state directly
```elixir
LED.set(0, :green_led) # Off
LED.set(1, :green_led) # On
```
### ⏰ Blink LED
* Blink indefinitely at 2 Hz (250ms interval):
```elixir
LED.blink()
LED.blink(name: :green_led)
```
* Blink LED on default/`:green_led` 10 times, toggling every 500 ms:
```elixir
LED.blink(interval: 500, times: 10)
LED.blink(name: :green_led, interval: 500, times: 10)
```
### Repeat blinking (overlapping allowed)
* Start a repeating blink pattern on default/`:green_led` every 300 ms indefinitely:
```elixir
LED.repeat(interval: 300)
LED.repeat(name: :green_led, interval: 300)
```
* Overlay multiple blinking patterns (polyrhythmic effect):
```elixir
LED.repeat(interval: 400, times: 5)
LED.repeat(interval: 700, times: 3)
LED.repeat(name: :green_led, interval: 400, times: 5)
LED.repeat(name: :green_led, interval: 700, times: 3)
```
### Cancel blinking timers
Stop all blinking/repeating timers on default/`:green_led`:
```elixir
LED.cancel_timers()
LED.cancel_timers(:green_led)
```
> #### Note on use with relay {: .tip}
> When using a relay, check its datasheet
> for minimum switch times to avoid damage or malfunction.