#include <Adafruit_NeoPixel.h>
#define NUM_LEDS 56
#define DI_PIN 13
#define OFF_TIME 30
#define serialRate 115200
Adafruit_NeoPixel strip(NUM_LEDS, DI_PIN, NEO_GRB + NEO_KHZ800);
uint8_t prefix[] = {'A', 'd', 'a'};
unsigned long off_timer;
boolean led_state = true;
void setup() {
strip.begin();
strip.setBrightness(150);
strip.show();
Serial.begin(serialRate);
Serial.print("Ada\n");
}
void check_connection() {
if (led_state) {
if (millis() - off_timer > (OFF_TIME * 1000)) {
led_state = false;
for(int i = 0; i < NUM_LEDS; i++) {
strip.setPixelColor(i, 0);
}
strip.show();
}
}
}
void loop() {
if (!led_state) led_state = true;
off_timer = millis();
// Ждём префикс "Ada"
for (int j = 0; j < 3; j++) {
waitLoop:
while (!Serial.available()) check_connection();
if (prefix[j] == Serial.read()) continue;
j = 0;
goto waitLoop;
}
while (!Serial.available()) check_connection();
byte hi = Serial.read();
while (!Serial.available()) check_connection();
byte lo = Serial.read();
while (!Serial.available()) check_connection();
byte chk = Serial.read();
if (chk != (hi ^ lo ^ 0x55)) {
goto waitLoop;
}
// Очищаем
for(int i = 0; i < NUM_LEDS; i++) {
strip.setPixelColor(i, 0);
}
// Читаем данные
for (int i = 0; i < NUM_LEDS; i++) {
while (!Serial.available()) check_connection();
byte r = Serial.read();
while (!Serial.available()) check_connection();
byte g = Serial.read();
while (!Serial.available()) check_connection();
byte b = Serial.read();
strip.setPixelColor(i, strip.Color(r, g, b));
}
strip.show();
}