#include #ifdef __AVR__ #include #endif #include #define PIN D6 #define NUMPIXELS 28 Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); #include #include #include 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 = "LedControl"; response += "

Control


"; response += "

TwoColorSwipe
" "Freaky breathe
" "Run single
" "ToggleColors

" "

Set primary:

" "
" "R: G: B:

" "

Set secondary:

" "
" "R: G: B:

" "
"; 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(); } }