Ranga Yogeshwar

Christmas thoughts.

F├╝r manche Menschen ist Weihnachten eine Phase der Einsamkeit. Dieser Baum ist mit dem Internet verbunden. Freunde und Bekannte k├Ânnen ├╝ber eine Webseite eine Nachricht versenden. Der Baum blinkt, zeigt Muster etc. und du wei├čt, dass gerade jemand an dich denkt....

Zum Funktionsprinzip:

Ein Arduino-Mega mit WiFi-Shield ist angeschlossen an eine "intelligente" Lichterkette. Der Arduino l├Ąuft als web-server mit einer eigenen IP. Gibt man diese in einen Browser, wird man direkt mit dem Menu des Baumes verbunden und kann per Knopfdruck eine Botschaft versenden. 

Der Baum reagiert dann mit dem ausgew├Ąhlten Blinkmuster. 

HARDWARE: 

  • Arduino-Mega 
  • Arduino WiFi-Shield
  • 12mm RGM LED Strang (50) mit WS2801-Treiber
  • Stromversorgung (9V) f├╝r Arduino
  • Stromversorgung(5V) (ca.2000mA) f├╝r die LED-Kette

Anbei der CODE:

Led_Wifi7.ino
   1 
/*
   2 
  Christmas thoughts V.1
   3 
WiFi Web Server  with LED Strip (R.Yogeshwar 12-14)
   4 
   5 
A simple web server that lets you activate a led strip via the web.
   6 
   7 
CAUTION: The code includes your network password ************
   8 
The web-page is allocated to IP 192.168.1.22
   9 
(based on a driver by Tom Igoe)
  10 
  11 
Wiring: The Led-Strip uses the WS2801 which lets you address every LED and set the color. The library must be included.
  12 
  13 
blue - gnd - gnd   (Connect GND to Powerstrip and Arduino for equal level!)  
  14 
LED-String: red -  +5V         (Power for the LED-Strip: 3x20mA x 50LEDs = 3000mA !! (Use seperate Powersupply *******)
  15 
green - C0-Clock - D3
  16 
white - D0-Data  - D2
  17 
  18 
Uses Arduino WiFi-shield (include Wifi.h)
  19 
  20 
!! To do and pitholes:
  21 
1. code is still sloppy, but works.
  22 
2. The available RAM-limit of the Arduino causes problems.
  23 
  24 
*/
  25 
#include <SPI.h>
  26 
#include <WiFi.h>
  27 
#include "Adafruit_WS2801.h" // library for the led strip
  28 
 
  29 
 
  30 
uint8_t dataPin  = 2;    // White wire on Adafruit Pixels
  31 
uint8_t clockPin = 3;    // Green wire on Adafruit Pixels
  32 
uint32_t farbe = 0;
  33 
uint32_t farbe2 = 0;
  34 
uint32_t aus = 0;
  35 
char bfarbe[] = "#FF0000";
  36 
char cfarbe[] = "#FFFF00";
  37 
String farbe1 ="#FFFF00";
  38 
int imax = 100;
  39 
 
  40 
 
  41 
// Set the first variable to the NUMBER of pixels. 50 = 50 pixels in a row
  42 
Adafruit_WS2801 strip = Adafruit_WS2801(50, dataPin, clockPin);
  43 
char ssid[] = "Wlan";            //  your network SSID (name)
  44 
char pass[] = "xxxpassword";    // your network password
  45 
int keyIndex = 0;                     // your network key Index number (needed only for WEP)
  46 
int status = WL_IDLE_STATUS;
  47 
WiFiServer server(80);
  48 
 
  49 
