Spidey Wall is the name for a physical wall lit up by multiple addressable LED strips. This program is an LPC1768 web server to control the wall from a browser.
Dependencies: EthernetInterfacePlusHostname RdWebServer mbed-rtos mbed
This project is part of a Light-Wall using addressable LED strips (WS2801). I have published a few posts on my blog about the construction of the wall and building a game to play on it (PacMan). I have also had a guest post from a friend who has set his children the task of producing some interesting animations. The original post is http://robdobson.com/2015/07/spidey-wall/
So far, however, I hadn't fully connected the physical (and electronic) wall with the web-browser creations to drive it. This project is hopefully the final link. A fast and reliable web server using REST commands to drive the 1686 LEDs in the Spidey Wall from code running in a browser (say on an iPad while you are playing a game).
The approach taken here results in the ability to control the RGB values of all 1686 LEDs at a rate of 20 frames per second.
A blog post describing the whole thing is here:
http://robdobson.com/2015/08/a-reliable-mbed-webserver/
Diff: main.cpp
- Revision:
- 0:887096209439
- Child:
- 1:362331cec9b7
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Tue Aug 18 16:03:29 2015 +0000
@@ -0,0 +1,170 @@
+/* main.cpp
+ Rob Dobson 2013
+ More details at ???
+*/
+
+#include "mbed.h"
+#include "EthernetInterface.h"
+#include <stdio.h>
+#include <string.h>
+#include "RdWebServer.h"
+#include "ledstrip.h"
+#include "LedCmdHandler.h"
+
+#define PORT 80
+
+Serial pc(USBTX, USBRX);
+
+RdWebServer webServer;
+
+EthernetInterface eth;
+
+DigitalOut led1(LED1); //server listning status
+DigitalOut led2(LED2); //socket connecting status
+
+Ticker ledTick;
+
+char nameOfLights[50];
+int ledsCount = 904;
+int ledSplitPoint = 448;
+ledstrip* pLedStrip = NULL;
+
+char* indexHtmName = "index.htm";
+
+const int TICK_MS = 100;
+LedCmdHandler* pLedCmdHandler = NULL;
+int blinkCtr = 0;
+
+void ledTickfunc()
+{
+ if(webServer.isListening())
+ {
+ blinkCtr++;
+ if (blinkCtr > 1)
+ {
+ led1 = !led1;
+ blinkCtr = 0;
+ }
+ }
+ else
+ {
+ led1 = false;
+ }
+
+ if (pLedCmdHandler != NULL)
+ pLedCmdHandler->NextGen();
+}
+
+void handleCmd_ledControl(char* cmdStr, char* argStr)
+{
+ printf("LEDS COMMAND %s %s\r\n", cmdStr, argStr);
+ if (argStr == NULL)
+ return;
+ pLedCmdHandler->DoCommand(argStr);
+
+ // Store last command
+ LocalFileSystem local("local");
+ FILE* fp = fopen("/local/lastcmd.inf", "w");
+ if (fp != NULL)
+ {
+ fwrite(argStr, 1, strlen(argStr)+1, fp);
+ fclose(fp);
+ }
+}
+
+void reRunLastCommand()
+{
+ // Store last command
+ LocalFileSystem local("local");
+ FILE* fp = fopen("/local/lastcmd.inf", "r");
+ if (fp != NULL)
+ {
+ char buf[501];
+ buf[sizeof(buf)-1] = 0;
+ int nread = fread(buf, 1, sizeof(buf), fp);
+ fclose(fp);
+ if (nread > 0 && nread <= sizeof(buf))
+ {
+ buf[nread] = 0;
+ pLedCmdHandler->DoCommand(buf);
+ }
+ }
+}
+
+#include "colourconverters.h"
+
+void BodgeSmooth(ledstrip* pLedStrip)
+{
+ pLedStrip->Clear();
+ pLedStrip->ShowLeds();
+
+
+ RgbColor startRGB(50,0,0);
+ HsvColor curHsv = RgbToHsv(startRGB);
+ while(1)
+ for (int k = 0; k < 1000; k++)
+ for (int j = 0; j < 255; j++)
+ {
+ pLedStrip->Clear();
+ RgbColor colrVal = HsvToRgb(curHsv);
+ pLedStrip->Fill(0,pLedStrip->GetNumLeds(),colrVal.r, colrVal.g, colrVal.b);
+ pLedStrip->ShowLeds();
+ wait_ms(250);
+ curHsv.h++;
+ }
+}
+
+void setLightsConfig()
+{
+ printf("Rob LightWall - Configured for ");
+ // Check for a config file on the local file system
+ strcpy(nameOfLights, "Spidey");
+ LocalFileSystem local("local");
+ FILE* fp = fopen("/local/spidey.cnf", "r");
+ if (fp != NULL)
+ {
+ char buf[201];
+ buf[sizeof(buf)-1] = 0;
+ int nread = fread(buf, 1, sizeof(buf), fp);
+ if (nread > 0 && nread <= sizeof(buf))
+ {
+ buf[nread] = 0;
+ sscanf(buf, "%s %d %d", nameOfLights, &ledsCount, &ledSplitPoint);
+ }
+ fclose(fp);
+ printf("%s (%d LEDs, Split at %d)", nameOfLights, ledsCount, ledSplitPoint);
+ printf("\n\r");
+ }
+
+ // Leds setup
+ pLedStrip = new ledstrip(ledsCount, ledSplitPoint);
+ wait_ms(100);
+ pLedStrip->Clear();
+ pLedStrip->ShowLeds();
+
+ // Cmd handler
+ pLedCmdHandler = new LedCmdHandler(pLedStrip);
+}
+
+int main (void)
+{
+ pc.baud(115200);
+
+ setLightsConfig();
+
+ BodgeSmooth(pLedStrip);
+
+ ledTick.attach(&ledTickfunc,TICK_MS / 1000.0);
+
+// reRunLastCommand();
+
+ // setup ethernet interface
+ eth.init(); //Use DHCP
+ eth.connect();
+ printf("IP Address is %s\n\r", eth.getIPAddress());
+
+ webServer.addCommand("", RdWebServerCmdDef::CMD_LOCALFILE, NULL, indexHtmName, true);
+ webServer.addCommand("cmd", RdWebServerCmdDef::CMD_CALLBACK, &handleCmd_ledControl);
+ webServer.init(PORT, &led2);
+ webServer.run();
+}