-
Notifications
You must be signed in to change notification settings - Fork 2
/
sambilight-arduino.ino
128 lines (107 loc) · 3.4 KB
/
sambilight-arduino.ino
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
//##### SETTINGS ############
#define BAUDRATE 921600 // Serial port speed
#define NUM_LEDS 40 // Number of leds
#define BRIGHTNESS 255 // Maximum brightness
#define LED_TYPE WS2812 // Led strip type for FastLED
#define COLOR_ORDER GRB // Led color order
#define PIN_DATA 14 // Led data output pin
//#define PIN_CLOCK 12 // Led data clock pin (uncomment if you're using a 4-wire LED type)
//###########################
#if defined(ESP8266)
#define FASTLED_ESP8266_RAW_PIN_ORDER
#elif defined(ESP32)
#define FASTLED_ESP32_RAW_PIN_ORDER
#endif
#include <Arduino.h>
#include <FastLED.h>
CRGB leds[NUM_LEDS];
uint8_t* ledsRaw = (uint8_t*)leds;
const uint8_t magic[] = { 'A','d','a' };
#define MAGICSIZE sizeof(magic)
#define HICHECK (MAGICSIZE)
#define LOCHECK (MAGICSIZE + 1)
#define CHECKSUM (MAGICSIZE + 2)
enum processModes_t { Header, Data } mode = Header;
int16_t c, outPos, bytesRemaining;
unsigned long t, lastByteTime;
uint8_t headPos, hi, lo, chk;
void setup() {
#if defined(PIN_CLOCK) && defined(PIN_DATA)
FastLED.addLeds<LED_TYPE, PIN_DATA, PIN_CLOCK, COLOR_ORDER>(leds, NUM_LEDS);
#elif defined(PIN_DATA)
FastLED.addLeds<LED_TYPE, PIN_DATA, COLOR_ORDER>(leds, NUM_LEDS);
#else
#error "No LED output pins defined. Check your settings at the top."
#endif
FastLED.setBrightness(BRIGHTNESS);
FastLED.show();
#if defined(ESP8266) || defined(ESP32)
Serial.setRxBufferSize(2048);
#endif
#if defined(ESP32)
Serial.begin(BAUDRATE, SERIAL_8N1, 13, 12); // RX pin will be GPIO13 on ESP32
#else
Serial.begin(BAUDRATE);
#endif
#if defined(ESP8266)
delay(500);
Serial.swap(); // RX pin will be GPIO13 on ESP8266
delay(500);
#endif
lastByteTime = millis();
}
void loop() {
t = millis();
if ((c = Serial.read()) >= 0) {
lastByteTime = t;
switch (mode) {
case Header:
if (headPos < MAGICSIZE) {
if (c == magic[headPos]) { headPos++; }
else { headPos = 0; }
}
else {
switch (headPos) {
case HICHECK:
hi = c;
headPos++;
break;
case LOCHECK:
lo = c;
headPos++;
break;
case CHECKSUM:
chk = c;
if (chk == (hi ^ lo ^ 0x55)) {
bytesRemaining = 3L * (256L * (long)hi + (long)lo + 1L);
outPos = 0;
memset(leds, 0, NUM_LEDS * sizeof(struct CRGB));
mode = Data;
}
headPos = 0;
break;
}
}
break;
case Data:
if (outPos < sizeof(leds)) {
ledsRaw[outPos++] = c;
}
bytesRemaining--;
if (bytesRemaining == 0) {
mode = Header;
while (Serial.available() > 0) {
Serial.read();
}
FastLED.show();
}
break;
}
}
else if (((t - lastByteTime) >= (uint32_t)120 * 60 * 1000 && mode == Header) || ((t - lastByteTime) >= (uint32_t)1000 && mode == Data)) {
memset(leds, 0, NUM_LEDS * sizeof(struct CRGB));
FastLED.show();
mode = Header;
lastByteTime = t;
}
}