void setup() {
  50 
  Serial.begin(9600);      // initialize serial communication
  51 
  strip.begin();
  52 
  strip.setPixelColor(49, Color(250,0,0)); // Show boot status via red LED
  53 
  strip.show();
  54 
  // check for the presence of the shield:
  55 
  if (WiFi.status() == WL_NO_SHIELD) {
  56 
    Serial.println("WiFi shield not present");
  57 
    while(true);        // don't continue
  58 
  }
  59 
 
  60 
  // attempt to connect to Wifi network:
  61 
  while ( status != WL_CONNECTED) {
  62 
    Serial.print("Attempting to connect to Network named: ");
  63 
    Serial.println(ssid);                   // print the network name (SSID);
  64 
 
  65 
    // Connect to WPA/WPA2 network. Change this line if using open or WEP network:   
  66 
    status = WiFi.begin(ssid, pass);
  67 
    // wait 5 seconds for connection:
  68 
    delay(5000);
  69 
    Serial.print("sollte jetzt laufen");
  70 
  }
  71 
  server.begin();                           // start the web server on port 80
  72 
  printWifiStatus();                        // you're connected now, so print out the status
  73 
  strip.setPixelColor(49, Color(0,250,0));  // show online status via green LED
  74 
  strip.show();
  75 
}
  76 
 
  77 
 
  78 
