Last active 1 month ago

MBI5153 / LYD6168 Panel Controller with ESP32

MBI5153.ino Raw
1// Based on https://github.com/SebiTimeWaster/ICN2053_ESP32_LedWall
2
3#define PIN_CLK 2
4#define PIN_LE 27
5#define PIN_OE 5
6#define PIN_A 21
7#define PIN_B 22
8#define PIN_C 23
9#define PIN_D 25
10#define PIN_E 26
11#define PIN_R1 14
12#define PIN_G1 15
13#define PIN_B1 16
14#define PIN_R2 17
15#define PIN_G2 18
16#define PIN_B2 19
17
18const int panelWidth = 128;
19const int numScanLines = 32;
20const int numLeds = 16;
21const int chips = panelWidth / numLeds;
22
23uint8_t pins[14] = {PIN_CLK, PIN_LE, PIN_OE, PIN_A, PIN_B, PIN_C, PIN_D, PIN_E, PIN_R1, PIN_G1, PIN_B1, PIN_R2, PIN_G2, PIN_B2};
24
25void IRAM_ATTR sendPwmClock(uint16_t clocks) {
26 while (clocks--) {
27 digitalWrite(PIN_OE, 1);
28 digitalWrite(PIN_OE, 0);
29 }
30}
31
32void IRAM_ATTR sendClock() {
33 digitalWrite(PIN_CLK, 1);
34 digitalWrite(PIN_CLK, 0);
35}
36
37void IRAM_ATTR sendLatch(uint8_t clocks) {
38 digitalWrite(PIN_LE, 0);
39 sendClock();
40 digitalWrite(PIN_LE, 1);
41 while(clocks--) {
42 sendClock();
43 }
44 digitalWrite(PIN_LE, 0);
45}
46
47void IRAM_ATTR writePixel(uint8_t rgbrgb) {
48 uint32_t k = ((uint32_t) rgbrgb) << 14;
49 GPIO.out = (GPIO.out & ~0x000FC000) | k;
50 // Same as
51 // digitalWrite(PIN_R1, v & 1);
52 // digitalWrite(PIN_G1, v & 2);
53 // digitalWrite(PIN_B1, v & 4);
54 // digitalWrite(PIN_R2, v & 8);
55 // digitalWrite(PIN_G2, v & 16);
56 // digitalWrite(PIN_B2, v & 24);
57 // but in a "single cycle"
58}
59
60void IRAM_ATTR SendPixel(uint16_t r1, uint16_t g1, uint16_t b1, uint16_t r2, uint16_t g2, uint16_t b2, uint8_t doLatch) {
61 for (int i = 0; i < 16; i++) {
62 uint16_t mask = 0x8000 >> i;
63 uint8_t r1b = (r1 & mask) > 0;
64 uint8_t r2b = (r2 & mask) > 0;
65 uint8_t g1b = (g1 & mask) > 0;
66 uint8_t g2b = (g2 & mask) > 0;
67 uint8_t b1b = (b1 & mask) > 0;
68 uint8_t b2b = (b2 & mask) > 0;
69 uint8_t rgbrgb =
70 (r1b << 0) |
71 (g1b << 1) |
72 (b1b << 2) |
73 (r2b << 3) |
74 (g2b << 4) |
75 (b2b << 5);
76
77 writePixel(rgbrgb);
78 if (i == 15 && doLatch) {
79 digitalWrite(PIN_LE, 1);
80 }
81 sendClock();
82 }
83 digitalWrite(PIN_LE, 0);
84}
85
86void sendConfiguration(uint16_t data, uint8_t latches) {
87 uint8_t num = chips;
88 uint16_t dataMask;
89
90 latches = 16 - latches;
91
92 // send config data to all chips involved (4 per 64 pixel), then latch for 1 clock
93 while(num--) {
94 for(uint8_t x = 0; x < 16; x++) {
95 dataMask = 0x8000 >> x;
96 writePixel(data & dataMask ? 0x3F : 0);
97 // Write all color channels exactly the same, which is the same as:
98 // digitalWrite(PIN_R1, data & dataMask ? 1 : 0);
99 // digitalWrite(PIN_G1, data & dataMask ? 1 : 0);
100 // digitalWrite(PIN_B1, data & dataMask ? 1 : 0);
101 // digitalWrite(PIN_R2, data & dataMask ? 1 : 0);
102 // digitalWrite(PIN_G2, data & dataMask ? 1 : 0);
103 // digitalWrite(PIN_B2, data & dataMask ? 1 : 0);
104 // but in a "single cycle"
105 if(num == 0 && x == latches) { // Latch only on the last chip
106 digitalWrite(PIN_LE, 1);
107 }
108 sendClock();
109 }
110
111 digitalWrite(PIN_LE, 0);
112 }
113}
114
115void IRAM_ATTR sendScanline(uint8_t line) {
116 delayMicroseconds(10); // Avoids ghosting...
117
118 uint32_t scanLine = 0x00000000;
119
120 if(line & 0x1) scanLine += 1;
121 if(line >> 1 & 0x1) scanLine += 2;
122 if(line >> 2 & 0x1) scanLine += 4;
123 if(line >> 3 & 0x1) scanLine += 16;
124 if(line >> 4 & 0x1) scanLine += 32;
125
126 GPIO.out = (GPIO.out & ~0x06E00000) | (scanLine << 21);
127 // which is the same as:
128 // digitalWrite(PIN_A, line & 1)
129 // digitalWrite(PIN_B, line & 2)
130 // digitalWrite(PIN_C, line & 4)
131 // digitalWrite(PIN_D, line & 8)
132 // digitalWrite(PIN_E, line & 16)
133 // but in a "single cycle"
134}
135
136uint16_t Translate8To16Bit[256] = {0,46,92,139,186,233,280,327,375,422,470,519,567,615,664,713,762,812,861,911,961,1011,1061,1112,1163,1214,1265,1317,1368,1420,1473,1525,1578,1631,1684,1737,1791,1844,1899,1953,2007,2062,2117,2173,2228,2284,2340,2397,2453,2510,2568,2625,2683,2741,2799,2858,2917,2976,3036,3096,3156,3216,3277,3338,3399,3461,3523,3586,3648,3711,3775,3838,3902,3967,4032,4097,4162,4228,4294,4361,4428,4495,4563,4631,4699,4768,4838,4907,4978,5048,5119,5191,5262,5335,5407,5481,5554,5628,5703,5778,5853,5929,6006,6083,6160,6238,6317,6396,6476,6556,6636,6718,6799,6882,6965,7048,7132,7217,7302,7388,7475,7562,7650,7739,7828,7918,8008,8099,8191,8284,8377,8472,8567,8662,8759,8856,8954,9053,9153,9253,9355,9457,9560,9664,9769,9875,9982,10090,10199,10309,10420,10532,10645,10760,10875,10991,11109,11228,11348,11469,11591,11715,11840,11967,12094,12223,12354,12486,12620,12755,12891,13030,13169,13311,13454,13599,13746,13895,14045,14198,14352,14509,14667,14828,14991,15157,15324,15494,15667,15842,16020,16200,16383,16569,16758,16951,17146,17345,17547,17752,17961,18174,18391,18612,18837,19067,19301,19539,19783,20032,20286,20546,20812,21083,21361,21646,21938,22237,22544,22859,23183,23516,23859,24211,24575,24950,25338,25739,26153,26583,27029,27493,27975,28478,29003,29553,30130,30736,31375,32051,32767,33530,34345,35221,36167,37195,38322,39567,40959,42537,44359,46514,49151,52551,57343,65535};
137
138#define BLACK { 0, 0, 0}
139#define RED {255, 0, 0}
140#define GREEN { 0,255, 0}
141#define BLUE { 0, 0,255}
142#define WHITE {255,255,255}
143
144uint8_t scanLines[numScanLines*2][panelWidth][3] = {
145 {BLACK,BLACK,BLACK,BLACK,BLACK,BLACK,BLACK},
146 {BLACK,BLACK,BLACK,BLACK,BLACK,BLACK,BLACK},
147
148 { BLACK, BLACK, RED ,BLUE,BLUE,BLUE,RED , BLUE, BLUE,RED ,RED ,RED ,BLUE, BLUE, RED ,RED ,RED ,RED ,BLUE, BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, BLUE,RED ,RED ,RED ,RED , BLUE, BLUE,BLUE,RED ,BLUE,BLUE, BLUE },
149 { BLACK, BLACK, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,BLUE,RED ,BLUE, BLUE, RED ,BLUE,BLUE,BLUE,BLUE, BLUE, BLUE,BLUE,RED ,BLUE,BLUE, BLUE },
150 { BLACK, BLACK, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,RED ,BLUE,BLUE, BLUE, RED ,BLUE,BLUE,BLUE,BLUE, BLUE, BLUE,BLUE,RED ,BLUE,BLUE, BLUE },
151 { BLACK, BLACK, RED ,BLUE,RED ,BLUE,RED , BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,RED ,RED ,RED ,BLUE, BLUE, RED ,RED ,BLUE,BLUE,BLUE, BLUE, BLUE,RED ,RED ,RED ,BLUE, BLUE, BLUE,BLUE,RED ,BLUE,BLUE, BLUE },
152 { BLACK, BLACK, RED ,BLUE,RED ,BLUE,RED , BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,RED ,BLUE,BLUE, BLUE, RED ,BLUE,RED ,BLUE,BLUE, BLUE, BLUE,BLUE,BLUE,BLUE,RED , BLUE, BLUE,BLUE,RED ,BLUE,BLUE, BLUE },
153 { BLACK, BLACK, RED ,BLUE,RED ,BLUE,RED , BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,BLUE,RED ,BLUE, BLUE, RED ,BLUE,BLUE,RED ,BLUE, BLUE, BLUE,BLUE,BLUE,BLUE,RED , BLUE, BLUE,BLUE,BLUE,BLUE,BLUE, BLUE },
154 { BLACK, BLACK, BLUE,RED ,BLUE,RED ,BLUE, BLUE, BLUE,RED ,RED ,RED ,BLUE, BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,RED ,RED ,RED ,BLUE, BLUE, BLUE,BLUE,RED ,BLUE,BLUE, BLUE },
155 {BLACK,BLACK,BLACK,BLACK,BLACK,BLACK,BLACK},
156
157 {BLACK,BLACK,BLACK,BLACK,BLACK,BLACK,BLACK},
158 { BLACK, BLACK, RED ,BLUE,BLUE,BLUE,RED , BLUE, BLUE,RED ,RED ,RED ,BLUE, BLUE, RED ,RED ,RED ,RED ,BLUE, BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, BLUE,RED ,RED ,RED ,RED , BLUE, BLUE,BLUE,RED ,BLUE,BLUE, BLUE },
159 { BLACK, BLACK, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,BLUE,RED ,BLUE, BLUE, RED ,BLUE,BLUE,BLUE,BLUE, BLUE, BLUE,BLUE,RED ,BLUE,BLUE, BLUE },
160 { BLACK, BLACK, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,RED ,BLUE,BLUE, BLUE, RED ,BLUE,BLUE,BLUE,BLUE, BLUE, BLUE,BLUE,RED ,BLUE,BLUE, BLUE },
161 { BLACK, BLACK, RED ,BLUE,RED ,BLUE,RED , BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,RED ,RED ,RED ,BLUE, BLUE, RED ,RED ,BLUE,BLUE,BLUE, BLUE, BLUE,RED ,RED ,RED ,BLUE, BLUE, BLUE,BLUE,RED ,BLUE,BLUE, BLUE },
162 { BLACK, BLACK, RED ,BLUE,RED ,BLUE,RED , BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,RED ,BLUE,BLUE, BLUE, RED ,BLUE,RED ,BLUE,BLUE, BLUE, BLUE,BLUE,BLUE,BLUE,RED , BLUE, BLUE,BLUE,RED ,BLUE,BLUE, BLUE },
163 { BLACK, BLACK, RED ,BLUE,RED ,BLUE,RED , BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,BLUE,RED ,BLUE, BLUE, RED ,BLUE,BLUE,RED ,BLUE, BLUE, BLUE,BLUE,BLUE,BLUE,RED , BLUE, BLUE,BLUE,BLUE,BLUE,BLUE, BLUE },
164 { BLACK, BLACK, BLUE,RED ,BLUE,RED ,BLUE, BLUE, BLUE,RED ,RED ,RED ,BLUE, BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,RED ,RED ,RED ,BLUE, BLUE, BLUE,BLUE,RED ,BLUE,BLUE, BLUE },
165 {BLACK,BLACK,BLACK,BLACK,BLACK,BLACK,BLACK},
166
167 {BLACK,BLACK,BLACK,BLACK,BLACK,BLACK,BLACK},
168 { BLACK, BLACK, RED ,BLUE,BLUE,BLUE,RED , BLUE, BLUE,RED ,RED ,RED ,BLUE, BLUE, RED ,RED ,RED ,RED ,BLUE, BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, BLUE,RED ,RED ,RED ,RED , BLUE, BLUE,BLUE,RED ,BLUE,BLUE, BLUE },
169 { BLACK, BLACK, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,BLUE,RED ,BLUE, BLUE, RED ,BLUE,BLUE,BLUE,BLUE, BLUE, BLUE,BLUE,RED ,BLUE,BLUE, BLUE },
170 { BLACK, BLACK, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,RED ,BLUE,BLUE, BLUE, RED ,BLUE,BLUE,BLUE,BLUE, BLUE, BLUE,BLUE,RED ,BLUE,BLUE, BLUE },
171 { BLACK, BLACK, RED ,BLUE,RED ,BLUE,RED , BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,RED ,RED ,RED ,BLUE, BLUE, RED ,RED ,BLUE,BLUE,BLUE, BLUE, BLUE,RED ,RED ,RED ,BLUE, BLUE, BLUE,BLUE,RED ,BLUE,BLUE, BLUE },
172 { BLACK, BLACK, RED ,BLUE,RED ,BLUE,RED , BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,RED ,BLUE,BLUE, BLUE, RED ,BLUE,RED ,BLUE,BLUE, BLUE, BLUE,BLUE,BLUE,BLUE,RED , BLUE, BLUE,BLUE,RED ,BLUE,BLUE, BLUE },
173 { BLACK, BLACK, RED ,BLUE,RED ,BLUE,RED , BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,BLUE,RED ,BLUE, BLUE, RED ,BLUE,BLUE,RED ,BLUE, BLUE, BLUE,BLUE,BLUE,BLUE,RED , BLUE, BLUE,BLUE,BLUE,BLUE,BLUE, BLUE },
174 { BLACK, BLACK, BLUE,RED ,BLUE,RED ,BLUE, BLUE, BLUE,RED ,RED ,RED ,BLUE, BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,RED ,RED ,RED ,BLUE, BLUE, BLUE,BLUE,RED ,BLUE,BLUE, BLUE },
175 {BLACK,BLACK,BLACK,BLACK,BLACK,BLACK,BLACK},
176
177 {BLACK,BLACK,BLACK,BLACK,BLACK,BLACK,BLACK},
178 { BLACK, BLACK, RED ,BLUE,BLUE,BLUE,RED , BLUE, BLUE,RED ,RED ,RED ,BLUE, BLUE, RED ,RED ,RED ,RED ,BLUE, BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, BLUE,RED ,RED ,RED ,RED , BLUE, BLUE,BLUE,RED ,BLUE,BLUE, BLUE },
179 { BLACK, BLACK, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,BLUE,RED ,BLUE, BLUE, RED ,BLUE,BLUE,BLUE,BLUE, BLUE, BLUE,BLUE,RED ,BLUE,BLUE, BLUE },
180 { BLACK, BLACK, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,RED ,BLUE,BLUE, BLUE, RED ,BLUE,BLUE,BLUE,BLUE, BLUE, BLUE,BLUE,RED ,BLUE,BLUE, BLUE },
181 { BLACK, BLACK, RED ,BLUE,RED ,BLUE,RED , BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,RED ,RED ,RED ,BLUE, BLUE, RED ,RED ,BLUE,BLUE,BLUE, BLUE, BLUE,RED ,RED ,RED ,BLUE, BLUE, BLUE,BLUE,RED ,BLUE,BLUE, BLUE },
182 { BLACK, BLACK, RED ,BLUE,RED ,BLUE,RED , BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,RED ,BLUE,BLUE, BLUE, RED ,BLUE,RED ,BLUE,BLUE, BLUE, BLUE,BLUE,BLUE,BLUE,RED , BLUE, BLUE,BLUE,RED ,BLUE,BLUE, BLUE },
183 { BLACK, BLACK, RED ,BLUE,RED ,BLUE,RED , BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,BLUE,RED ,BLUE, BLUE, RED ,BLUE,BLUE,RED ,BLUE, BLUE, BLUE,BLUE,BLUE,BLUE,RED , BLUE, BLUE,BLUE,BLUE,BLUE,BLUE, BLUE },
184 { BLACK, BLACK, BLUE,RED ,BLUE,RED ,BLUE, BLUE, BLUE,RED ,RED ,RED ,BLUE, BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,RED ,RED ,RED ,BLUE, BLUE, BLUE,BLUE,RED ,BLUE,BLUE, BLUE },
185 {BLACK,BLACK,BLACK,BLACK,BLACK,BLACK,BLACK},
186
187 {BLACK,BLACK,BLACK,BLACK,BLACK,BLACK,BLACK},
188 { BLACK, BLACK, RED ,BLUE,BLUE,BLUE,RED , BLUE, BLUE,RED ,RED ,RED ,BLUE, BLUE, RED ,RED ,RED ,RED ,BLUE, BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, BLUE,RED ,RED ,RED ,RED , BLUE, BLUE,BLUE,RED ,BLUE,BLUE, BLUE },
189 { BLACK, BLACK, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,BLUE,RED ,BLUE, BLUE, RED ,BLUE,BLUE,BLUE,BLUE, BLUE, BLUE,BLUE,RED ,BLUE,BLUE, BLUE },
190 { BLACK, BLACK, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,RED ,BLUE,BLUE, BLUE, RED ,BLUE,BLUE,BLUE,BLUE, BLUE, BLUE,BLUE,RED ,BLUE,BLUE, BLUE },
191 { BLACK, BLACK, RED ,BLUE,RED ,BLUE,RED , BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,RED ,RED ,RED ,BLUE, BLUE, RED ,RED ,BLUE,BLUE,BLUE, BLUE, BLUE,RED ,RED ,RED ,BLUE, BLUE, BLUE,BLUE,RED ,BLUE,BLUE, BLUE },
192 { BLACK, BLACK, RED ,BLUE,RED ,BLUE,RED , BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,RED ,BLUE,BLUE, BLUE, RED ,BLUE,RED ,BLUE,BLUE, BLUE, BLUE,BLUE,BLUE,BLUE,RED , BLUE, BLUE,BLUE,RED ,BLUE,BLUE, BLUE },
193 { BLACK, BLACK, RED ,BLUE,RED ,BLUE,RED , BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,BLUE,RED ,BLUE, BLUE, RED ,BLUE,BLUE,RED ,BLUE, BLUE, BLUE,BLUE,BLUE,BLUE,RED , BLUE, BLUE,BLUE,BLUE,BLUE,BLUE, BLUE },
194 { BLACK, BLACK, BLUE,RED ,BLUE,RED ,BLUE, BLUE, BLUE,RED ,RED ,RED ,BLUE, BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,RED ,RED ,RED ,BLUE, BLUE, BLUE,BLUE,RED ,BLUE,BLUE, BLUE },
195
196 {BLACK,BLACK,BLACK,BLACK,BLACK,BLACK,BLACK},
197
198 {BLACK,BLACK,BLACK,BLACK,BLACK,BLACK,BLACK},
199 { BLACK, BLACK, RED ,BLUE,BLUE,BLUE,RED , BLUE, BLUE,RED ,RED ,RED ,BLUE, BLUE, RED ,RED ,RED ,RED ,BLUE, BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, BLUE,RED ,RED ,RED ,RED , BLUE, BLUE,BLUE,RED ,BLUE,BLUE, BLUE },
200 { BLACK, BLACK, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,BLUE,RED ,BLUE, BLUE, RED ,BLUE,BLUE,BLUE,BLUE, BLUE, BLUE,BLUE,RED ,BLUE,BLUE, BLUE },
201 { BLACK, BLACK, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,RED ,BLUE,BLUE, BLUE, RED ,BLUE,BLUE,BLUE,BLUE, BLUE, BLUE,BLUE,RED ,BLUE,BLUE, BLUE },
202 { BLACK, BLACK, RED ,BLUE,RED ,BLUE,RED , BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,RED ,RED ,RED ,BLUE, BLUE, RED ,RED ,BLUE,BLUE,BLUE, BLUE, BLUE,RED ,RED ,RED ,BLUE, BLUE, BLUE,BLUE,RED ,BLUE,BLUE, BLUE },
203 { BLACK, BLACK, RED ,BLUE,RED ,BLUE,RED , BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,RED ,BLUE,BLUE, BLUE, RED ,BLUE,RED ,BLUE,BLUE, BLUE, BLUE,BLUE,BLUE,BLUE,RED , BLUE, BLUE,BLUE,RED ,BLUE,BLUE, BLUE },
204 { BLACK, BLACK, RED ,BLUE,RED ,BLUE,RED , BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,BLUE,RED ,BLUE, BLUE, RED ,BLUE,BLUE,RED ,BLUE, BLUE, BLUE,BLUE,BLUE,BLUE,RED , BLUE, BLUE,BLUE,BLUE,BLUE,BLUE, BLUE },
205 { BLACK, BLACK, BLUE,RED ,BLUE,RED ,BLUE, BLUE, BLUE,RED ,RED ,RED ,BLUE, BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,BLUE,BLUE,BLUE,RED , BLUE, RED ,RED ,RED ,RED ,BLUE, BLUE, BLUE,BLUE,RED ,BLUE,BLUE, BLUE },
206 {BLACK,BLACK,BLACK,BLACK,BLACK,BLACK,BLACK},
207
208 {BLACK,BLACK,BLACK,BLACK,BLACK,BLACK,BLACK},
209
210};
211
212void InitBuffer() {
213 for (int k = 0; k < numScanLines * 2; k++) {
214 for (int p = 0; p < panelWidth; p++) {
215 uint8_t *pixel = scanLines[k][p];
216 if (pixel[0] == 0 && pixel[1] == 0 && pixel[2] == 0) { // Set black pixels to gray
217 pixel[0] = 0x10;
218 pixel[1] = 0x10;
219 pixel[2] = 0x10;
220 }
221 }
222 }
223}
224
225inline void preActiveCommand() {
226 sendLatch(14); // Pre-active command
227}
228
229inline void switchBuffers() {
230 sendLatch(2); // VSync Command
231}
232
233inline void resetCounters() {
234 sendLatch(10); // Reset all chips PWM Counters
235}
236
237const uint32_t firstPanelOffset = 0;
238const uint32_t secondPanelOffset = (numScanLines) * panelWidth * 3;
239
240void IRAM_ATTR WriteFrame() {
241 uint16_t r1 = 0, g1 = 0, b1 = 0, r2 = 0, g2 = 0, b2 = 0;
242 for (int k = 0; k < numScanLines; k++) {
243 uint8_t *currentScanLine0 = (uint8_t *)scanLines[k];
244 uint8_t *currentScanLine1 = (uint8_t *)scanLines[k+numScanLines];
245 for (int l = 0; l < numLeds; l++) {
246 for (int c = 0; c < chips; c++) {
247 uint32_t currentPixel = c*numLeds+l;
248 r1 = Translate8To16Bit[currentScanLine0[currentPixel*3 + 0]];
249 g1 = Translate8To16Bit[currentScanLine0[currentPixel*3 + 1]];
250 b1 = Translate8To16Bit[currentScanLine0[currentPixel*3 + 2]];
251 r2 = Translate8To16Bit[currentScanLine1[currentPixel*3 + 0]];
252 g2 = Translate8To16Bit[currentScanLine1[currentPixel*3 + 1]];
253 b2 = Translate8To16Bit[currentScanLine1[currentPixel*3 + 2]];
254 SendPixel(r1,g1,b1,r2,g2,b2, c == chips - 1);
255 }
256 sendPwmClock(64);
257 }
258 }
259 delay(1);
260 switchBuffers();
261}
262
263void setup() {
264 for (uint8_t x = 0; x < 14; x++) {
265 pinMode(pins[x], OUTPUT);
266 digitalWrite(pins[x], LOW);
267 }
268
269 resetCounters(); // Reset
270 preActiveCommand(); // Pre-activate command
271 // Sending configuration to register 1, in which:
272 // 1 00 11111 0 0 111011
273 // 1 => Lower ghost elimination (enabled)
274 // 00 => (Reserved, default 00)
275 // 11111 => Number of scanlines (default 4, we set to 32)
276 // 0 => Grayscale Mode ( 0 => 14 bit, 1 => 13 bit)
277 // 0 => Double GCLK Rate (0 => Active on positive border, 1 => Active on both borders)
278 // 101011 => 64 step programable gain from 12.5% to 200% (default 101011)
279 sendConfiguration(0b1001111100101011, 4); // Write config register 1 (4 latches)
280
281 preActiveCommand(); // Pre-activate command
282 // Sending configuration to register 2
283 // 00010 0 000001 000 0
284 // 00010 => Reserved (default 00010)
285 // 0 => Double Refresh Rate (requires half all GCLK cycles)
286 // 000001 => Reserved (default 00001)
287 // 000 => Dim Line Compensation (000 default)
288 // 0 => Reserved
289 sendConfiguration(0b0001000000010000, 8); // Write config register 2 (4 latches)
290 delay(1);
291 InitBuffer();
292 WriteFrame();
293 delay(1);
294}
295
296
297void loop() {
298 for (int l = 0; l < 32; l++) {
299 sendScanline(l);
300 sendPwmClock(513);
301 }
302}
303