lichterKette/lichterKette.ino

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