void loop() {
  79 
  WiFiClient client = server.available();   // listen for incoming clients
  80 
 
  81 
  if (client) {                             // if you get a client,
  82 
    Serial.println("new client");           // print a message out the serial port
  83 
    String currentLine = "";                // make a String to hold incoming data from the client
  84 
    while (client.connected()) {            // loop while the client's connected
  85 
      if (client.available()) {             // if there's bytes to read from the client,
  86 
        char c = client.read();             // read a byte, then
  87 
        Serial.write(c);                    // print it out the serial monitor
  88 
        if (c == '\n') {                    // if the byte is a newline character
  89 
 
  90 
          // if the current line is blank, you got two newline characters in a row.
  91 
          // that's the end of the client HTTP request, so send a response:
  92 
          if (currentLine.length() == 0) { 
  93 
            // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)
  94 
            // and a content-type so the client knows what's coming, then a blank line:   
  95 
            client.println("HTTP/1.1 200 OK");
  96 
            client.println("Content-type:text/html");
  97 
            client.println();
  98 
            client.print("<html><head>");
  99 
            client.print("<title>Christmas-thoughts</title>");
 100 
            //client.print("<style>  .TextBlau { color:#0090E0; font:12px Arial,Helvetica,sans-serif; font-size:12px; width:80px; }  </style>");
 101 
            client.println("</head>");
 102 
            client.print("<body bgcolor=");
 103 
            client.print(bfarbe);
 104 
            client.print(">");
 105 
            //---Überschrift---
 106 
            client.println("<br><hr />");
 107 
            client.println("<h1 style='color:green; font-family: sans-serif;'><div>Christmas-thoughts</div></h1>");
 108 
            client.println("<hr /><br>");
 109 
          
 110 
            // Setup some buttons
 111 
 
 112 
            client.print("<INPUT Type='button';' VALUE='love you'");// pink color
 113 
            client.print("ONCLICK=window.location.href=\"/P\">");
 114 
 
 115 
            client.print("<INPUT Type='button' style= 'font-size:200%;font-family: sans-serif;'VALUE='miss you'");// green color
 116 
            client.print("ONCLICK=window.location.href=\"/G\">");
 117 
 
 118 
            client.print("<INPUT Type='button' style= 'font-size:200%;font-family: sans-serif;'VALUE='kiss'");// rainbow
 119 
            client.print("ONCLICK=window.location.href=\"/R\">");
 120 
 
 121 
            client.print("<INPUT Type='button' style= 'font-size:200%;font-family: sans-serif;'VALUE='think of you'");// zufall blink
 122 
            client.print("ONCLICK=window.location.href=\"/Z\">");
 123 
 
 124 
            client.print("<INPUT Type='button' style= 'font-size:200%;font-family: sans-serif;'VALUE='dreamt of you'");// zufall blink
 125 
            client.print("ONCLICK=window.location.href=\"/D\">");
 126 
 
 127 
            client.print("<INPUT Type='button' style= 'font-size:200%;font-family: sans-serif;'VALUE='a tree'");// grüner blinkender baum
 128 
            client.print("ONCLICK=window.location.href=\"/T\">");
 129 
 
 130 
            client.print("<INPUT Type='button' style= 'font-size:200%;font-family: sans-serif;'VALUE='0 to 50'");// durchlaufen aller leds
 131 
            client.print("ONCLICK=window.location.href=\"/0\">");
 132 
 
 133 
 
 134 
            client.print("<INPUT Type='button' style= 'font-size:200%;font-family: sans-serif;'VALUE='herz'");// pulsierendes herz
 135 
            client.print("ONCLICK=window.location.href=\"/H\">");
 136 
 
 137 
            client.print("<INPUT Type='button' style= 'font-size:200%;font-family: sans-serif;'VALUE='Love'");// love+herz
 138 
            client.print("ONCLICK=window.location.href=\"/Love\">");
 139 
 
 140 
            client.print("<INPUT Type='button' style= 'font-size:200%;font-family: sans-serif;'VALUE='off'");// lichter aus
 141 
            client.print("ONCLICK=window.location.href=\"/O\">");
 142 
 
 143 
            client.println("<br><hr />");
 144 
            // The HTTP response ends with another blank line:
 145 
            client.println();
 146 
            // break out of the while loop:
 147 
            break;        
 148 
          }
 149 
          else {      // if you got a newline, then clear currentLine:
 150 
            currentLine = "";
 151 
          }
 152 
        }    
 153 
        else if (c != '\r') {    // if you got anything else but a carriage return character,
 154 
          currentLine += c;      // add it to the end of the currentLine
 155 
        }
 156 
 
 157 
        // *** Here we check the response
 158 
        //Check to see if the client request was "GET /P" or "GET /G" etc.:
 159 
 
 160 
        if (currentLine.endsWith("GET /P")) {
 161 
          colorWipe(Color(100, 25, 30), 10);
 162 
        }
 163 
 
 164 
        if (currentLine.endsWith("GET /G")) {
 165 
          colorWipe(Color(10, 250, 30), 10);
 166 
        }
 167 
 
 168 
        if (currentLine.endsWith("GET /R")) {
 169 
          kiss();
 170 
        }
 171 
        if (currentLine.endsWith("GET /Z")) {
 172 
          colorRand();
 173 
        }
 174 
        if (currentLine.endsWith("GET /D")) {
 175 
          rainbow(10);
 176 
        }
 177 
        if (currentLine.endsWith("GET /T")) {
 178 
          christmastree();
 179 
        }
 180 
        if (currentLine.endsWith("GET /Love")) {
 181 
          wL();
 182 
          delay(100);
 183 
          wO();
 184 
          delay(100);
 185 
          wV();
 186 
          delay(100);
 187 
          wE();
 188 
          delay(100);
 189 
          herz();
 190 
        }
 191 
        if (currentLine.endsWith("GET /H")) {
 192 
          herz();
 193 
        }
 194 
        if (currentLine.endsWith("GET /0")) {
 195 
          onebyone();
 196 
        }
 197 
 
 198 
        if (currentLine.endsWith("GET /O")) {
 199 
          colorOff();
 200 
        }
 201 
      }
 202 
    }
 203 
    // close the connection:
 204 
    client.flush();
 205 
    client.stop();
 206 
    Serial.println("client disonnected");
 207 
  }
 208 
}
 209 
 
 210 
 
 211 
void printWifiStatus() {
 212 
  // print the SSID of the network you're attached to:
 213 
  Serial.print("SSID: ");
 214 
  Serial.println(WiFi.SSID());
 215 
 
 216 
  // print your WiFi shield's IP address:
 217 
  IPAddress ip = WiFi.localIP();
 218 
  Serial.print("IP Address: ");
 219 
  Serial.println(ip);
 220 
 
 221 
  // print the received signal strength:
 222 
  long rssi = WiFi.RSSI();
 223 
  Serial.print("signal strength (RSSI):");
 224 
  Serial.print(rssi);
 225 
  Serial.println(" dBm");
 226 
  // print where to go in a browser:
 227 
  Serial.print("To see this page in action, open a browser to http://");
 228 
  Serial.println(ip);
 229 
}
 230 
 
 231 
 
 232 
