Advertisement
GyroGearloose

FastLED_Huzzah_stable_ Webserver_02_1

Feb 14th, 2016
409
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 18.62 KB | None | 0 0
  1. /*-------------------------------------------------------------------------------------
  2.    Works with Huzzah; other modules not tested yet.
  3.  
  4.    v01:   webserver extended to 7 on and off switches
  5.    v02:   added demo reel. Had to declare FastLED before
  6.           the webserver. Then put the complete webserver
  7.           into a void webserver() and leave in the loop
  8.           just the case statements and the FastLEDshow.
  9.           Added power control
  10.    v02.1  changed to a drop down menu    
  11.  
  12.   Usage:  after upload open the Serial Monitor in Arduino and see what
  13.           IP address is returned. In my case it is 192.168.1.252
  14.           Open this IP address in a browser (PC or phone)
  15.  
  16.  Gyro Gearloose, Feb 2016
  17.  
  18. /*-------------------------------------------------------------------------------------
  19. HTTP 1.1 Webserver for ESP8266 adapted to Arduino IDE
  20.  
  21. From Stefan Thesen 04/2015
  22. https://blog.thesen.eu/stabiler-http-1-1-wlan-webserver-mit-dem-esp8266-microcontroller/
  23.  
  24. Running stable for days
  25. (in difference to all samples I tried)
  26.  
  27. Does HTTP 1.1 with defined connection closing.
  28. Reconnects in case of lost WiFi.
  29. Handles empty requests in a defined manner.
  30. Handle requests for non-exisiting pages correctly.
  31.  
  32. This demo allows to switch two functions:
  33. Function 1 creates serial output and toggels GPIO2
  34. Function 2 just creates serial output.
  35.  
  36. Serial output can e.g. be used to steer an attached
  37. Arduino, Raspberry etc.
  38. ---------------------------------------------------------------------------------------*/
  39.  
  40. // FastLED setup -----FastLED has to be declared BEFORE the Webserver-----
  41. #include "FastLED.h"
  42. FASTLED_USING_NAMESPACE
  43.  
  44. #if defined(FASTLED_VERSION) && (FASTLED_VERSION < 3001000)
  45. #warning "Requires FastLED 3.1 or later; check github for latest code."
  46. #endif
  47.  
  48. #define DATA_PIN      13     // for Huzzah: Pins w/o special function:  #4, #5, #12, #13, #14; // #16 does not work :( //6
  49. //#define CLK_PIN     12
  50. //#define LED_TYPE    APA102
  51. //#define COLOR_ORDER BGR
  52. #define LED_TYPE      WS2811
  53. #define COLOR_ORDER   GRB
  54. #define NUM_LEDS      24    
  55. CRGB leds[NUM_LEDS];
  56.  
  57. #define BRIGHTNESS          96
  58. #define MILLI_AMPERE      2200
  59. #define FRAMES_PER_SECOND  120
  60.  
  61. int ledMode = 2;            // this is the starting animation
  62.  
  63. // Websever setup -----------------------------------------------------
  64. #include <ESP8266WiFi.h>
  65. // comes with Huzzah installation. Enter in Arduino settings:
  66. // http://arduino.esp8266.com/package_esp8266com_index.json
  67.  
  68. const char* ssid = "your WLAN Name here";   // 192.168.1.252
  69. const char* password = "Your password here";
  70.  
  71. unsigned long ulReqcount;
  72. unsigned long ulReconncount;
  73.  
  74. WiFiServer server(80);  // Create an instance of the server on Port 80
  75.  
  76. void setup()
  77. {
  78.  
  79.   ulReqcount=0;         // setup globals for Webserver
  80.   ulReconncount=0;
  81.  
  82.   // prepare GPIO2      // not necessary for FastLED
  83.   pinMode(2, OUTPUT);
  84.   digitalWrite(2, 0);
  85.  
  86.   // start serial
  87.   Serial.begin(9600);
  88.   delay(1);
  89.  
  90.   // inital connect
  91.   WiFi.mode(WIFI_STA);
  92.   WiFiStart();
  93.  
  94.   FastLED.addLeds<LED_TYPE,DATA_PIN,COLOR_ORDER>(leds, NUM_LEDS).setCorrection(DirectSunlight);
  95.   //FastLED.addLeds<LED_TYPE,DATA_PIN,CLK_PIN,COLOR_ORDER>(leds, NUM_LEDS).setCorrection(DirectSunlight);
  96.   FastLED.setBrightness(BRIGHTNESS);
  97.   set_max_power_in_volts_and_milliamps(5, MILLI_AMPERE);
  98. }
  99.  
  100. uint8_t gHue = 0; // rotating "base color" used by many of the patterns
  101.  
  102. void WiFiStart()
  103. {
  104.   ulReconncount++;
  105.  
  106.   // Connect to WiFi network
  107.   Serial.println();
  108.   Serial.println();
  109.   Serial.print("Connecting to ");
  110.   Serial.println(ssid);
  111.  
  112.   WiFi.begin(ssid, password);
  113.  
  114.   while (WiFi.status() != WL_CONNECTED) {
  115.     delay(500);
  116.     Serial.print(".");
  117.   }
  118.   Serial.println("");
  119.   Serial.println("WiFi connected");
  120.  
  121.   // Start the server
  122.   server.begin();
  123.   Serial.println("Server started");
  124.  
  125.   // Print the IP address
  126.   Serial.println(WiFi.localIP());
  127. }
  128.  
  129. void loop() {
  130.   webserver();
  131.  
  132.   if (ledMode != 999) {
  133.  
  134.      switch (ledMode) {
  135.       case  1: all_off(); break;
  136.       case  2: rainbow(); break;
  137.       case  3: rainbowWithGlitter(); break;
  138.       case  4: confetti(); break;
  139.       case  5: sinelon(); break;
  140.       case  6: juggle(); break;
  141.       case  7: bpm(); break;
  142.       }
  143.       }
  144.   show_at_max_brightness_for_power();
  145.   delay_at_max_brightness_for_power(1000/FRAMES_PER_SECOND);
  146. //  FastLED.show();  
  147. //  FastLED.delay(1000/FRAMES_PER_SECOND);
  148.   EVERY_N_MILLISECONDS( 20 ) { gHue++; } // slowly cycle the "base color" through the rainbow
  149.  
  150. } // end of loop *************************************************************************************
  151.  
  152. void webserver() {   /// complete web server /////////////////////////////////////////////////////////
  153.   // check if WLAN is connected
  154.   if (WiFi.status() != WL_CONNECTED)
  155.   {
  156.     WiFiStart();
  157.   }
  158.  
  159.   // Check if a client has connected
  160.   WiFiClient client = server.available();
  161.   if (!client)
  162.   {
  163.     return;
  164.   }
  165.  
  166.   // Wait until the client sends some data
  167.   Serial.println("new client");
  168.   unsigned long ultimeout = millis()+250;
  169.   while(!client.available() && (millis()<ultimeout) )
  170.   {
  171.     delay(1);
  172.   }
  173.   if(millis()>ultimeout)
  174.   {
  175.     Serial.println("client connection time-out!");
  176.     return;
  177.   }
  178.  
  179.   // Read the first line of the request
  180.   String sRequest = client.readStringUntil('\r');
  181.   //Serial.println(sRequest);
  182.   client.flush();
  183.  
  184.   // stop client, if request is empty
  185.   if(sRequest=="")
  186.   {
  187.     Serial.println("empty request! - stopping client");
  188.     client.stop();
  189.     return;
  190.   }
  191.  
  192.   // get path; end of path is either space or ?
  193.   // Syntax is e.g. GET /?pin=MOTOR1STOP HTTP/1.1
  194.   String sPath="",sParam="", sCmd="";
  195.   String sGetstart="GET ";
  196.   int iStart,iEndSpace,iEndQuest;
  197.   iStart = sRequest.indexOf(sGetstart);
  198.   if (iStart>=0)
  199.   {
  200.     iStart+=+sGetstart.length();
  201.     iEndSpace = sRequest.indexOf(" ",iStart);
  202.     iEndQuest = sRequest.indexOf("?",iStart);
  203.    
  204.     // are there parameters?
  205.     if(iEndSpace>0)
  206.     {
  207.       if(iEndQuest>0)
  208.       {
  209.         // there are parameters
  210.         sPath  = sRequest.substring(iStart,iEndQuest);
  211.         sParam = sRequest.substring(iEndQuest,iEndSpace);
  212.       }
  213.       else
  214.       {
  215.         // NO parameters
  216.         sPath  = sRequest.substring(iStart,iEndSpace);
  217.       }
  218.     }
  219.   }
  220.  
  221.   ///////////////////////////////////////////////////////////////////////////////
  222.   // output parameters to serial, you may connect e.g. an Arduino and react on it
  223.   ///////////////////////////////////////////////////////////////////////////////
  224.   if(sParam.length()>0)
  225.   {
  226.     int iEqu=sParam.indexOf("=");
  227.     if(iEqu>=0)
  228.     {
  229.       sCmd = sParam.substring(iEqu+1,sParam.length());
  230.       Serial.println(sCmd);
  231.     }
  232.   }
  233.    
  234.   ///////////////////////////
  235.   // format the html response
  236.   ///////////////////////////
  237.   String sResponse,sHeader;
  238.  
  239.   ////////////////////////////
  240.   // 404 for non-matching path
  241.   ////////////////////////////
  242.   if(sPath!="/")
  243.   {
  244.     sResponse="<html><head><title>404 Not Found</title></head><body><h1>Not Found</h1><p>The requested URL was not found on this server.</p></body></html>";
  245.    
  246.     sHeader  = "HTTP/1.1 404 Not found\r\n";
  247.     sHeader += "Content-Length: ";
  248.     sHeader += sResponse.length();
  249.     sHeader += "\r\n";
  250.     sHeader += "Content-Type: text/html\r\n";
  251.     sHeader += "Connection: close\r\n";
  252.     sHeader += "\r\n";
  253.   }
  254.   ///////////////////////
  255.   // format the html page
  256.   ///////////////////////
  257.   else
  258.   {
  259.     ulReqcount++;
  260.     sResponse  = "<html><head><title>ESP8266 control for DemoReel100</title></head><body>";
  261.     sResponse += "<font color=\"#FFFFF0\"><body bgcolor=\"#000000\">";  // first is background, second is font color
  262.     sResponse += "<FONT SIZE=-1>";
  263.     sResponse += "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=yes\">";
  264.     sResponse += "<h1>ESP8266 control for DemoReel100</h1>";
  265.  
  266. /*  this creates a list with ON / OFF buttons
  267.     // </a>&nbsp is a non-breaking space; moves next character over
  268.     sResponse += "<p>Rainbow &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href=\"?pin=FUNCTION1ON\"><button>--ON--</button></a>&nbsp;<a href=\"?pin=FUNCTION1OFF\"><button>--OFF--</button></a><br>";
  269.     sResponse += "<p>Rainbow Glitter<a href=\"?pin=FUNCTION2ON\"><button>--ON--</button></a>&nbsp;<a href=\"?pin=FUNCTION2OFF\"><button>--OFF--</button></a><br>";
  270.     sResponse += "<p>Confetti &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href=\"?pin=FUNCTION3ON\"><button>--ON--</button></a>&nbsp;<a href=\"?pin=FUNCTION3OFF\"><button>--OFF--</button></a><br>";
  271.     sResponse += "<p>Sinelon &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href=\"?pin=FUNCTION4ON\"><button>--ON--</button></a>&nbsp;<a href=\"?pin=FUNCTION4OFF\"><button>--OFF--</button></a><br>";
  272.     sResponse += "<p>Juggle&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href=\"?pin=FUNCTION5ON\"><button>--ON--</button></a>&nbsp;<a href=\"?pin=FUNCTION5OFF\"><button>--OFF--</button></a></p>";
  273.     sResponse += "<p>BPM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href=\"?pin=FUNCTION6ON\"><button>--ON--</button></a>&nbsp;<a href=\"?pin=FUNCTION6OFF\"><button>--OFF--</button></a></p>";
  274.     sResponse += "<p>Function 7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href=\"?pin=FUNCTION7ON\"><button>--ON--</button></a>&nbsp;<a href=\"?pin=FUNCTION7OFF\"><button>--OFF--</button></a></p><br>";
  275. */
  276. //  This is a nice drop down menue
  277.     sResponse += "<FONT SIZE=+1>";
  278.     sResponse += "<form>";
  279.     sResponse += "<p>Select Animation</p>";
  280.     sResponse += "<select name=\"sCmd\" size=\"7\" >";
  281.     sResponse += "<option value=\"FUNCTION1OFF\"selected>All OFF</option>";
  282.     sResponse += "<option value=\"FUNCTION1ON\">Rainbow</option>";
  283.     sResponse += "<option value=\"FUNCTION2ON\">Rainbow Glitter</option>";
  284.     sResponse += "<option value=\"FUNCTION3ON\">Confetti</option>";
  285.     sResponse += "<option value=\"FUNCTION4ON\">Sinelon</option>";
  286.     sResponse += "<option value=\"FUNCTION5ON\">Juggle</option>";
  287.     sResponse += "<option value=\"FUNCTION6ON\">BPM</option><br>";
  288.     sResponse += "</select>";
  289.     sResponse += "<br><br>";
  290.     sResponse += "<input type= submit>";
  291.     sResponse += "</form>";
  292.     sResponse += "<FONT SIZE=-1>";
  293.  
  294.     //////////////////////
  295.     // react on parameters
  296.     //////////////////////
  297.     if (sCmd.length()>0)
  298.     {
  299.       // write received command to html page
  300.       sResponse += "Command: " + sCmd + "<BR>";
  301.      
  302.       // switch GPIO
  303.       if(sCmd.indexOf("FUNCTION1ON")>=0)
  304.       {
  305.         Serial.println("1 ON");
  306.         ledMode = 2;
  307.       }
  308.       else if(sCmd.indexOf("FUNCTION1OFF")>=0)
  309.       {
  310.         Serial.println("1 OFF");
  311.         ledMode = 1;
  312.       }
  313.  
  314.       if(sCmd.indexOf("FUNCTION2ON")>=0)
  315.       {
  316.          Serial.println("2 ON");
  317.         ledMode = 3;
  318.       }
  319.       else if(sCmd.indexOf("FUNCTION2OFF")>=0)
  320.       {
  321.         Serial.println("2 OFF");
  322.         ledMode = 1;
  323.       }
  324.  
  325.       if(sCmd.indexOf("FUNCTION3ON")>=0)
  326.       {
  327.          Serial.println("3 ON");
  328.         ledMode = 4;
  329.  
  330.       }
  331.       else if(sCmd.indexOf("FUNCTION3OFF")>=0)
  332.       {
  333.         Serial.println("3 OFF");
  334.         ledMode = 1;
  335.  
  336.       }
  337.       if(sCmd.indexOf("FUNCTION4ON")>=0)
  338.       {
  339.         Serial.println("4 ON");
  340.         ledMode = 5;
  341.  
  342.       }
  343.       else if(sCmd.indexOf("FUNCTION4OFF")>=0)
  344.       {
  345.         Serial.println("4 OFF");
  346.         ledMode = 1;
  347.  
  348.       }
  349.       if(sCmd.indexOf("FUNCTION5ON")>=0)
  350.       {
  351.          Serial.println("5 ON");
  352.         ledMode = 6;
  353.  
  354.       }
  355.       else if(sCmd.indexOf("FUNCTION5OFF")>=0)
  356.       {
  357.         Serial.println("5 OFF");
  358.         ledMode = 1;
  359.  
  360.       }
  361.  
  362.       if(sCmd.indexOf("FUNCTION6ON")>=0)
  363.       {
  364.          Serial.println("6 ON");
  365.         ledMode = 7;
  366.  
  367.       }
  368.       else if(sCmd.indexOf("FUNCTION6OFF")>=0)
  369.       {
  370.         Serial.println("6 OFF");
  371.         ledMode = 1;
  372.  
  373.       }
  374.       if(sCmd.indexOf("FUNCTION7ON")>=0)
  375.       {
  376.         Serial.println("7 ON");
  377.         ledMode = 8;
  378.  
  379.       }
  380.       else if(sCmd.indexOf("FUNCTION7OFF")>=0)
  381.       {
  382.          Serial.println("7 OFF");
  383.         ledMode = 1;
  384.  
  385.       }
  386.  
  387.     } // end sCmd.length()>0
  388.    
  389.     sResponse += "<FONT SIZE=-2>";
  390.     sResponse += "<BR>clicks on page =";
  391.     sResponse += ulReqcount;
  392.     sResponse += " - connections to page =";
  393.     sResponse += ulReconncount;
  394.     sResponse += "<BR>";
  395.     sResponse += "Gyro Gearloose 02/2016<BR><BR>";
  396.     sResponse += "<font color=\"#FF0000\">";
  397.     sResponse += "DemoReel 100 by Mark Kriegsman<BR>";
  398.     sResponse += "Webserver by Stefan Thesen<BR>";
  399.     sResponse += "</body></html>";
  400.     sHeader  = "HTTP/1.1 200 OK\r\n";
  401.     sHeader += "Content-Length: ";
  402.     sHeader += sResponse.length();
  403.     sHeader += "\r\n";
  404.     sHeader += "Content-Type: text/html\r\n";
  405.     sHeader += "Connection: close\r\n";
  406.     sHeader += "\r\n";
  407.   }
  408.  
  409.   // Send the response to the client
  410.   client.print(sHeader);
  411.   client.print(sResponse);
  412.  
  413.  
  414.   // and stop the client
  415.   client.stop();
  416.   Serial.println("Client disonnected");  
  417.   }
  418. /// END of complete web server //////////////////////////////////////////////////////////////////
  419.  
  420. // LED animations ###############################################################################
  421. void all_off() {
  422.   fill_solid(leds, NUM_LEDS, CRGB::Black);
  423.   show_at_max_brightness_for_power();
  424.   delay_at_max_brightness_for_power(1000/FRAMES_PER_SECOND);  
  425.   //FastLED.show();
  426.   //FastLED.delay(1000/FRAMES_PER_SECOND);
  427. }
  428.  
  429. void rainbow()
  430. {
  431.   // FastLED's built-in rainbow generator
  432.   EVERY_N_MILLISECONDS( 20 ) { gHue++; } // slowly cycle the "base color" through the rainbow
  433.   fill_rainbow( leds, NUM_LEDS, gHue, 7);
  434.   show_at_max_brightness_for_power();
  435.   delay_at_max_brightness_for_power(1000/FRAMES_PER_SECOND);
  436. //  FastLED.show();  
  437. //  FastLED.delay(1000/FRAMES_PER_SECOND);
  438. }
  439.  
  440. void rainbowWithGlitter()
  441. {
  442.   // built-in FastLED rainbow, plus some random sparkly glitter
  443.   rainbow();
  444.   addGlitter(80);
  445. }
  446.  
  447. void addGlitter( fract8 chanceOfGlitter)
  448. {
  449.   if( random8() < chanceOfGlitter) {
  450.     leds[ random16(NUM_LEDS) ] += CRGB::White;
  451.   }
  452. }
  453.  
  454. void confetti()
  455. {
  456.   // random colored speckles that blink in and fade smoothly
  457.   fadeToBlackBy( leds, NUM_LEDS, 10);
  458.   int pos = random16(NUM_LEDS);
  459.   leds[pos] += CHSV( gHue + random8(64), 200, 255);
  460.   show_at_max_brightness_for_power();
  461.   delay_at_max_brightness_for_power(1000/FRAMES_PER_SECOND);
  462. //  FastLED.show();  
  463. //  FastLED.delay(1000/FRAMES_PER_SECOND);
  464. }
  465.  
  466. void sinelon()
  467. {
  468.   // a colored dot sweeping back and forth, with fading trails
  469.   fadeToBlackBy( leds, NUM_LEDS, 20);
  470.   int pos = beatsin16(13,0,NUM_LEDS);
  471.   leds[pos] += CHSV( gHue, 255, 192);
  472.   show_at_max_brightness_for_power();
  473.   delay_at_max_brightness_for_power(1000/FRAMES_PER_SECOND);
  474. //  FastLED.show();  
  475. //  FastLED.delay(1000/FRAMES_PER_SECOND);
  476. }
  477.  
  478. void bpm()
  479. {
  480.   // colored stripes pulsing at a defined Beats-Per-Minute (BPM)
  481.   uint8_t BeatsPerMinute = 62;
  482.   CRGBPalette16 palette = PartyColors_p;
  483.   uint8_t beat = beatsin8( BeatsPerMinute, 64, 255);
  484.   for( int i = 0; i < NUM_LEDS; i++) { //9948
  485.     leds[i] = ColorFromPalette(palette, gHue+(i*2), beat-gHue+(i*10));
  486.   }
  487.   show_at_max_brightness_for_power();
  488.   delay_at_max_brightness_for_power(1000/FRAMES_PER_SECOND);
  489. //  FastLED.show();  
  490. //  FastLED.delay(1000/FRAMES_PER_SECOND);
  491. }
  492.  
  493. void juggle() {
  494.   // eight colored dots, weaving in and out of sync with each other
  495.   fadeToBlackBy( leds, NUM_LEDS, 20);
  496.   byte dothue = 0;
  497.   for( int i = 0; i < 8; i++) {
  498.     leds[beatsin16(i+7,0,NUM_LEDS)] |= CHSV(dothue, 200, 255);
  499.     dothue += 32;
  500.   }
  501.   show_at_max_brightness_for_power();
  502.   delay_at_max_brightness_for_power(1000/FRAMES_PER_SECOND);
  503. //  FastLED.show();  
  504. //  FastLED.delay(1000/FRAMES_PER_SECOND);
  505. }
  506. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  507. /*  HTML code to try changes on w3schools.com  http://www.w3schools.com/tags/tryit.asp?filename=tryhtml_a_href
  508.  
  509. <!DOCTYPE html>
  510. <html>
  511. <font color =   #fffff0><body bgcolor=\"#000000\">   //FFFFFF0 has to be written in fffff0
  512. <FONT SIZE=-1>
  513. <h1>ESP8266 control <br>
  514. for DemoReel100</h1>
  515. <body>
  516.  
  517. <p>Rainbow &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href=\"?pin=FUNCTION1ON\"><button>--ON--</button></a>&nbsp;<a href=\"?pin=FUNCTION1OFF\"><button>--OFF--</button></a><br>
  518.  
  519. <p>Rainbow Glitter<a href=\"?pin=FUNCTION2ON\"><button>--ON--</button></a>&nbsp;<a href=\"?pin=FUNCTION2OFF\"><button>--OFF--</button></a><br>
  520.  
  521. <p>Confetti &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href=\"?pin=FUNCTION3ON\"><button>--ON--</button></a>&nbsp;<a href=\"?pin=FUNCTION3OFF\"><button>--OFF--</button></a><br>
  522.  
  523. <p>Sinelon &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href=\"?pin=FUNCTION4ON\"><button>--ON--</button></a>&nbsp;<a href=\"?pin=FUNCTION4OFF\"><button>--OFF--</button></a><br>
  524.  
  525. <p>Juggle&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href=\"?pin=FUNCTION5ON\"><button>--ON--</button></a>&nbsp;<a href=\"?pin=FUNCTION5OFF\"><button>--OFF--</button></a></p>
  526.  
  527. <p>BPM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href=\"?pin=FUNCTION6ON\"><button>--ON--</button></a>&nbsp;<a href=\"?pin=FUNCTION6OFF\"><button>--OFF--</button></a></p>
  528.  
  529. <p>Function 7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href=\"?pin=FUNCTION7ON\"><button>--ON--</button></a>&nbsp;<a href=\"?pin=FUNCTION7OFF\"><button>--OFF--</button></a></p><br>
  530.  
  531. <FONT SIZE=+1>
  532. <form>
  533. <p>Select Animation</p>
  534. <select name=\"sCmd\" size=\"7\" >
  535. <option value=\"FUNCTION1OFF\"selected>All OFF</option>
  536. <option value=\"FUNCTION1ON\">Rainbow</option>
  537. <option value=\"FUNCTION2ON\">Rainbow Glitter</option>
  538. <option value=\"FUNCTION3ON\">Confetti</option>
  539. <option value=\"FUNCTION4ON\">Sinelon</option>
  540. <option value=\"FUNCTION5ON\">Juggle</option>
  541. <option value=\"FUNCTION6ON\">BPM</option><br>
  542. </select>
  543. <br><br>
  544. <input type= submit>
  545. </form>
  546. <FONT SIZE=-1>
  547.  
  548. <FONT SIZE=-2>
  549. <BR>clicks on page =
  550.  - connections to page =
  551. <BR>
  552. Gyro Gearloose 02/2016<BR><BR>
  553. <font color= #ff0000>
  554. DemoReel 100 by Mark Kriegsman<BR>
  555. Webserver by Stefan Thesen<BR>
  556.  
  557. </body>
  558. </html>
  559.  
  560.  
  561. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement