315 lines
		
	
	
		
			8.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			315 lines
		
	
	
		
			8.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include <Adafruit_NeoPixel.h>
 | |
| #ifdef __AVR__
 | |
| #include <avr/power.h>
 | |
| #endif
 | |
| 
 | |
| #include <EEPROM.h>
 | |
| 
 | |
| #define PIN            D6
 | |
| #define NUMPIXELS      28
 | |
| Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
 | |
| 
 | |
| #include <ESP8266WiFi.h>
 | |
| #include <DNSServer.h>
 | |
| #include <ESP8266WebServer.h>
 | |
| 
 | |
| const byte DNS_PORT = 53;
 | |
| IPAddress apIP(192, 168, 1, 1);
 | |
| DNSServer dnsServer;
 | |
| ESP8266WebServer webServer(80);
 | |
| unsigned long previousMillis = 0;
 | |
| 
 | |
| unsigned long interval = 0;
 | |
| int mode = 0;
 | |
| int element = 0;
 | |
| bool state = false;
 | |
| 
 | |
| //for fading
 | |
| float val = 0;
 | |
| 
 | |
| unsigned int  luma = 0;
 | |
| unsigned int  color_r = 0;
 | |
| unsigned int color_g  = 0;
 | |
| unsigned int color_b = 0;
 | |
| 
 | |
| unsigned int primary_r = 50;
 | |
| unsigned int primary_g = 255;
 | |
| unsigned int primary_b = 0;
 | |
| 
 | |
| unsigned int second_r = 0;
 | |
| unsigned int second_g = 0;
 | |
| unsigned int second_b = 255;
 | |
| 
 | |
| String responseHTML() {
 | |
| 
 | |
|   String response =     "<!DOCTYPE html><html><head><title>LedControl</title></head><body>";
 | |
|   response += "<h1>Control</h1><br>";
 | |
| 
 | |
|   response += "<p ";
 | |
|   response += "style='background-color: rgb(";
 | |
|   response += primary_r;
 | |
|   response += ",";
 | |
|   response += primary_g;
 | |
|   response += ",";
 | |
|   response += primary_b;
 | |
|   response += ");'>Primary</p><br>";
 | |
| 
 | |
|   response += "<p ";
 | |
|   response += "style='background-color: rgb(";
 | |
|   response += second_r;
 | |
|   response += ",";
 | |
|   response += second_g;
 | |
|   response += ",";
 | |
|   response += second_b;
 | |
|   response += ");'>Secondary</p><br>";
 | |
| 
 | |
|   response += "<br><a style='font-size:100px;' href='http://192.168.1.1/on'>On</a><br><br><a style='font-size:100px;'href='http://192.168.1.1/off'>Off</a><br>"
 | |
|               "<a style='font-size:100px;' href='http://192.168.1.1/show?num=1'>TwoColorSwipe</a><br>"
 | |
|               "<a style='font-size:100px;' href='http://192.168.1.1/show?num=2'>Freaky breathe</a><br>"
 | |
|               "<a style='font-size:100px;' href='http://192.168.1.1/show?num=3'>Run single</a><br>"
 | |
|               "<a style='font-size:100px;' href='http://192.168.1.1/show?num=4'>ToggleColors</a><br><br>"
 | |
|               "<h1>Set primary:</h1>"
 | |
|               "<form method='GET' action='prime'>"
 | |
|               "R: <input type='number'name='r' min='0' max='255'> G: <input type='number'name='g' min='0' max='255'> B: <input type='number'name='b' min='0' max='255'><br><input type='submit' value='Set'></form><br>"
 | |
|               "<h1>Set secondary:</h1>"
 | |
|               "<form method='GET' action='second'>"
 | |
|               "R: <input type='number'name='r' min='0' max='255'> G: <input type='number'name='g' min='0' max='255'> B: <input type='number'name='b' min='0' max='255'><br><input type='submit' value='Set'></form><br>"
 | |
|               "<br></body></html>";
 | |
| 
 | |
|   return response;
 | |
| }
 | |
| 
 | |
| 
 | |
| void handleOn() {
 | |
|   mode = 0;
 | |
|   for (int i = 0; i < NUMPIXELS; i++) {
 | |
|     strip.setPixelColor(i, strip.Color(primary_g, primary_r, primary_b));
 | |
|   }
 | |
|   strip.show();
 | |
|   webServer.send(200, "text/html", responseHTML());
 | |
| }
 | |
| 
 | |
| 
 | |
