// This is the mounting point for the Time Flux Capacitor (obtained from the locked briefcase)
// When the flux capacitor is mounted onto the receptacle, the room door lock opens.
// For the sake of convenience, 12 units of WS2812 led bulbs also are connected to the arduino of this mounting point.
// The 12 led bulbs in the actual installation consists of three led pixels/bulb, for a total of 36 pixels.
// These 12 bulbs can be represented as 1 pixel in the Neoring, for now.
// The mounting point of the Flux Capacitor has two magnetic switches, and the flux capacitor
// item can be put in two ways and still trigger one of the two magnetic switches.
// The flux capacitor is made from a barbell with a magnet at one end.
// The lights are continuosuly giving clues in the background, while cycling through four light
// configurations, denoted by the on-off pattern by the 12 bulbs and what color the pattern is lit
// This gives the clues to the locked briefcase installation.
// Four patterns for 12 bulbs:
// Pattern 1: 0010 1000 1101 (lit in blue)
// Pattern 2: 0110 0110 0111 (lit in green)
// Pattern 3: 1001 1000 1111 (lit in red)
// Pattern 4: 0011 0001 0101 (lit in yellow)
// Components:
// Button 1 - Magnetic sensor 1
// Button 2 - magnetic sensor 2
// 12 led bulbs - 12 led pixels
// Relay - door lock relay
// Game starts with the lights cycling continuously
// probably on for 5 seconds, then fadez out, then second pattern is faded in, holds for 5 seconds, fades out...
// ...and so on.
// When any of the 2 switches is triggered, the relay is turned LOW
#include <FastLED_NeoPixel.h>
#define DATA_PIN 7
#define NUM_LEDS 36
#define BRIGHTNESS 100
#define BLINK_TIME 1000
FastLED_NeoPixel<NUM_LEDS, DATA_PIN, NEO_GRB> strip;
void pattern_process(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8, int p9, int p10, int p11, int p12, uint8_t brightness, uint32_t color){
(p1 == 1) ? strip.setPixelColor(0, color) : strip.setPixelColor(0, strip.Color(0, 0, 0)); // set pixel 0 to black strip.Color(0, 0, 0)
(p1 == 1) ? strip.setPixelColor(1, color) : strip.setPixelColor(1, strip.Color(0, 0, 0));
(p1 == 1) ? strip.setPixelColor(2, color) : strip.setPixelColor(2, strip.Color(0, 0, 0));
(p2 == 1) ? strip.setPixelColor(3, color) : strip.setPixelColor(3, strip.Color(0, 0, 0));
(p2 == 1) ? strip.setPixelColor(4, color) : strip.setPixelColor(4, strip.Color(0, 0, 0));
(p2 == 1) ? strip.setPixelColor(5, color) : strip.setPixelColor(5, strip.Color(0, 0, 0));
(p3 == 1) ? strip.setPixelColor(6, color) : strip.setPixelColor(6, strip.Color(0, 0, 0));
(p3 == 1) ? strip.setPixelColor(7, color) : strip.setPixelColor(7, strip.Color(0, 0, 0));
(p3 == 1) ? strip.setPixelColor(8, color) : strip.setPixelColor(8, strip.Color(0, 0, 0));
(p4 == 1) ? strip.setPixelColor(9, color) : strip.setPixelColor(9, strip.Color(0, 0, 0));
(p4 == 1) ? strip.setPixelColor(10, color) : strip.setPixelColor(10, strip.Color(0, 0, 0));
(p4 == 1) ? strip.setPixelColor(11, color) : strip.setPixelColor(11, strip.Color(0, 0, 0));
(p5 == 1) ? strip.setPixelColor(12, color) : strip.setPixelColor(12, strip.Color(0, 0, 0));
(p5 == 1) ? strip.setPixelColor(13, color) : strip.setPixelColor(13, strip.Color(0, 0, 0));
(p5 == 1) ? strip.setPixelColor(14, color) : strip.setPixelColor(14, strip.Color(0, 0, 0));
(p6 == 1) ? strip.setPixelColor(15, color) : strip.setPixelColor(15, strip.Color(0, 0, 0));
(p6 == 1) ? strip.setPixelColor(16, color) : strip.setPixelColor(16, strip.Color(0, 0, 0));
(p6 == 1) ? strip.setPixelColor(17, color) : strip.setPixelColor(17, strip.Color(0, 0, 0));
(p7 == 1) ? strip.setPixelColor(18, color) : strip.setPixelColor(18, strip.Color(0, 0, 0));
(p7 == 1) ? strip.setPixelColor(19, color) : strip.setPixelColor(19, strip.Color(0, 0, 0));
(p7 == 1) ? strip.setPixelColor(20, color) : strip.setPixelColor(20, strip.Color(0, 0, 0));
(p8 == 1) ? strip.setPixelColor(21, color) : strip.setPixelColor(21, strip.Color(0, 0, 0));
(p8 == 1) ? strip.setPixelColor(22, color) : strip.setPixelColor(22, strip.Color(0, 0, 0));
(p8 == 1) ? strip.setPixelColor(23, color) : strip.setPixelColor(23, strip.Color(0, 0, 0));
(p9 == 1) ? strip.setPixelColor(24, color) : strip.setPixelColor(24, strip.Color(0, 0, 0));
(p9 == 1) ? strip.setPixelColor(25, color) : strip.setPixelColor(25, strip.Color(0, 0, 0));
(p9 == 1) ? strip.setPixelColor(26, color) : strip.setPixelColor(26, strip.Color(0, 0, 0));
(p10 == 1) ? strip.setPixelColor(27, color) : strip.setPixelColor(27, strip.Color(0, 0, 0));
(p10 == 1) ? strip.setPixelColor(28, color) : strip.setPixelColor(28, strip.Color(0, 0, 0));
(p10 == 1) ? strip.setPixelColor(29, color) : strip.setPixelColor(29, strip.Color(0, 0, 0));
(p11 == 1) ? strip.setPixelColor(30, color) : strip.setPixelColor(30, strip.Color(0, 0, 0));
(p11 == 1) ? strip.setPixelColor(31, color) : strip.setPixelColor(31, strip.Color(0, 0, 0));
(p11 == 1) ? strip.setPixelColor(32, color) : strip.setPixelColor(32, strip.Color(0, 0, 0));
(p12 == 1) ? strip.setPixelColor(33, color) : strip.setPixelColor(33, strip.Color(0, 0, 0));
(p12 == 1) ? strip.setPixelColor(34, color) : strip.setPixelColor(34, strip.Color(0, 0, 0));
(p12 == 1) ? strip.setPixelColor(35, color) : strip.setPixelColor(35, strip.Color(0, 0, 0));
strip.setBrightness(brightness);
strip.show();
}
static uint32_t fadein_time = 0;
static uint32_t fadeout_time = 0;
bool fadein_flag = false;
bool fadeout_flag = false;
uint8_t fadein = 0;
uint8_t fadeout = 100;
/**
* async fadein
*/
void pattern_fadein(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8, int p9, int p10, int p11, int p12, uint32_t color, int dly){
if(fadein_flag == true){
if(millis() - fadein_time > dly){
fadein_time = millis();
fadein++;
if(fadein >= 100){
fadein_flag = false;
fadein = 100;
} else {
pattern_process( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, fadein, color);
}
}
} else {
fadein_time = millis();
fadein = 0;
}
}
/**
* async fadeout
*/
void pattern_fadeout(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8, int p9, int p10, int p11, int p12, uint32_t color, int dly){
if(fadeout_flag == true){
if(millis() - fadeout_time > dly){
fadeout_time = millis();
fadeout--;
if(fadeout <= 0){
fadeout_flag = false;
fadeout = 0;
} else {
pattern_process( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, fadeout, color);
}
}
} else {
fadeout_time = millis();
fadeout = 100;
}
}
static uint32_t fadein_fadeout_time = 0;
static uint32_t fadein_fadeout_wait = 5000;
uint8_t fadein_fadeout_index = 0;
void pattern_fadein_fadeout(){
if(millis() - fadein_fadeout_time > fadein_fadeout_wait){
fadein_fadeout_time = millis();
fadein_fadeout_index++;
fadeout_flag = true;
fadein_flag = true;
if(fadein_fadeout_index > 7){
fadein_fadeout_index = 0;
}
}
if(fadein_fadeout_index == 7){
pattern_fadein(0,0,1,1,0,0,0,1,0,1,0,1, strip.Color(255, 255, 0), 10); // Y
fadein_fadeout_wait = 5000;
}
if(fadein_fadeout_index == 0){
pattern_fadeout(0,0,1,1,0,0,0,1,0,1,0,1, strip.Color(255, 255, 0), 10); // Y
fadein_fadeout_wait = 2000;
}
if(fadein_fadeout_index == 1){
pattern_fadein(0,0,1,0,1,0,0,0,1,1,0,1, strip.Color(0, 0, 255), 10); // B
fadein_fadeout_wait = 5000;
}
if(fadein_fadeout_index == 2){
pattern_fadeout(0,0,1,0,1,0,0,0,1,1,0,1, strip.Color(0, 0, 255), 10); // B
fadein_fadeout_wait = 2000;
}
if(fadein_fadeout_index == 3){
pattern_fadein(0,1,1,0,0,1,1,0,0,1,1,1, strip.Color(0, 255, 0), 10); // G
fadein_fadeout_wait = 5000;
}
if(fadein_fadeout_index == 4){
pattern_fadeout(0,1,1,0,0,1,1,0,0,1,1,1, strip.Color(0, 255, 0), 10); // G
fadein_fadeout_wait = 2000;
}
if(fadein_fadeout_index == 5){
pattern_fadein(1,0,0,1,1,0,0,0,1,1,1,1, strip.Color(255, 0, 0), 10); // R
fadein_fadeout_wait = 5000;
}
if(fadein_fadeout_index == 6){
pattern_fadeout(1,0,0,1,1,0,0,0,1,1,1,1, strip.Color(255, 0, 0), 10); // R
fadein_fadeout_wait = 2000;
}
}
void setup() {
// put your setup code here, to run once:
pinMode(6, OUTPUT);
pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT_PULLUP);
strip.begin(); // initialize strip (required!)
//strip.setBrightness(BRIGHTNESS);
fadein_fadeout_time = millis();
}
void loop() {
// put your main code here, to run repeatedly:
pattern_fadein_fadeout();
int read_magnetic_1 = digitalRead(2);
int read_magnetic_2 = digitalRead(3);
if( read_magnetic_1 == LOW && read_magnetic_2 == LOW){
digitalWrite(6, HIGH);
} else {
digitalWrite(6, LOW);
}
}