Cheerlights client using WiFiDIPCortex and WS2801 RGB LED strip

Dependencies:   Adafruit_WS2801 HTTPClient cc3000_hostdriver_mbedsocket mbed

Files at this revision

API Documentation at this revision

Comitter:
SomeRandomBloke
Date:
Wed Nov 26 14:02:36 2014 +0000
Parent:
2:8de3eccd527e
Commit message:
Latest updates of WiFi Cheerlights

Changed in this revision

Adafruit_WS2801.lib Show annotated file Show diff for this revision Revisions of this file
HTTPClient.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- a/Adafruit_WS2801.lib	Sat Feb 22 13:25:44 2014 +0000
+++ b/Adafruit_WS2801.lib	Wed Nov 26 14:02:36 2014 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/users/SomeRandomBloke/code/Adafruit_WS2801/#2fdaa13896a4
+http://mbed.org/users/SomeRandomBloke/code/Adafruit_WS2801/#987c91c45188
--- a/HTTPClient.lib	Sat Feb 22 13:25:44 2014 +0000
+++ b/HTTPClient.lib	Wed Nov 26 14:02:36 2014 +0000
@@ -1,1 +1,1 @@
-https://mbed.org/users/donatien/code/HTTPClient/#1f743885e7de
+http://developer.mbed.org/users/SomeRandomBloke/code/HTTPClient/#7f45426cabb1
--- a/main.cpp	Sat Feb 22 13:25:44 2014 +0000
+++ b/main.cpp	Wed Nov 26 14:02:36 2014 +0000
@@ -68,10 +68,13 @@
 // Library to drive the LED strip
 #include "Adafruit_WS2801.h"
 
-// Some local defines
 
+// Some local defines
 #define SERIAL_BAUD_RATE    115200
 
+#define NUM_PIXELS 50
+#define NUM_COL_HISTORY 5
+
 #define WIGO           1
 #define WIFI_DIPCORTEX 2
 #define UNDEFINED      3
@@ -80,9 +83,9 @@
 
 using namespace mbed_cc3000;
 
-// LED to indicate smart config is running
+// LED to indicate SmartConfig is running
 DigitalOut LedSC(P0_1);
-//
+// Button to hold down during reset to enter SmartConfig mode
 DigitalIn SCButton(P1_31);
 
 // For Bit-Banging SPI use Pins 40 and 39
@@ -103,9 +106,9 @@
 #endif
 
 #ifndef CC3000_UNENCRYPTED_SMART_CONFIG
-const uint8_t smartconfigkey[] = {0x73,0x6d,0x61,0x72,0x74,0x63,0x6f,0x6e,0x66,0x69,0x67,0x41,0x45,0x53,0x31,0x36};
+//const uint8_t smartconfigkey[] = {0x73,0x6d,0x61,0x72,0x74,0x63,0x6f,0x6e,0x66,0x69,0x67,0x41,0x45,0x53,0x31,0x36};
 #else
-const uint8_t smartconfigkey = 0;
+//const uint8_t smartconfigkey = 0;
 #endif
 
 tNetappIpconfigRetArgs ipinfo;
@@ -116,14 +119,12 @@
 char _deviceName[] = "CC3000";
 
 HTTPClient http;
-//char str[128];
-uint32_t lastColour = 0;
 
 // Set the first variable to the number of rows, the second to number of pixels. 32 = 32 pixels in a row
-Adafruit_WS2801 strip = Adafruit_WS2801(32, dataPin, clockPin);
+Adafruit_WS2801 strip = Adafruit_WS2801(NUM_PIXELS, dataPin, clockPin);
 
 // Setup the colour table and mappings
-#define NUM_COLOURS 12
+#define NUM_COLOURS 13
 struct ColourTable {
     char name[12];
     uint32_t value;
@@ -139,11 +140,10 @@
     { "yellow",    0xffff00 },
     { "orange",    0xffa500 },
     { "pink",      0xff69b4 },
-    { "oldlace",   0xfd5e56 }
+    { "oldlace",   0xfd5e56 },
+    { "black",     0x000000 }
 };
 
-
-
 /** Get status of WiFi connection
  * displays and returns value
  */
@@ -201,25 +201,24 @@
 }
 
 
-/** Convert name to colour
+/** Convert name to colour and set it on LEDs. With colour history, strip will be
+ * changing colour for every new colour detected producing an almost random effect
+ * @param colNum Number of the received colour, starts 0 to NUM_COL_HISTORY with highest being latest colour
  * @param colStr Received colour name
  */