| void handlePrime() {
 | |
|   for ( uint8_t i = 0; i < webServer.args(); i++ ) {
 | |
|     if (webServer.argName( i ) == "r") {
 | |
|       char buf[3];
 | |
|       webServer.arg( i ).toCharArray(buf, 4);
 | |
|       int num = atoi(buf);
 | |
|       if ((0 <= num) && (num < 256)) {
 | |
|         primary_r = num;
 | |
|         EEPROM.write(0, num);
 | |
|       }
 | |
|     } else if (webServer.argName( i ) == "g") {
 | |
|       char buf[3];
 | |
|       webServer.arg( i ).toCharArray(buf, 4);
 | |
|       int num = atoi(buf);
 | |
|       if ((0 <= num) && (num < 256)) {
 | |
|         primary_g = num;
 | |
|         EEPROM.write(1, num);
 | |
|       }
 | |
|     } else if (webServer.argName( i ) == "b") {
 | |
|       char buf[3];
 | |
|       webServer.arg( i ).toCharArray(buf, 4);
 | |
|       int num = atoi(buf);
 | |
|       if ((0 <= num) && (num < 256)) {
 | |
|         primary_b = num;
 | |
|         EEPROM.write(2, num);
 | |
|       }
 | |
|     }
 | |
|   }
 | |
|   EEPROM.commit();
 | |
|   Serial.println("Setting prime color");
 | |
|   webServer.send(200, "text/html", responseHTML());
 | |
| }
 | |
| void handleSecond() {
 | |
| 
 | |
|   for ( uint8_t i = 0; i < webServer.args(); i++ ) {
 | |
|     if (webServer.argName( i ) == "r") {
 | |
|       char buf[3];
 | |
|       webServer.arg( i ).toCharArray(buf, 4);
 | |
|       int num = atoi(buf);
 | |
|       if ((0 <= num) && (num < 256)) {
 | |
|         second_r = num;
 | |
|         EEPROM.write(3, num);
 | |
|       }
 | |
|     } else if (webServer.argName( i ) == "g") {
 | |
|       char buf[3];
 | |
|       webServer.arg( i ).toCharArray(buf, 4);
 | |
|       int num = atoi(buf);
 | |
|       if ((0 <= num) && (num < 256)) {
 | |
|         second_g = num;
 | |
|         EEPROM.write(4, num);
 | |
|       }
 | |
|     } else if (webServer.argName( i ) == "b") {
 | |
|       char buf[3];
 | |
|       webServer.arg( i ).toCharArray(buf, 4);
 | |
|       int num = atoi(buf);
 | |
|       if ((0 <= num) && (num < 256)) {
 | |
|         second_b = num;
 | |
|         EEPROM.write(5, num);
 | |
|       }
 | |
|     }
 | |
|   }
 | |
|   EEPROM.commit();
 | |
|   Serial.println("Setting second color");
 | |
|   webServer.send(200, "text/html", responseHTML());
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| void handleOff() {
 | |
|   mode = 0;
 | |
|   for (int i = 0; i < NUMPIXELS; i++) {
 | |
|     strip.setPixelColor(i, strip.Color(0, 0, 0)); // off
 | |
|   }
 | |
|   strip.show();
 | |
|   webServer.send(200, "text/html", responseHTML());
 | |
| }
 | |
| void handleShow() {
 | |
|   for ( uint8_t i = 0; i < webServer.args(); i++ ) {
 | |
|     if (webServer.argName( i ) == "num") {
 | |
|       char buf[3];
 | |
|       webServer.arg( i ).toCharArray(buf, 3);
 | |
|       int num = atoi(buf);
 | |
|       switch (num) {
 | |
|         case 0:
 | |
|           mode = 0;
 | |
|           Serial.println("leds should be off here");
 | |
|           break;
 | |
|         case 1:
 | |
|           mode = 1;
 | |
|           Serial.println("mode 1 run");
 | |
|           break;
 | |
|         case 2:
 | |
|           mode = 2;
 | |
|           Serial.println("mode 2 runSingle");
 | |
|           break;
 | |
|         case 3:
 | |
|           mode = 3;
 | |
|           Serial.println("mode 3 freaky breath");
 | |
|           break;
 | |
|         case 4:
 | |
|           mode = 4;
 | |
|           Serial.println("mode 4");
 | |
|           break;
 | |
|       }
 | |
|       Serial.println(num);
 | |
|     }
 | |
|   }
 | |
|   webServer.send(200, "text/html", responseHTML());
 | |
| }
 | |
| void setup() {
 | |
|   strip.begin();
 | |
|   Serial.begin(115200);
 | |
|   Serial.println("Ready");
 | |
|   EEPROM.begin(512);
 | |
| 
 | |
|   //read colors from eeprom
 | |
| 
 | |
|   primary_r = EEPROM.read(0);
 | |
|   primary_g = EEPROM.read(1);
 | |
|   primary_b = EEPROM.read(2);
 | |
| 
 | |
|   second_r = EEPROM.read(3);
 | |
|   second_g = EEPROM.read(4);
 | |
|   second_b = EEPROM.read(5);
 | |
| 
 | |
|   WiFi.mode(WIFI_AP);
 | |
|   WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0));
 | |
