From 2dabe1a789672c3ca258b0cb8d68e40bed45c3ab Mon Sep 17 00:00:00 2001 From: Thierry Degeling Date: Sun, 10 Jan 2016 20:35:52 +0100 Subject: [PATCH] added arduino code for sparkles over engineering screen --- .../stript_over_engineering_screen.ino | 110 ++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 stript_over_engineering_screen/stript_over_engineering_screen.ino diff --git a/stript_over_engineering_screen/stript_over_engineering_screen.ino b/stript_over_engineering_screen/stript_over_engineering_screen.ino new file mode 100644 index 0000000..e047ea7 --- /dev/null +++ b/stript_over_engineering_screen/stript_over_engineering_screen.ino @@ -0,0 +1,110 @@ +/* + Multicolored Plasma for the Arduino Micro-Controller and NeoPixel Shield + Copyright (C) 2013 John Ericksen + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + You should have received a copy of the GNU General Public License + along with this program. If not, see http://www.gnu.org/licenses/. +*/ + +#include "LPD8806.h" +#include "SPI.h" // Comment out this line if using Trinket or Gemma +#ifdef __AVR_ATtiny85__ + #include +#endif + +// Parameter 1 = number of pixels in strip +// Parameter 2 = pin number (most are valid) +// Parameter 3 = pixel type flags, add together as needed: +// NEO_RGB Pixels are wired for RGB bitstream +// NEO_GRB Pixels are wired for GRB bitstream +// NEO_KHZ400 400 KHz bitstream (e.g. FLORA pixels) +// NEO_KHZ800 800 KHz bitstream (e.g. High Density LED strip) +const int NUM_LEDS = 128; +const int LED_PIN = 3; + +int dataPin = 9; +int clockPin = 10; + +LPD8806 strip = LPD8806(NUM_LEDS, dataPin, clockPin); +//Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800); + +// Convenient 2D point structure +struct Point { + float x; + float y; +}; + + +float phase = 0.0; +float phaseIncrement = 0.03; // Controls the speed of the moving points. Higher == faster. I like 0.08 . +float colorStretch = 0.3; // Higher numbers will produce tighter color bands. I like 0.11 . +String ColString, RowString, PixString, console; +int pixel; + +void setup() { + strip.begin(); + strip.show(); // Initialize all pixels to 'off' +} + +// This function is called every frame. +void loop() { + phase += phaseIncrement; + + // The two points move along Lissajious curves, see: http://en.wikipedia.org/wiki/Lissajous_curve + // We want values that fit the LED grid: x values between 0..13, y values between 0..8 . + // The sin() function returns values in the range of -1.0..1.0, so scale these to our desired ranges. + // The phase value is multiplied by various constants; I chose these semi-randomly, to produce a nice motion. + Point p1 = { (sin(phase*1.000)+1.0) * 4.5, (sin(phase*1.310)+1.0) * 4.0 }; + Point p2 = { (sin(phase*1.770)+1.0) * 4.5, (sin(phase*2.865)+1.0) * 4.0 }; + Point p3 = { (sin(phase*0.250)+1.0) * 4.5, (sin(phase*0.750)+1.0) * 4.0 }; + + byte row, col; + + // For each row... + for( row=0; row<16; row++ ) { + float row_f = float(row); // Optimization: Keep a floating point value of the row number, instead of recasting it repeatedly. + + // For each column... + for( col=0; col<8; col++ ) { + float col_f = float(col); // Optimization. + + // Calculate the distance between this LED, and p1. + Point dist1 = { col_f - p1.x, row_f - p1.y }; // The vector from p1 to this LED. + float distance1 = sqrt( dist1.x*dist1.x + dist1.y*dist1.y ); + + // Calculate the distance between this LED, and p2. + Point dist2 = { col_f - p2.x, row_f - p2.y }; // The vector from p2 to this LED. + float distance2 = sqrt( dist2.x*dist2.x + dist2.y*dist2.y ); + + // Calculate the distance between this LED, and p3. + Point dist3 = { col_f - p3.x, row_f - p3.y }; // The vector from p3 to this LED. + float distance3 = sqrt( dist3.x*dist3.x + dist3.y*dist3.y ); + + // Warp the distance with a sin() function. As the distance value increases, the LEDs will get light,dark,light,dark,etc... + // You can use a cos() for slightly different shading, or experiment with other functions. Go crazy! + float color_1 = distance1; // range: 0.0...1.0 + float color_2 = distance2; + float color_3 = distance3; + float color_4 = (sin( distance1 * distance2 * colorStretch )) + 2.0 * 0.5; + + // Square the color_f value to weight it towards 0. The image will be darker and have higher contrast. + color_1 *= color_1 * color_4; + color_2 *= color_2 * color_4; + color_3 *= color_3 * color_4; + color_4 *= color_4; + + // Scale the color up to 0..7 . Max brightness is 7. + strip.setPixelColor(pixel, strip.Color(color_1, color_2, color_3)); + //strip.setPixelColor(pixel, strip.Color(255, 0, 0)); + strip.setPixelColor(127-pixel, strip.Color(color_1, color_2, color_3)); + } + } + strip.show(); +}