Загрузка данных


#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();
}