/* * TWISTER SPINNER * * Randomly lights a colour LED (red, yellow, green, blue) to correspond * to twister colours and turns the servo to one of four angles (to * correspond to a chart with right/left hand/foot). * * At selection randomly changes lights and spins servo a random number * of times to simulate spinning of the wheel * * Turns last a set amount of time (turnTime). A warning starts when * 80% of the turn time has expired. Warning involves tone played on piezo * * When turn ends piezo plays final (ominous) note and indicator LED flashes. * The next spin then occurs * * As if Twister doesn't get hard enough as body parts and bodies contort * around each other. To make things more difficult, we reduce the time between spins * each turn :D * * Mark Ruff, Jan 2016 */ #include // GLOBALS // servo tells us which limb Servo limbServo; int limbAngles[] = { 20, 60, 100, 140 }; // LED pins // The pin numbers matter, because I have hard coded them into // loops later on... my bad. int redLed = 7; int yellowLed = 6; int greenLed = 5; int blueLed = 4; int speaker = 13; int indicatorLed = 3; // timing int timer; int prevMillis; int turnTime = 15000; int warningTime; int turnTimeDecrement = 200; int turnTimeMin = 5000; bool newTurn = true; // notes for the warning bell int notes[] = { 262, 195, 235, 176, 99 }; void setup() { limbServo.attach(10); // set all LED pins to output for ( int i = 3; i < 8 ; i++ ) { pinMode(i, OUTPUT); } } void loop() { // increment the timer timer += millis() - prevMillis; prevMillis = millis(); // handle new turn if ( newTurn ) { // random dance for a bit then end on the real thing for (int i = 0 ; i < random(8,12) ; i++ ) { // turn off all the color LEDs for (int n = 4 ; n < 8 ; n++ ) { digitalWrite(n, LOW); } // write high to a random color LED digitalWrite(random(4,8),HIGH); // select a random limb limbServo.write(limbAngles[random(0,4)]); delay(250); } newTurn = false; timer = 0; turnTime = max ( turnTime - turnTimeDecrement, turnTimeMin ); warningTime = (turnTime * 0.8); } // handle time up else if ( timer > turnTime ) { // turn over tone and indicator lights flash tone(speaker, notes[4], 2000); for (int i = 0 ; i < 5 ; i++ ) { digitalWrite(indicatorLed, HIGH); delay(200); digitalWrite(indicatorLed, LOW); delay(200); } // turn over, just start a new turn newTurn = true; } // handle warning time else if ( timer > warningTime ) { // warning tone int noteDuration = turnTime/60; for ( int i = 0 ; i < 4 ; i++ ) { tone(speaker,notes[i], noteDuration - 20 ); delay(noteDuration); } } // otherwise just keep the LEDs lit and pass the time... loop! }