|   WiFi.softAP("LedControl", "wien60pioneers");
 | |
| 
 | |
| 
 | |
|   // if DNSServer is started with "*" for domain name, it will reply with
 | |
|   // provided IP to all DNS request
 | |
|   dnsServer.start(DNS_PORT, "*", apIP);
 | |
| 
 | |
|   webServer.on("/on", handleOn);
 | |
|   webServer.on("/off", handleOff);
 | |
| 
 | |
|   webServer.on("/show", handleShow);
 | |
| 
 | |
|   webServer.on("/prime", handlePrime);
 | |
|   webServer.on("/second", handleSecond);
 | |
| 
 | |
| 
 | |
|   webServer.onNotFound([]() {
 | |
|     webServer.send(200, "text/html", responseHTML());
 | |
|   });
 | |
| 
 | |
|   webServer.begin();
 | |
| 
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| void loop() {
 | |
|   dnsServer.processNextRequest();
 | |
|   webServer.handleClient();
 | |
| 
 | |
|   if (millis() - previousMillis >= interval) {
 | |
|     // save the last time you blinked the LED
 | |
|     previousMillis = millis();
 | |
| 
 | |
|     switch (mode) {
 | |
| 
 | |
|       case 1: //2colorchange
 | |
|         interval = 100;
 | |
|         if (element < NUMPIXELS) {
 | |
|           element++;
 | |
|         } else {
 | |
|           element = 0;
 | |
|           state = !state; //toggle colors
 | |
|         }
 | |
| 
 | |
|         if (state) {
 | |
|           strip.setPixelColor(element, strip.Color(primary_g, primary_r, primary_b));
 | |
|         } else {
 | |
|           strip.setPixelColor(element, strip.Color(second_g, second_r, second_b));
 | |
|         }
 | |
|         strip.show();
 | |
|         break;
 | |
|       case 2: // fading
 | |
|         interval = 10;
 | |
|         val = ((exp(sin(millis() / 2000.0 * PI)) - 0.36787944) * 108.0) + 1;
 | |
|         if (val > 255) val = 255;
 | |
|         if (val < 50) val = 50;
 | |
|         for (int i = 0; i < NUMPIXELS; i++) {
 | |
|           strip.setPixelColor(i, strip.Color(round((primary_g / 255)*val), round((primary_r / 255)*val), round((primary_b / 255)*val)));
 | |
|           //strip.setPixelColor(i, strip.Color(val, val, val));
 | |
|         }
 | |
|         if (val > 80)strip.show();
 | |
|         break;
 | |
|       case 3:
 | |
|         //run single
 | |
|         interval = 150;
 | |
|         if (element < NUMPIXELS)
 | |
|           element++;
 | |
|         else
 | |
|           element = 0;
 | |
|         for (int i = 0; i < NUMPIXELS; i++) {
 | |
|           strip.setPixelColor(i, strip.Color(((i == element) ? second_g : primary_g), ((i == element) ? second_r  : primary_r), ((i == element) ? second_b  : primary_b)));
 | |
|         }
 | |
|         strip.show();
 | |
|         break;
 | |
|       case 4:
 | |
|         //switch every second
 | |
|         interval = 400;
 | |
|         for (int i = 0; i < NUMPIXELS; i = i + 2) {
 | |
|           strip.setPixelColor(i, strip.Color(((state) ? second_g : primary_g), ((state) ? second_r  : primary_r), ((state) ? second_b  : primary_b)));
 | |
|         }
 | |
|         for (int i = 1; i < NUMPIXELS; i = i + 2) {
 | |
|           strip.setPixelColor(i, strip.Color(((!state) ? second_g : primary_g), ((!state) ? second_r  : primary_r), ((!state) ? second_b  : primary_b)));
 | |
|         }
 | |
|         state = !state;
 | |
|         strip.show();
 | |
|         break;
 | |
|       default:
 | |
|         // nothing
 | |
|         break;
 | |
|     }
 | |
|     previousMillis = millis();
 | |
|   }
 | |
| }
 | |
| 
 |