Tiny-WS2812  1.0.0
A tiny cross-platform WS2812 LED Strip driver
Macros | Functions
blink_array.c File Reference

Blinks one or more WS2812 devices using a RGB array. More...

#include <avr/io.h>
#include <util/delay.h>
#include <ws2812.h>
Include dependency graph for blink_array.c:

Go to the source code of this file.

Macros

#define N_LEDS   8
 Number of LEDs on your WS2812 device(s)
 
#define DATA_PINS_PORT   PORTB
 Port register used to communicate with the WS2812 device(s)
 
#define DATA_PINS_DDR   DDRB
 Data direction register of the pin(s) used to communicate with the WS2812 device(s)
 
#define DATA_PINS   {PB0, PB1}
 Pin(s) used to communicate with the WS2812 device(s)
 
#define RESET_TIME   50
 Reset time in microseconds (50us recommended by datasheet)
 
#define COLOR_ORDER   grb
 Color order of your WS2812 LEDs (Typically grb or rgb)
 

Functions

int main ()
 

Detailed Description

Blinks one or more WS2812 devices using a RGB array.

Author
Patrick Pedersen
Date
2021-04-09

The following example showcases how the Tiny-WS2812 library can be used on AVR platforms to blink an entire WS2812 device in white. In this rather memory expensive example, we achieve this by simply creating a rgb array equal to the number of LEDs on the WS2812 device, whose values we then transmit to the device using the ws2812_tx() function.

For a more memory efficient method, take a look at the blink_loop.c example.

Note
Please ensure that the WS2812_TARGET_PLATFORM_AVR macro is defined during compilation. This can either be done by specifying -DWS2812_TARGET_PLATFORM_AVR in the build flags, or by uncommenting the define WS2812_TARGET_PLATFORM_AVR directive below.

Definition in file blink_array.c.

Function Documentation

◆ main()

int main ( )

Blinks one or more WS2812 device(s)

Definition at line 59 of file blink_array.c.

60 {
61  uint8_t pins[] = DATA_PINS; // Data pins
62  ws2812_rgb leds[N_LEDS]; // RGB array which represents the LEDs
63  ws2812_cfg cfg; // Device configurationn
64  ws2812 ws2812_dev; // Device struct
65 
66  // Configure the WS2812 device struct
67  cfg.port = &DATA_PINS_PORT;
68  cfg.ddr = &DATA_PINS_DDR;
69  cfg.pins = pins;
70  cfg.n_dev = sizeof(pins); // Number of devices driven by this struct
71  cfg.rst_time_us = RESET_TIME;
72  cfg.order = grb;
73 
74  if (ws2812_config(&ws2812_dev, &cfg) != 0) {
75  // HANDLE ERROR...
76  void;
77  };
78 
79  // Blink device
80  while (1) {
81  // Program all LEDs to white
82  for (unsigned int i = 0; i < N_LEDS; i++) {
83  leds[i].r = 255;
84  leds[i].g = 255;
85  leds[i].b = 255;
86  }
87 
88  ws2812_prep_tx(&ws2812_dev); // Prepare to transmit data
89  ws2812_tx(&ws2812_dev, leds, N_LEDS); // Transmit array of rgb values to the device
90  ws2812_close_tx(&ws2812_dev); // Close transmission
91 
92  // Wait 500ms
93  _delay_ms(500);
94 
95  // Program all LEDs to black (off)
96  for (unsigned int i = 0; i < N_LEDS; i++) {
97  leds[i].r = 0;
98  leds[i].g = 0;
99  leds[i].b = 0;
100  }
101 
102  ws2812_prep_tx(&ws2812_dev); // Prepare to transmit data
103  ws2812_tx(&ws2812_dev, leds, N_LEDS); // Transmit array of rgb values to the device
104  ws2812_close_tx(&ws2812_dev); // Close transmission
105 
106  // Wait 500ms
107  _delay_ms(500);
108  }
109 
110  return 0;
111 }
ALL PLATFORMS: Data structure to configure a WS2812 device struct.
Definition: ws2812_avr.h:64
volatile uint8_t * ddr
Data Direction Register (ex. DDRB, DDRC, DDRD...)
Definition: ws2812_avr.h:68
uint8_t n_dev
Number of WS2812 device to drive.
Definition: ws2812_avr.h:78
volatile uint8_t * port
PORT Register (ex. PORTB, PORTC, PORTD...)
Definition: ws2812_avr.h:67
uint8_t rst_time_us
Time required for the WS2812 device(s) to reset in us.
Definition: ws2812_avr.h:76
ws2812_order order
CoColor order of the WS2812 device(s) (ex. rgb, grb, bgr...)
Definition: ws2812_avr.h:77
uint8_t * pins
Array of pins used to program WS2812 devices (Must share the same PORT! (ex. PB0, PB1,...
Definition: ws2812_avr.h:69
Data structure to hold RGB color values.
Definition: ws2812_common.h:67
ALL PLATFORMS: WS2812 device struct to drive one or more WS2812 devices.
Definition: ws2812_avr.h:107
void ws2812_close_tx(ws2812 *dev)
Closes a WS2812 transmission.
Definition: ws2812_avr.c:275
uint8_t ws2812_config(ws2812 *dev, ws2812_cfg *cfg)
Configures a WS2812 device struct.
Definition: ws2812_avr.c:126
void ws2812_prep_tx(ws2812 *dev)
Prepares the host device for data transmission.
Definition: ws2812_avr.c:159
void ws2812_tx(ws2812 *dev, ws2812_rgb *leds, size_t n_leds)
Transmits RGB values to the provided WS2812 device.
Definition: ws2812_avr.c:264