Cheerlights

on 31 December 2013 in Arduino, Raspberry Pi

For the Christmas tree I wanted to have a light controlled by the community via Cheerlights. Unfortunatly the RedFly shield had lots of problems, so I activated my Raspberry Pi, which lay around for have a year. The Raspi installation had no problems; Raspbian, Ethernet with DHCP, Wifi with fixed IP.

The C program to get the cheerlights status:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

#define URL "curl -s http://api.thingspeak.com/channels/1417/field/1/last.txt"
#define DEV "/dev/ttyACM0"
#define LINELEN 256

int main (int argc, char *argv[])
{
    int j;
    FILE *pp;
    FILE *fp;
    char buffer [LINELEN];
    char r, g, b;

    fp = fopen (DEV, "w");
    if (fp == NULL)
    {
        fprintf (stderr, "Couldn't open "%s".n", DEV);
    }
    sleep (5);
    while (1)
    {
        pp = popen (URL, "r");
        if (pp == NULL)
        {
            fprintf (stderr, "Error opening "%s"n", URL);
        }
        fgets (buffer, LINELEN, pp);
        fclose (pp);
        printf ("---%s---n", buffer);

        if (strcmp (buffer, "red") == 0)
        {  
            r = 255;
            g = 0;
            b = 0;
        }
        else if (strcmp (buffer, "green") == 0)
        {  
            r = 0;
            g = 255;
            b = 0;
        }
        else if (strcmp (buffer, "blue") == 0)
        {  
            r = 0;
            g = 0;
            b = 255;
        }
        else if (strcmp (buffer, "cyan") == 0)
        {
            r = 0;
            g = 255;
            b = 255;
        }
        else if (strcmp (buffer, "purple") == 0)
        {  
            r = 128;
            g = 0;
            b = 128;
        }
        else if (strcmp (buffer, "magenta") == 0)
        {
            r = 255;
            g = 0;
            b = 255;
        }
        else if (strcmp (buffer, "yellow") == 0)
        {
            r = 255;
            g = 255;
            b = 0;
        }
        else if (strcmp (buffer, "orange") == 0)
        {
            r = 255;
            g = 165;
            b = 0;
        }
        else if (strcmp (buffer, "warmwhite") == 0)
        {
            r = 255;
            g = 223;
            b = 223;
        }
        else if (strcmp (buffer, "white") == 0)
        {  
            r = 255;
            g = 255;
            b = 255;
        }
        else if (strcmp (buffer, "black") == 0)
        {
            b = 0;
            g = 0;
            r = 0;
        }
        fprintf (fp, "%c%c%c", r, g, b);
        fflush (fp);

        sleep (60);
    }
}

Every minute this programs gets the current cheerlights color and sends the corresponding RGB values to a serial interface. From there the Arduino reads the values and controls a RGB LED

/*   cheerlights - controls a RGB LED from cheerlights.com
 *
 *   2013-12-15   danimath   erzeugt
 *
 **********************************************************/

const byte REDLED   = 6;
const byte GREENLED = 9;
const byte BLUELED  = 3;

int r, g, b, old_r, old_g, old_b;

void setup ()
{
    analogWrite (REDLED, 255);
    delay (500);
    analogWrite (REDLED, 0);
    analogWrite (GREENLED, 255);
    delay (500);
    analogWrite (GREENLED, 0);
    analogWrite (BLUELED, 255);
    delay (500);
    analogWrite (REDLED, 255);
    analogWrite (GREENLED, 255);
    analogWrite (BLUELED, 255);
    delay (500);
    Serial.begin (9600);
    old_r = 0;
    old_g = 0;
    old_b = 0;
    r = 255;
    g = 255;
    b = 255;
}

void loop ()
{
    if (Serial.available ())
    {
        old_r = r;
        old_g = g;
        old_b = b;
        r = Serial.read ();
        g = Serial.read ();
        b = Serial.read ();
        for (int j = 0;   j < 10;   j++)
        {
            analogWrite (REDLED, r);
            analogWrite (GREENLED, g);
            analogWrite (BLUELED, b);
            delay (250);
            analogWrite (REDLED, old_r);
            analogWrite (GREENLED, old_g);
            analogWrite (BLUELED, old_b);
            delay (250);
        }
    }
    analogWrite (REDLED, r);
    analogWrite (GREENLED, g);
    analogWrite (BLUELED, b);
    delay (250);    
}

Now we are connected to the world, and the world can change our Christmas Light.

Leave a Reply