Advertisement
GyroGearloose

ESP8266 Access Point Fastled DemoReel

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