Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * 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 <Servo.h>
- // 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!
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement