Pico Led Controller 1.0.3
A project to control LEDs using Raspberry Pi Pico W
ws2812b.c
Go to the documentation of this file.
1 #include "ws2812b.h"
2 
3 #include <stdlib.h>
4 #include <time.h>
5 
6 #include "urgb.h"
7 #include "hsv.h"
8 #include "generated/ws2812.pio.h"
9 
10 static inline void put_pixel(uint32_t pixel_grb)
11 {
12  pio_sm_put_blocking(pio0, 0, pixel_grb << 8u);
13 }
14 
15 void set_all_leds(uint32_t color, uint32_t len)
16 {
17  for (uint32_t i = 0; i < len; ++i)
18  {
19  put_pixel(color);
20  }
21 }
22 
23 void turn_off_all(uint32_t len)
24 {
25  uint32_t off = URGB(0, 0, 0);
26  set_all_leds(off, len);
27 }
28 
29 
30 uint32_t get_red(uint8_t brightness)
31 {
32  return URGB(brightness, 0, 0);
33 }
34 
35 uint32_t get_green(uint8_t brightness)
36 {
37  return URGB(0, brightness, 0);
38 }
39 
40 uint32_t get_blue(uint8_t brightness)
41 {
42  return URGB(0, 0, brightness);
43 }
44 
45 uint32_t get_white(uint8_t brightness)
46 {
47  return URGB(brightness, brightness, brightness);
48 }
49 
50 uint32_t get_purple(uint8_t brightness)
51 {
52  return URGB(brightness * 3 / 4, 0, brightness);
53 }
54 
55 uint32_t get_yellow(uint8_t brightness)
56 {
57  return URGB(brightness, brightness, 0);
58 }
59 
60 uint32_t get_cyan(uint8_t brightness)
61 {
62  return URGB(0, brightness, brightness);
63 }
64 
65 uint32_t get_orange(uint8_t brightness)
66 {
67  return URGB(brightness, brightness / 3, 0);
68 }
69 
70 uint32_t get_pink(uint8_t brightness)
71 {
72  return URGB(brightness, brightness / 3, brightness / 3);
73 }
74 
75 uint32_t get_turquoise(uint8_t brightness)
76 {
77  return URGB(brightness / 3, brightness * 2 / 3, brightness);
78 }
79 
80 uint32_t get_magenta(uint8_t brightness)
81 {
82  return URGB(brightness, 0, brightness);
83 }
84 
85 void set_all_red(uint32_t len, uint8_t brightness)
86 {
87  uint32_t red = URGB(brightness, 0, 0);
88  set_all_leds(red, len);
89 }
90 
91 void set_all_green(uint32_t len, uint8_t brightness)
92 {
93  uint32_t green = URGB(0, brightness, 0);
94  set_all_leds(green, len);
95 }
96 
97 void set_all_blue(uint32_t len, uint8_t brightness)
98 {
99  uint32_t blue = URGB(0, 0, brightness);
100  set_all_leds(blue, len);
101 }
102 
103 void set_all_white(uint32_t len, uint8_t brightness)
104 {
105  uint32_t white = URGB(brightness, brightness, brightness);
106  set_all_leds(white, len);
107 }
108 
109 void set_all_purple(uint32_t len, uint8_t brightness)
110 {
111  uint32_t purple = URGB(brightness * 3 / 4, 0, brightness);
112  set_all_leds(purple, len);
113 }
114 
115 void set_all_yellow(uint32_t len, uint8_t brightness)
116 {
117  uint32_t yellow = URGB(brightness, brightness, 0);
118  set_all_leds(yellow, len);
119 }
120 
121 void set_all_cyan(uint32_t len, uint8_t brightness)
122 {
123  uint32_t cyan = URGB(0, brightness, brightness);
124  set_all_leds(cyan, len);
125 }
126 
127 void set_all_orange(uint32_t len, uint8_t brightness)
128 {
129  uint32_t orange = URGB(brightness, brightness / 3, 0);
130  set_all_leds(orange, len);
131 }
132 
133 void set_all_pink(uint32_t len, uint8_t brightness)
134 {
135  uint32_t pink = URGB(brightness, brightness / 3, brightness / 3);
136  set_all_leds(pink, len);
137 }
138 
139 void set_all_turquoise(uint32_t len, uint8_t brightness)
140 {
141  uint32_t turquoise = URGB(brightness / 3, brightness * 2 / 3, brightness);
142  set_all_leds(turquoise, len);
143 }
144 
145 void set_all_magenta(uint32_t len, uint8_t brightness)
146 {
147  uint32_t magenta = URGB(brightness, 0, brightness);
148  set_all_leds(magenta, len);
149 }
150 
151 void set_rainbow_spectrum(uint32_t len)
152 {
153  for (uint32_t i = 0; i < len; ++i)
154  {
155  uint32_t color = hsv_to_rgb(i * 360 / len, 255, 255);
156  put_pixel(color);
157  }
158 }
159 
160 void apply_rainbow_wheel_effect(uint32_t len, uint16_t* base_hue, uint8_t* speed_factor, uint8_t* density_factor, volatile uint8_t* brightness)
161 {
162  for (uint32_t i = 0; i < len; ++i)
163  {
164  uint16_t hue = (*base_hue + i * 360 / len * *density_factor) % 360;
165  uint32_t color = hsv_to_rgb(hue, 255, *brightness);
166  put_pixel(color);
167  hue++;
168  }
169  *speed_factor = rand() % 3 + 6; // 6, 7, 8
170  *base_hue += *speed_factor;
171  *base_hue %= 360;
172 }
173 
174 void apply_rainbow_cycle_effect(uint32_t len, uint16_t* hue, uint8_t* speed_factor, volatile uint8_t* brightness)
175 {
176  for (uint32_t i = 0; i < len; ++i)
177  {
178  uint32_t color = hsv_to_rgb(*hue, 255, *brightness);
179  put_pixel(color);
180  }
181  *hue += *speed_factor;
182 }
183 
184 void apply_breathing_effect(uint32_t len, uint8_t* speed_factor, uint32_t* color, volatile uint8_t* base_brightness, uint8_t* brightness, bool* breathing_up)
185 {
186  uint8_t min_brightness = 15;
187  uint8_t max_brightness = *base_brightness;
188  if (max_brightness < min_brightness)
189  max_brightness = min_brightness;
190  for (uint32_t i = 0; i < len; ++i)
191  {
192  uint8_t r = URGB_R(*color);
193  uint8_t g = URGB_G(*color);
194  uint8_t b = URGB_B(*color);
195  uint32_t color = URGB(r * *brightness / 255, g * *brightness / 255, b * *brightness / 255);
196  put_pixel(color);
197  }
198  if (*brightness >= max_brightness)
199  {
200  *breathing_up = false;
201  *brightness = max_brightness;
202  }
203  else if (*brightness <= min_brightness)
204  {
205  *breathing_up = true;
206  *brightness = min_brightness;
207  }
208  if (*breathing_up)
209  *brightness += *speed_factor;
210  else
211  *brightness -= *speed_factor;
212 }
213 
214 void apply_flashing_effect(uint32_t len, uint32_t* color)
215 {
216  srand(time(NULL));
217  int num_led_flash = 10;
218  int *random_indices = (int *)malloc(num_led_flash * sizeof(int));
219  for (int i = 0; i < num_led_flash; ++i)
220  random_indices[i] = rand() % len;
221  int leds_handled = 0;
222  while (leds_handled < len)
223  {
224  int i = 0;
225  if (random_indices[i] == leds_handled)
226  {
227  uint32_t new_color;
228  if (!color)
229  new_color = URGB(rand() % 256, rand() % 256, rand() % 256);
230  else
231  {
232  uint8_t r = URGB_R(*color);
233  uint8_t g = URGB_G(*color);
234  uint8_t b = URGB_B(*color);
235  new_color = URGB(r, g, b);
236  }
237  put_pixel(new_color);
238  i++;
239  if (i >= num_led_flash)
240  break;
241  }
242  else
243  put_pixel(0);
244  leds_handled++;
245  }
246 }
uint32_t hsv_to_rgb(uint16_t h, uint8_t s, uint8_t v)
Convert HSV to RGB.
Definition: hsv.c:5
#define URGB_B(color)
Definition: urgb.h:9
#define URGB_R(color)
Definition: urgb.h:7
#define URGB(r, g, b)
Definition: urgb.h:6
#define URGB_G(color)
Definition: urgb.h:8
void apply_flashing_effect(uint32_t len, uint32_t *color)
Apply flashing effect.
Definition: ws2812b.c:214
uint32_t get_purple(uint8_t brightness)
Get purple color.
Definition: ws2812b.c:50
uint32_t get_yellow(uint8_t brightness)
Get yellow color.
Definition: ws2812b.c:55
void set_all_cyan(uint32_t len, uint8_t brightness)
Set all leds cyan.
Definition: ws2812b.c:121
void apply_breathing_effect(uint32_t len, uint8_t *speed_factor, uint32_t *color, volatile uint8_t *base_brightness, uint8_t *brightness, bool *breathing_up)
Apply breathing effect.
Definition: ws2812b.c:184
uint32_t get_red(uint8_t brightness)
Get red color.
Definition: ws2812b.c:30
void set_all_orange(uint32_t len, uint8_t brightness)
Set all leds orange.
Definition: ws2812b.c:127
void set_all_pink(uint32_t len, uint8_t brightness)
Set all leds pink.
Definition: ws2812b.c:133
void turn_off_all(uint32_t len)
Turn off all leds.
Definition: ws2812b.c:23
uint32_t get_white(uint8_t brightness)
Get white color.
Definition: ws2812b.c:45
void set_all_blue(uint32_t len, uint8_t brightness)
Set all leds to blue.
Definition: ws2812b.c:97
void set_all_turquoise(uint32_t len, uint8_t brightness)
Set all leds turquoise.
Definition: ws2812b.c:139
uint32_t get_green(uint8_t brightness)
Get green color.
Definition: ws2812b.c:35
void set_all_magenta(uint32_t len, uint8_t brightness)
Set all leds magenta.
Definition: ws2812b.c:145
void set_all_white(uint32_t len, uint8_t brightness)
Set all leds to white.
Definition: ws2812b.c:103
void set_all_yellow(uint32_t len, uint8_t brightness)
Set all leds yellow.
Definition: ws2812b.c:115
void apply_rainbow_wheel_effect(uint32_t len, uint16_t *base_hue, uint8_t *speed_factor, uint8_t *density_factor, volatile uint8_t *brightness)
Apply rainbow wheel effect.
Definition: ws2812b.c:160
uint32_t get_pink(uint8_t brightness)
Get pink color.
Definition: ws2812b.c:70
uint32_t get_blue(uint8_t brightness)
Get blue color.
Definition: ws2812b.c:40
uint32_t get_cyan(uint8_t brightness)
Get cyan color.
Definition: ws2812b.c:60
void set_all_green(uint32_t len, uint8_t brightness)
Set all leds to green.
Definition: ws2812b.c:91
uint32_t get_orange(uint8_t brightness)
Get orange color.
Definition: ws2812b.c:65
void set_all_red(uint32_t len, uint8_t brightness)
Set all leds to red.
Definition: ws2812b.c:85
uint32_t get_magenta(uint8_t brightness)
Get magenta color.
Definition: ws2812b.c:80
void set_rainbow_spectrum(uint32_t len)
Set all leds to rainbow spectrum.
Definition: ws2812b.c:151
uint32_t get_turquoise(uint8_t brightness)
Get turquoise color.
Definition: ws2812b.c:75
void set_all_leds(uint32_t color, uint32_t len)
Set all leds to the same color.
Definition: ws2812b.c:15
void apply_rainbow_cycle_effect(uint32_t len, uint16_t *hue, uint8_t *speed_factor, volatile uint8_t *brightness)
Apply rainbow cycle effect.
Definition: ws2812b.c:174
void set_all_purple(uint32_t len, uint8_t brightness)
Set all leds purple.
Definition: ws2812b.c:109
static void put_pixel(uint32_t pixel_grb)
Definition: ws2812b.c:10