void rainbow(uint8_t wait) {
 233 
  int i, j;
 234 
 
 235 
  for (j=0; j < 256; j++) {     // 3 cycles of all 256 colors in the wheel
 236 
    for (i=0; i < strip.numPixels(); i++) {
 237 
      strip.setPixelColor(i, Wheel( (i + j) % 255));
 238 
    } 
 239 
    strip.show();   // write all the pixels out
 240 
    delay(wait);
 241 
  }
 242 
}
 243 
 
 244 
// Slightly different, this one makes the rainbow wheel equally distributed
 245 
// along the chain
 246 
void rainbowCycle(uint8_t wait) {
 247 
  int i, j;
 248 
 
 249 
  for (j=0; j < 256 * 5; j++) {     // 5 cycles of all 25 colors in the wheel
 250 
    for (i=0; i < strip.numPixels(); i++) {
 251 
      // tricky math! we use each pixel as a fraction of the full 96-color wheel
 252 
      // (thats the i / strip.numPixels() part)
 253 
      // Then add in j which makes the colors go around per pixel
 254 
      // the % 96 is to make the wheel cycle around
 255 
      strip.setPixelColor(i, Wheel( ((i * 256 / strip.numPixels()) + j) % 256) );
 256 
    } 
 257 
    strip.show();   // write all the pixels out
 258 
    delay(wait);
 259 
  }
 260 
}
 261 
 
 262 
// fill the dots one after the other with said color
 263 
// good for testing purposes
 264 
void colorWipe(uint32_t c, uint8_t wait) {
 265 
  int i;
 266 
 
 267 
  for (i=0; i < strip.numPixels(); i++) {
 268 
    strip.setPixelColor(i, c);
 269 
    strip.show();
 270 
    delay(wait);
 271 
  }
 272 
}
 273 
 
 274 
 
 275 
// turn off all LEDs
 276 
void colorOff() {
 277 
  int i;
 278 
 
 279 
  for (i=0; i < strip.numPixels(); i++) {
 280 
    strip.setPixelColor(i, 0);
 281 
  }
 282 
  strip.show();
 283 
}
 284 
 
 285 
 
 286 
 
 287 
 
 288 
 
 289 
/* Helper functions */
 290 
 
 291 
// Create a 24 bit color value from R,G,B
 292 
uint32_t Color(byte r, byte g, byte b)
 293 
{
 294 
  uint32_t c;
 295 
  c = r;
 296 
  c <<= 8;
 297 
  c |= g;
 298 
  c <<= 8;
 299 
  c |= b;
 300 
  return c;
 301 
}
 302 
 
 303 
//Input a value 0 to 255 to get a color value.
 304 
//The colours are a transition r - g -b - back to r
 305 
uint32_t Wheel(byte WheelPos)
 306 
{
 307 
  if (WheelPos < 85) {
 308 
    return Color(WheelPos * 3, 255 - WheelPos * 3, 0);
 309 
  }
 310 
  else if (WheelPos < 170) {
 311 
    WheelPos -= 85;
 312 
    return Color(255 - WheelPos * 3, 0, WheelPos * 3);
 313 
  }
 314 
  else {
 315 
    WheelPos -= 170;
 316 
    return Color(0, WheelPos * 3, 255 - WheelPos * 3);
 317 
  }
 318 
}
 319 
 
 320 
