-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSamLightLib.cpp
More file actions
205 lines (167 loc) · 5.38 KB
/
Copy pathSamLightLib.cpp
File metadata and controls
205 lines (167 loc) · 5.38 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
#include "SamLightLib.h"
#include <FastLED.h>
// Constructor
LightLib::LightLib(int ledPin, int numLeds) {
_ledPin = ledPin;
_numLeds = numLeds;
// Allocate memory for the LEDs array
_leds = new CRGB[_numLeds];
// Initialize the LED strip
FastLED.addLeds<WS2811, GRB>(_leds, _numLeds);
}
/*
This method will set all lights to a desired color.
parameters:
red (int): red RGB value
green (int): green RGB value
blue (int): blue RGB value
returns:
void
*/
void LightLib::SetColor(int red, int green, int blue) {
fill_solid(_leds, _numLeds, CRGB(red, green, blue));
FastLED.show();
}
/*
This method will loop though the string of lights and change the color
parameters:
pulse (int): delay between changing each LED color
red (int): red RGB value
green (int): green RGB value
blue (int): blue RGB value
returns:
void
*/
void LightLib::ColorClimbUp(int pulse, int red, int green, int blue) {
// loop through leds
for(int place = 0; place <= _numLeds; place++) {
// change led color
_leds[place] = CRGB(green, red, blue);
FastLED.show();
// wait before moving onto the next light
delay(pulse);
}
}
/*
This method will loop backwards though the string of lights and change the color
parameters:
pulse (int): delay between changing each LED color
red (int): red RGB value
green (int): green RGB value
blue (int): blue RGB value
returns:
void
*/
void LightLib::ColorClimbDown(int pulse, int red, int green, int blue) {
// loop through leds
for(int place = 0; place >= _numLeds; place--) {
// change led color
_leds[place] = CRGB(green, red, blue);
FastLED.show();
// wait before moving onto the next light
delay(pulse);
}
}
/*
This method will change the color of each led in a random order without repeating any leds.
parameters:
pulse (int): the delay between changing each led color
red (int): red RGB value
green (int): green RGB value
blue (int): blue RGB value
returns:
void
*/
void LightLib::SparkleColorChange(int pulse, int red, int green, int blue) {
// reorganize led array
int sparkleLights[_numLeds + 1];
for (int i = 0; i <= _numLeds + 1; i++) {
sparkleLights[i] = i;
}
size_t n = sizeof(sparkleLights) / sizeof(sparkleLights[0]);
for (size_t i = 0; i < n - 1; i++) {
size_t j = random(0, n - i);
int t = sparkleLights[i];
sparkleLights[i] = sparkleLights[j];
sparkleLights[j] = t;
}
// loop through reorganized led array
for(int i = 0; i <= _numLeds - 1; i++) {
int place = sparkleLights[i];
// change led color
_leds[place] = CRGB(green, red, blue);
// wait before moving onto the next light
delay(pulse);
FastLED.show();
}
}
/*
This method will break the led strip into different colored bars that move across the strip
parameters:
pulse (int): the delay between changing each led color
barWidth (int): amount of leds in each bar
repeat (int): amount of times to repeat the function
numColors (int): amount of different colored bars
colors[] (CRGB[]): color of each bar
returns:
void
*/
void LightLib::BarShift(
int pulse, int barWidth, int repeat,
int numColors, CRGB colors[]) {
// Ensure numColors is greater than 0
if (numColors < 1) return;
// Repeat x amount of times
for (int i = 0; i < repeat; i++) {
// Set the LEDs with alternating bars
for (int j = 0; j < _numLeds; j++) {
// Determine the current position in relation to the bar width
int currentPosition = (j + i) % (numColors * barWidth); // Use numColors here
// Calculate the index of the color based on the current position
int colorIndex = currentPosition / barWidth; // Determine the color section
// Set the corresponding color
_leds[j] = colors[colorIndex % numColors]; // Cycle through colors
}
FastLED.show();
// Wait before moving on to the next light
delay(pulse);
}
}
/*
This method will break the led strip into a set amount of different colors
parameters:
numColors (int): amount of different colored bars
colors[] (CRGB[]): color of each bar
returns:
void
*/
void LightLib::SetColors(int numColors, CRGB colors[]) {
// Ensure numColors does not exceed the number of LEDs
numColors = min(numColors, _numLeds);
// Calculate the number of LEDs per section
int sectionDivider = _numLeds / numColors;
// Loop through all LEDs and assign colors based on section
for (int place = 0; place < _numLeds; place++) {
// Determine the section index
int sectionIndex = place / sectionDivider;
// Use modulo to handle the case where numColors does not divide _numLeds evenly
_leds[place] = colors[sectionIndex % numColors]; // Assign the color for that section
}
FastLED.show();
}
/*
This method will change the leds to alternating colors
parameters:
numColors (int): amount of different colors
colors[] (CRGB[]): colors
returns:
void
*/
void LightLib::MixedLights(int numColors, CRGB colors[]) {
// Set colors in a loop
for (int place = 0; place < _numLeds; place++) {
// Use modulo to cycle through colors
_leds[place] = colors[place % numColors];
}
FastLED.show();
}