Pico Led Controller 1.0.3
A project to control LEDs using Raspberry Pi Pico W
Loading...
Searching...
No Matches
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
10static inline void put_pixel(uint32_t pixel_grb)
11{
12 pio_sm_put_blocking(pio0, 0, pixel_grb << 8u);
13}
14
15void 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
23void turn_off_all(uint32_t len)
24{
25 uint32_t off = URGB(0, 0, 0);
26 set_all_leds(off, len);
27}
28
29
30uint32_t get_red(uint8_t brightness)
31{
32 return URGB(brightness, 0, 0);
33}
34
35uint32_t get_green(uint8_t brightness)
36{
37 return URGB(0, brightness, 0);
38}
39
40uint32_t get_blue(uint8_t brightness)
41{
42 return URGB(0, 0, brightness);
43}
44
45uint32_t get_white(uint8_t brightness)
46{
47 return URGB(brightness, brightness, brightness);
48}
49
50uint32_t get_purple(uint8_t brightness)
51{
52 return URGB(brightness * 3 / 4, 0, brightness);
53}
54
55uint32_t get_yellow(uint8_t brightness)
56{
57 return URGB(brightness, brightness, 0);
58}
59
60uint32_t get_cyan(uint8_t brightness)
61{
62 return URGB(0, brightness, brightness);
63}
64
65uint32_t get_orange(uint8_t brightness)
66{
67 return URGB(brightness, brightness / 3, 0);
68}
69
70uint32_t get_pink(uint8_t brightness)
71{
72 return URGB(brightness, brightness / 3, brightness / 3);
73}
74
75uint32_t get_turquoise(uint8_t brightness)
76{
77 return URGB(brightness / 3, brightness * 2 / 3, brightness);
78}
79
80uint32_t get_magenta(uint8_t brightness)
81{
82 return URGB(brightness, 0, brightness);
83}
84
85void 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
91void 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
97void 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
103void 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
109void 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
115void 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
121void 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
127void 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
133void 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
139void 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
145void 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
151void 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
160void 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
174void 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
184void 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
214void 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