Skip to content
Snippets Groups Projects
Select Git revision
  • 42b818a8b8abc657af0f704f49edf5c6a3a7aecf
  • master default protected
2 results

Adalight_WS2812.ino

Blame
  • Adalight_WS2812.ino 2.08 KiB
    /*
     * Arduino interface for the use of WS2812 strip LEDs
     * Uses Adalight protocol and is compatible with Boblight, Prismatik etc...
     * "Magic Word" for synchronisation is 'Ada' followed by LED High, Low and Checksum
     * Fork von Wifsimster <wifsimster@gmail.com> 
     */
     
    #include "FastLED.h"
    // Number of LEDs
    #define NUM_LEDS 112
    #define DATA_PIN 3
    
    // Baudrate, higher rate allows faster refresh rate and more LEDs (defined in /etc/boblight.conf)
    #define serialRate 115200
    
    // Adalight sends a "Magic Word" (defined in /etc/boblight.conf) before sending the pixel data
    uint8_t prefix[] = {'A', 'd', 'a'}, hi, lo, chk, i;
    
    // Initialise LED-array
    CRGB leds[NUM_LEDS];
    
    void setup() {
      // Use NEOPIXEL to keep true colors
      FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
      LEDS.setBrightness(100);
      
      // Initial RGB flash
      LEDS.showColor(CRGB(255, 0, 0));
      delay(500);
      LEDS.showColor(CRGB(0, 255, 0));
      delay(500);
      LEDS.showColor(CRGB(0, 0, 255));
      delay(500);
      LEDS.showColor(CRGB(0, 0, 0));
      
      Serial.begin(serialRate);
      // Send "Magic Word" string to host
      Serial.print("Ada\n");
    }
    
    void loop() { 
      // Wait for first byte of Magic Word
      for(i = 0; i < sizeof prefix; ++i) {
        waitLoop: while (!Serial.available()) ;;
        // Check next byte in Magic Word
        if(prefix[i] == Serial.read()) continue;
        // otherwise, start over
        i = 0;
        goto waitLoop;
    }
      
      // Hi, Lo, Checksum  
      while (!Serial.available()) ;;
      hi=Serial.read();
      while (!Serial.available()) ;;
      lo=Serial.read();
      while (!Serial.available()) ;;
      chk=Serial.read();
      
      // If checksum does not match go back to wait
      if (chk != (hi ^ lo ^ 0x55)) {
        i=0;
        goto waitLoop;
      }
      
      memset(leds, 0, NUM_LEDS * sizeof(struct CRGB));
      // Read the transmission data and set LED values
      for (uint8_t i = 0; i < NUM_LEDS; i++) {
        byte r, g, b;    
        while(!Serial.available());
        r = Serial.read();
        while(!Serial.available());
        g = Serial.read();
        while(!Serial.available());
        b = Serial.read();
        leds[i].r = r;
        leds[i].g = g;
        leds[i].b = b;
      }
      
      // Shows new values
      FastLED.show();
    }