#include "FastLED.h" #include #include #define NUM_LEDS 150 //50 #define DATA_PIN 9 int NUMBER_OF_ANIMATIONS = 7; int NUMBER_OF_LEDS = 150; char ssid[] = "Telia-E39815"; char pass[] = "B3C606D8E7"; boolean doing_animation = true; int current_animation = 0; int loops_since_http = 0; int animation_step_time = 0; int animation_i = 0; int animation_var_1 = 0; int animation_table_1[10][8] = {}; long last_animation_millis = millis(); long latest_animation_change = millis(); //typedef enum {STATE_A = 0, STATE_B = 1} State_type; extern void animation_rainbow(); // forward declaration extern void animation_running(); // forward declaration extern void animation_chasing(); extern void animation_off(); extern void animation_random1(); extern void animation_rgb_light(); extern void animation_random2(); void (*animation_table[])() = {animation_off, animation_rainbow, animation_running, animation_chasing, animation_random1, animation_rgb_light, animation_random2}; extern void setup_rainbow(); // forward declaration extern void setup_random1(); extern void normal_setup(); extern void setup_chosen(int, int, CRGB, boolean, int, int); extern void setup_random2(); void (*setup_table[])() = {animation_off, setup_rainbow, normal_setup, normal_setup, setup_random1, normal_setup, setup_random2}; CRGB leds[NUM_LEDS]; int status = WL_IDLE_STATUS; WiFiServer server(80); void setup() { setup_random1(); // put your setup code here, to run once: //Serial.begin(9600); Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } Serial.println("Starting"); FastLED.addLeds(leds, NUM_LEDS).setCorrection( TypicalLEDStrip ); //TM1804 BRG FastLED.setBrightness(255); FastLED.clear(); FastLED.show(); Serial.println("Connected LEDs"); delay(1000); // for (int i = 15; i >= 10; i--) { //Remove this when small spce left // uint8_t color = i*(NUM_LEDS/10 - 1) + NUM_LEDS/10; // for (int currentLed = 5; currentLed >= 0; currentLed--) { // leds[currentLed + i*5] = CRGB(color, 255-color, 0); // leds[5-currentLed + NUM_LEDS/2-5 + ((NUM_LEDS/10 - i)*5)] = CRGB(color, 255-color, 0); // FastLED.show(); // delay(5*i/3 + random(0, 25*i + 1) + 1); // } // } //pinMode(DATA_PIN, OUTPUT); boolean first_check = true; while (status != WL_CONNECTED) { Serial.print("Attempting to connect to SSID: "); Serial.println(ssid); // Connect to WPA/WPA2 network. Change this line if using open or WEP network: status = WiFi.begin(ssid, pass); // wait 10 seconds for connection: if (first_check) { delay(1000); first_check = false; } else { delay(10000); } } Serial.println("Connected to WiFi"); // for (int i = 10; i >= 5; i--) { //Remove this when small spce left // uint8_t color = i*(NUM_LEDS/10 - 1) + NUM_LEDS/10; // for (int currentLed = 5; currentLed >= 0; currentLed--) { // leds[currentLed + i*5] = CRGB(color, 255-color, 0); // leds[5-currentLed + NUM_LEDS/2-5 + ((NUM_LEDS/10 - i)*5)] = CRGB(color, 255-color, 0); // FastLED.show(); // delay(5*i/3 + random(0, 25*i + 1) + 1); // } // } Serial.println(WiFi.localIP()); server.begin(); delay(1000); Serial.println("Ready"); // for (int i = 5; i >= 0; i--) { //insert this when small space -> for (int i = (NUM_LEDS / 5) / 2; i >= 0; i--) { // uint8_t color = i*(NUM_LEDS/10 - 1) + NUM_LEDS/10; // for (int currentLed = 5; currentLed >= 0; currentLed--) { // leds[currentLed + i*5] = CRGB(color, 255-color, 0); // leds[5-currentLed + NUM_LEDS/2-5 + ((NUM_LEDS/10 - i)*5)] = CRGB(color, 255-color, 0); // FastLED.show(); // delay(5*i/3 + random(0, 25*i + 1) + 1); // } // } delay(1000); current_animation = 0; setup_table[current_animation](); Serial.println("Started"); } void loop() { loops_since_http += 1; long current_millis = millis(); if (current_millis - last_animation_millis >= animation_step_time && loops_since_http < 100) { if (doing_animation) { animation_table[current_animation](); } else { if (animation_var_1 == 1) { animation_fade_help(); } else { delay(5); } } last_animation_millis = current_millis; } else { loops_since_http = 0; //Serial.println("Waiting for animation"); status=WiFi.status(); if (status == WL_DISCONNECTED || status == WL_CONNECTION_LOST) { while (status != WL_CONNECTED) { status = WiFi.begin(ssid, pass); delay(1000); } } process_HTTP(); delay(1); } // put your main code here, to run repeatedly: //Serial.println("Hello"); //delay(1000); // leds[3] = CRGB::Blue; // leds[0] = CRGB::Red; // leds[1] = CRGB::Green; // leds[49] = CRGB::White; // FastLED.clear(); // FastLED.show(); // uint8_t delta = 10; // for (uint8_t i = 0; i < 360; i++) { // //leds[i] = CRGB(255-i*4, 255-i*4, 255-i*4); // fill_rainbow(leds, NUM_LEDS, i, delta); // FastLED.show(); // delay(10); // } } void process_HTTP() { WiFiClient client = server.available(); if (client && millis() - latest_animation_change > 1000) { int anim = 0; Serial.println("new client"); // an http request ends with a blank line int readingState = 0; int leds1 = 0; int leds2 = 0; uint8_t newR = 0; uint8_t newG = 0; uint8_t newB = 0; int doFade = 0; //Between 0 and 1 int cycles = 20; int cycleLength = 100; int currentLoop = 0; int setting = 0; int value = 0; String fullArguments = ""; while (client.connected()) { if (client.available()) { char c = client.read(); //Serial.write(c); if (readingState == 2) { //http://192.168.112.41/z0:49:0:255:0:0:20:1000; if (c == ';') { client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/plain"); client.println("Connection: close"); // the connection will be closed after completion of the response client.println(); client.println("OK"); break; } else if (c == ':') { if (currentLoop == 0) { leds1 = max(fullArguments.toInt(), 0); } else if (currentLoop == 1) { leds2 = min(fullArguments.toInt(), NUM_LEDS - 1); } else if (currentLoop == 2) { newR = min(max(fullArguments.toInt(), 0), 255); } else if (currentLoop == 3) { newG = min(max(fullArguments.toInt(), 0), 255); } else if (currentLoop == 4) { newB = min(max(fullArguments.toInt(), 0), 255); } else if (currentLoop == 5) { doFade = fullArguments.toInt() % 2; } else if (currentLoop == 6) { cycles = fullArguments.toInt(); } else if (currentLoop == 7) { cycleLength = min(fullArguments.toInt(), 40); } fullArguments = ""; currentLoop++; } else { fullArguments = fullArguments + c; } } else if (readingState == 3) { Serial.println("Inside readingState == 3"); if (c == ';') { client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/plain"); client.println("Connection: close"); // the connection will be closed after completion of the response client.println(); client.println("OK"); break; } else if (c == ':') { if (currentLoop == 0) { setting = fullArguments.toInt(); } else if (currentLoop == 1) { value = fullArguments.toInt(); Serial.println(value); } fullArguments = ""; currentLoop++; Serial.println(currentLoop); } else { fullArguments = fullArguments + c; Serial.println(fullArguments); } } else if (readingState != 0) { if (c == 'y') { readingState = 3; continue; } if (c == 'z') { readingState = 2; continue; } else if (c == '(') { anim = current_animation - 1; if (anim < 0) { anim = NUMBER_OF_ANIMATIONS - 1; } } else if (c == ')') { anim = current_animation + 1; } else { anim = c - 'A'; } if (anim < 0) { anim = -anim; } anim %= NUMBER_OF_ANIMATIONS; client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/plain"); client.println("Connection: close"); // the connection will be closed after completion of the response client.println(); client.println("OK"); break; } if (c == '/') { readingState = 1; } } } // give the web browser time to receive the data delay(300); // close the connection: client.stop(); //Serial.println("client disconnected"); if (readingState == 1) { doing_animation = true; setup_table[anim](); current_animation = anim; latest_animation_change = millis(); } else if (readingState == 3) { Serial.println(setting); Serial.println(value); if (setting == 1) { animation_step_time = value; } else if (setting == 2) { animation_var_1 = value; } } else if (readingState == 2) { doing_animation = false; // Serial.println(leds1); // Serial.println(leds2); // Serial.println(newR); // Serial.println(newG); // Serial.println(newB); // Serial.println(doFade); setup_chosen(leds1, leds2, CRGB(newR, newG, newB), (boolean) doFade, cycles, cycleLength); } } } void clear_strip() { FastLED.clear(); FastLED.show(); } void animation_fade_help() { int leds1 = animation_table_1[0][0]; int leds2 = animation_table_1[0][1]; int finnishR = animation_table_1[0][2]; int finnishG = animation_table_1[0][3]; int finnishB = animation_table_1[0][4]; int cycles = animation_table_1[0][5]; int startR = animation_table_1[0][6]; int startG = animation_table_1[0][7]; int startB = animation_table_1[1][0]; uint8_t r = (finnishR - startR) * animation_i / cycles + startR; uint8_t g = (finnishG - startG) * animation_i / cycles + startG; uint8_t b = (finnishB - startB) * animation_i / cycles + startB; for (int i = leds1; i <= leds2; i++) { leds[i] = CRGB(r, g, b); } animation_i++; if (animation_i >= cycles) { for (int i = leds1; i < leds2; i++) { leds[i] = CRGB(finnishR, finnishG, finnishB); } animation_var_1 = 0; } FastLED.show(); } void setup_chosen(int lamps1, int lamps2, CRGB newColor, boolean doFade = false, int cycles = 20, int cycleLength = 100) { animation_step_time = cycleLength; animation_var_1 = (int) doFade; animation_i = 0; doing_animation = false; if (doFade) { animation_table_1[0][0] = lamps1; animation_table_1[0][1] = lamps2; animation_table_1[0][2] = newColor.r; animation_table_1[0][3] = newColor.g; animation_table_1[0][4] = newColor.b; animation_table_1[0][5] = cycles; animation_table_1[0][6] = leds[lamps1].r; animation_table_1[0][7] = leds[lamps1].g; animation_table_1[1][0] = leds[lamps1].b; } else { for (int i = lamps1; i <= lamps2; i++) { leds[i] = newColor; } FastLED.show(); } }