Newer
Older
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
#include <rgbw-strip-12bit.h>
RgbwStrip12bit::RgbwStrip12bit(uint16_t num, uint8_t clk, uint8_t data, uint8_t latch) {
this->num = num;
this->clk = clk;
this->dat = data;
this->lat = latch;
pwmBuffer = (uint16_t*) malloc(2 * 24 * num);
memset(pwmBuffer, 0, 2 * 24 * num);
}
void RgbwStrip12bit::write(void) {
digitalWrite(lat, LOW);
// 24 channels per TLC5974
for (int16_t c = 24 * num - 1; c >= 0; c--) {
// 12 bits per channel, send MSB first
for (int8_t b = 11; b >= 0; b--) {
digitalWrite(clk, LOW);
if (pwmBuffer[c] & (1 << b))
digitalWrite(dat, HIGH);
else
digitalWrite(dat, LOW);
digitalWrite(clk, HIGH);
}
}
digitalWrite(clk, LOW);
digitalWrite(lat, HIGH);
digitalWrite(lat, LOW);
}
void RgbwStrip12bit::setPWM(uint16_t channel, uint16_t pwm) {
if (pwm > 4095)
pwm = 4095;
if (channel > 24 * num)
return;
pwmBuffer[channel] = pwm;
}
void RgbwStrip12bit::setLED(uint16_t ledNum, uint16_t r, uint16_t g, uint16_t b, uint16_t w) {
if (ledNum % 6 == 2 || ledNum % 6 == 3) {
setPWM(ledNum * 4, r);
setPWM(ledNum * 4 + 1, g);
setPWM(ledNum * 4 + 2, b);
setPWM(ledNum * 4 + 3, w);
} else {
setPWM(ledNum * 4, w);
setPWM(ledNum * 4 + 1, b);
setPWM(ledNum * 4 + 2, g);
setPWM(ledNum * 4 + 3, r);
}
}
boolean RgbwStrip12bit::begin() {
if (!pwmBuffer)
return false;
pinMode(clk, OUTPUT);
pinMode(dat, OUTPUT);
pinMode(lat, OUTPUT);
digitalWrite(lat, LOW);
return true;
}