-void setColour( char *colStr )
+void setColour( int colNum, char *colStr )
 {
 //    uart.printf("received %s\r\n",colStr);
 
     for( int i=0; i < NUM_COLOURS; i++ ) {
         if( strncmp( colTable[i].name, colStr, strlen(colTable[i].name) ) == 0 ) {
-            if( colTable[i].value != lastColour ) {
-                for (int n=0; n < strip.numPixels(); n++) {
-                    strip.setPixelColor(n, colTable[i].value);
-                    strip.show();
-                    wait_ms(100);
-                }
-                lastColour = colTable[i].value;
-            } else {
-                uart.printf("Same as previous colour\r\n");
+            for (int n=colNum; n < strip.numPixels()+NUM_COL_HISTORY; n += NUM_COL_HISTORY) {
+                strip.setPixelColor(n, colTable[i].value);
             }
+            // Update strip after colour has been set
+            strip.show();
+            // Slight pause 
+            wait_ms(250);
             return;
         }
     }
@@ -227,25 +226,42 @@
 
 }
 
+#define CL_BUFFSIZE 1024
 /** Read Cheerlights colour
  * Use http call to get last Cheerlights colour
  */
 void readCheerlight( void )
 {
-    char str[128];
+    char responseStr[CL_BUFFSIZE];
     //GET data
     uart.printf("\r\nTrying to fetch page...\r\n");
-    int ret = http.get("http://api.thingspeak.com/channels/1417/field/1/last.txt", str, 128);
-    // Just a local test url, saves having to tweet the cheerlights colour every time
-//    int ret = http.get("http://192.168.1.3/last.txt", str, 128);
+    int ret = http.get("http://api.thingspeak.com/channels/1417/feed.csv?results=5", responseStr, CL_BUFFSIZE);
     if (!ret) {
-        uart.printf("Page fetched successfully - read %d characters\r\n", strlen(str));
-        uart.printf("Result: %s\r\n", str);
-        setColour( str );
+        uart.printf("Page fetched successfully - read %d characters\r\n", strlen(responseStr));
+        //uart.printf("Result: %s\r\n", responseStr);
+        // Parse CSV and set colours
+        // Get a line
+        char *ptr = responseStr;
+        // Skip header line
+        while(*ptr++ != 0x0a ); // Header
+        // 5 colours
+        for( int i=0; i<5; i++ ) {
+            while(*ptr++ != ',');   // Column 1 - Date, Skip
+            while(*ptr++ != ',');   // Column 2 - ID, Skip
+            char col[10];
+            char *cPtr = col;
+            while( *ptr != 0x0a ) { // Column 3 - colour
+                *cPtr++ = *ptr++;
+            }
+            *cPtr = '\0';
+            uart.printf("%d %s\r\n",i,col);
+            setColour( i, col );
+        }
     } else {
         uart.printf("Error - ret = %d - HTTP return code = %d\r\n", ret, http.getHTTPResponseCode());
     }
 
+    uart.printf("End of readCheerlights\n\r");
 }
 
 
@@ -266,9 +282,8 @@
     LPC_SYSCON->SYSAHBCLKCTRL |= (0x1 << 26);
 
     uart.baud(SERIAL_BAUD_RATE);
-    
+
     strip.updatePins();    // Switch to Hardware SPI
-
     strip.begin();
 
     // Update LED contents, to start they are all 'off'
@@ -307,11 +322,14 @@
         uart.printf("Back from SmartConfig\r\n");
 
         wait(2);    // for dhcp to configure
-
+// TODO: Add this into start_smart_config
         if ( wifi.is_dhcp_configured() ) {
             if (!Connected) {
                 // We have just connected
                 Connected = true;
+                // This might need calling for mdsn advertiser to work.
+                //   uint32_t ip_addr[4] = {0,0,0,0};
+                //   wifi._socket.gethostbyname((uint8_t *)_deviceName, strlen(_deviceName), uint32_t *ip_addr);
 
                 // Start the mdns service, this tells any smart config apps listening we have succeeded
                 wifi._socket.mdns_advertiser(1, (uint8_t *)_deviceName, strlen(_deviceName));
@@ -330,18 +348,21 @@
 
     LedSC = 0;
     print_cc3000_info();
-    
-    // Check if we're connected to WiFi and have an IP address, if not then just flash LED
+
+    // Check if we're connected to WiFi and have an IP address, if not then just flash LED until reset
     uint32_t status = getWiFiStatus();
     if( status != 3 || !wifi.is_dhcp_configured() ) {
         while( 1 ) {
             LedSC = !LedSC;
             wait_ms(500);
-        }    
+        }
     }
 
     while (1) {
-        getWiFiStatus();
+        if( getWiFiStatus() == 0 ) {
+            // Not connected, attempt reconnect
+            ;
+        }
         readCheerlight();
         // Pause for a minute before checking again
         wait(60);
--- a/mbed.bld	Sat Feb 22 13:25:44 2014 +0000
+++ b/mbed.bld	Wed Nov 26 14:02:36 2014 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/users/mbed_official/code/mbed/builds/8e73be2a2ac1
\ No newline at end of file
+http://mbed.org/users/mbed_official/code/mbed/builds/031413cf7a89
\ No newline at end of file