void colorRand(){
 321 
 
 322 
  int i=2;
 323 
  int zufall;
 324 
  farbe = Color(148,0,211);
 325 
  farbe2 = Color(200,0,20);
 326 
  for( int l=0; l<10;l++){
 327 
 
 328 
    //strip.setPixelColor(i, farbe);
 329 
    //      strip.show();
 330 
    for (int j=0; j < 50; j++){
 331 
      zufall = random(0,50);
 332 
      strip.setPixelColor(zufall, farbe);
 333 
      strip.show();
 334 
      delay(10);
 335 
      strip.setPixelColor(zufall, aus);
 336 
      if (zufall>49) {
 337 
        zufall =1;
 338 
      };
 339 
      zufall = zufall+1;
 340 
      strip.setPixelColor(zufall, farbe2);
 341 
      strip.show();
 342 
    }
 343 
  }
 344 
}
 345 
 
 346 
 
 347 
// wipe 3 colors in sequence
 348 
void kiss(){
 349 
 
 350 
  uint32_t farbe3 = 0;
 351 
  uint32_t farbe4 = 0;
 352 
  farbe3 = Color(200,0,20);
 353 
  farbe4 = Color(0,200,20);
 354 
  for( int l=0; l<6;l++){
 355 
    colorWipe(farbe3, 10);
 356 
    colorWipe(farbe4, 0);
 357 
    colorWipe(Color(255,255,0),0);
 358 
    strip.show();
 359 
    delay(10);
 360 
 
 361 
  }
 362 
}
 363 
 
 364 
void greentree(){
 365 
 
 366 
  uint32_t farbe1 = 0;// Grün
 367 
  uint32_t farbe3 = 0;// Braun
 368 
  farbe1 = Color(0,2,0);
 369 
  farbe3 = Color(36,16,4);
 370 
  int i;
 371 
 
 372 
  for (i=4; i < strip.numPixels(); i++) {
 373 
    strip.setPixelColor(i, farbe1);
 374 
 
 375 
  }
 376 
// Stamm
 377 
  strip.setPixelColor(0, farbe3);
 378 
  strip.setPixelColor(1, farbe3);
 379 
  strip.setPixelColor(2, farbe3);
 380 
  strip.setPixelColor(3, farbe3);
 381 
  strip.show();
 382 
 
 383 
}
 384 
 
 385 
// christmas-tree with colored blinking lights
 386 
void christmastree(){
 387 
  int zufall;
 388 
  int zufall2;
 389 
  uint32_t farbe1 = 0;// Grün
 390 
 
 391 
  for(int i=0; i< 10;i++){
 392 
    greentree();
 393 
    for (int j=0; j < 10; j++){
 394 
 
 395 
      zufall = random(4,50);
 396 
      zufall2 = random(1,255);
 397 
      farbe1 = Wheel(zufall2);
 398 
      strip.setPixelColor(zufall, farbe1);
 399 
      strip.show();
 400 
 
 401 
 
 402 
    }
 403 
    delay(500);
 404 
  }
 405 
 
 406 
}
 407 
 
 408 
// Light lede one by one (to check if they work)
 409 
void onebyone(){
 410 
  colorWipe(Color(0,0,0), 0);
 411 
  strip.show();
 412 
  for( int i=0; i<50; i++){
 413 
    strip.setPixelColor(i, Color(250,250,250));
 414 
    strip.show();
 415 
    delay(500);
 416 
    strip.setPixelColor(i, Color(0,0,0));
 417 
    strip.show();
 418 
  }
 419 
 
 420 
}
 421 
 
 422 
// Paint a red pulsing heart
 423 
void herz(){
 424 
  int sherz[] = {
 425 
    2,3,6,7,8,9,13,14,15,16,17,19,29,20,21,22,23,24,25,26,27,28,29,30,31,32,34,35  };
 426 
  colorOff();
 427 
 
 428 
 
 429 
  for (int j= 0; j<6;j++){
 430 
 
 431 
    for (int a=0; a<100;a++){
 432 
      for (int i=0; i< sizeof(sherz)-1;i++){
 433 
        strip.setPixelColor(sherz[i], Color(a,0,0));
 434 
      }
 435 
      strip.show();
 436 
    }
 437 
    for (int a=100; a>=0;a--){
 438 
      for (int i=0; i< sizeof(sherz)-1;i++){
 439 
        strip.setPixelColor(sherz[i], Color(a,0,0));
 440 
      }
 441 
      strip.show();
 442 
    }
 443 
  }
 444 
}
 445 
 
 446 
// Letter L
 447 
void wL(){
 448 
  int sL[]={
 449 
    4,5,6,7,8,9,10,11,12,17,18,19,20,29,30,31,32,38,39,40,41,45,46  };
 450 
  colorOff();
 451 
  for (int j=0; j<100;j++){
 452 
    for (int i=0; i< sizeof(sL)-1;i++){
 453 
      strip.setPixelColor(sL[i], Color(j,0,0));
 454 
    }
 455 
    strip.setPixelColor(0, Color(0,0,0));
 456 
    strip.show();
 457 
  }
 458 
  for (int j=imax; j>=0;j--){
 459 
    for (int i=0; i< sizeof(sL)-1;i++){
 460 
      strip.setPixelColor(sL[i], Color(j,0,0));
 461 
    }
 462 
    strip.setPixelColor(0, Color(0,0,0));
 463 
    strip.show();
 464 
  }
 465 
}
 466 
// Letter O
 467 
void wO(){
 468 
  int sO[]={
 469 
    6,7,8,9,13,14,15,16,17,19,20,23,24,25,26,29,30,31,32,33,34,35,36,37,38,39  };
 470 
  colorOff();
 471 
  for (int j=0; j<100;j++){
 472 
    for (int i=0; i< sizeof(sO)-1;i++){
 473 
      strip.setPixelColor(sO[i], Color(j,0,0));
 474 
    }
 475 
    strip.setPixelColor(0, Color(0,0,0));
 476 
    strip.show();
 477 
  }
 478 
  for (int j=imax; j>=0;j--){
 479 
    for (int i=0; i< sizeof(sO)-1;i++){
 480 
      strip.setPixelColor(sO[i], Color(j,0,0));
 481 
    }
 482 
    strip.setPixelColor(0, Color(0,0,0));
 483 
    strip.show();
 484 
  }
 485 
}
 486 
// Letter V
 487 
void wV(){
 488 
  int sV[]={
 489 
    2,7,8,14,15,16,20,21,23,26,28,29,31,32,35,36,39,40,43  };
 490 
  colorOff();
 491 
  for (int j=0; j<100;j++){
 492 
    for (int i=0; i< sizeof(sV)-1;i++){
 493 
      strip.setPixelColor(sV[i], Color(j,0,0));
 494 
    }
 495 
    strip.setPixelColor(0, Color(0,0,0));
 496 
    strip.setPixelColor(6, Color(0,0,0));
 497 
    strip.show();
 498 
  }
 499 
  for (int j=imax; j>=0;j--){
 500 
    for (int i=0; i< sizeof(sV)-1;i++){
 501 
      strip.setPixelColor(sV[i], Color(j,0,0));
 502 
    }
 503 
    strip.setPixelColor(0, Color(0,0,0));
 504 
    strip.setPixelColor(6, Color(0,0,0));
 505 
    strip.show();
 506 
  }
 507 
}
 508 
// Letter E
 509 
void wE(){
 510 
  int sE[]={
 511 
    4,5,6,7,8,9,17,18,19,20,27,28,29,30,31,32,38,39,40,41,42,43  };
 512 
  colorOff();
 513 
  for (int j=0; j<100;j++){
 514 
    for (int i=0; i< sizeof(sE)-1;i++){
 515 
      strip.setPixelColor(sE[i], Color(j,0,0));
 516 
    }
 517 
    strip.setPixelColor(0, Color(0,0,0));
 518 
    strip.show();
 519 
  }
 520 
  for (int j=imax; j>=0;j--){
 521 
    for (int i=0; i< sizeof(sE)-1;i++){
 522 
      strip.setPixelColor(sE[i], Color(j,0,0));
 523 
    }
 524 
    strip.setPixelColor(0, Color(0,0,0));
 525 
    strip.show();
 526 
  }
 527 
}
 528