//Arduino IDE & Pin Mapping // ATMEL ATTINY84 / ARDUINO // // +-\/-+ // VCC 1| |14 GND // (D 10) PB0 2| |13 AREF (D 0) // (D 9) PB1 3| |12 PA1 (D 1) // PB3 4| |11 PA2 (D 2) // PWM INT0 (D 8) PB2 5| |10 PA3 (D 3) // PWM (D 7) PA7 6| |9 PA4 (D 4) // PWM (D 6) PA6 7| |8 PA5 (D 5) PWM // +----+ //IDE Attiny84 Physical Pin // 0 PA0 13 // 1 PA1 12 // 2 PA2 11 // 3 PA3 10 // 4 PA4 9 // 5 PA5 8 // 6 PA6 7 // 7 PA7 6 // 8 PB2 5 // 9 PB1 3 // 10 PB0 2 //--------------------------------------------------- // IDE5 - LED1 // IDE4 - LED2 // IDE3 - LED3 // IDE2 - LED4 // IDE8 - LED5 // IDE7 - LED6 // IDE6 - LED7 // IDE9 - Button // constants won't change. They're used here to set pin numbers: const int buttonPin = 9; // the number of the pushbutton pin const int led1 = 5; // the number of the LED pins const int led2 = 4; const int led3 = 3; const int led4 = 2; const int led5 = 8; const int led6 = 7; const int led7 = 6; // variables will change: int buttonState = 0; // variable for reading the pushbutton status int delayTime = 250; // time between blinks int Mode = 0; // INT of the current MODE of blinking int led1State = 0; // initial state of LEDs int led2State = 1; int led3State = 0; int led4State = 1; int led5State = 1; int led6State = 0; int led7State = 1; int led1Rnd = 4; // initial randomizer numbers for LEDs int led2Rnd = 4; int led3Rnd = 4; int led4Rnd = 4; int led5Rnd = 4; int led6Rnd = 4; int led7Rnd = 4; unsigned long previousMillis = 0; // timer variable //-------------- int current = HIGH; // Current state of the button byte previous = HIGH; // Last state of the button unsigned long firstTime; // how long since the button was first pressed //--------------- int i = 2; int j = 8; byte timeChange = 0; byte timeChangestate = 4; void setup() { // initialize the LED pin as an output: pinMode(led1, OUTPUT); pinMode(led2, OUTPUT); pinMode(led3, OUTPUT); pinMode(led4, OUTPUT); pinMode(led5, OUTPUT); pinMode(led6, OUTPUT); pinMode(led7, OUTPUT); // initialize the pushbutton pin as an input: pinMode(buttonPin, INPUT); randomSeed(analogRead(1)); // Get an analog input from Pin 1 and use it to generate a more realistic random number } // Define Blink patterns here as functions void randomBlink() { if (led1Rnd <= 4) { led1Rnd = random(4, 20); digitalWrite(led1, (led1State) ? HIGH : LOW); led1State = !led1State; } if (led2Rnd <= 4) { led2Rnd = random(4, 20); digitalWrite(led2, (led2State) ? HIGH : LOW); led2State = !led2State; } if (led3Rnd <= 4) { led3Rnd = random(4, 20); digitalWrite(led3, (led3State) ? HIGH : LOW); led3State = !led3State; } if (led4Rnd <= 4) { led4Rnd = random(4, 20); digitalWrite(led4, (led4State) ? HIGH : LOW); led4State = !led4State; } if (led5Rnd <= 4) { led5Rnd = random(4, 20); digitalWrite(led5, (led5State) ? HIGH : LOW); led5State = !led5State; } if (led6Rnd <= 4) { led6Rnd = random(4, 20); digitalWrite(led6, (led6State) ? HIGH : LOW); led6State = !led6State; } if (led7Rnd <= 4) { led7Rnd = random(4, 20); digitalWrite(led7, (led7State) ? HIGH : LOW); led7State = !led7State; } unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= (delayTime / 4)) { previousMillis = currentMillis; led1Rnd--; led2Rnd--; led3Rnd--; led4Rnd--; led5Rnd--; led6Rnd--; led7Rnd--; } } void circle() { unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= delayTime) { previousMillis = currentMillis; digitalWrite(i, HIGH); if (i != 2) { digitalWrite(i - 1, LOW); } if (i == 2) { digitalWrite(8, LOW); } i++; if (i == 9){ i = 2; } } } void circle2() { unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= delayTime) { previousMillis = currentMillis; if (i == 9){ digitalWrite(j, LOW); j--; if (j == 2) { i = 2; j = 8; } } else { digitalWrite(i, HIGH); i++; } } } void circle3() { unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= delayTime) { previousMillis = currentMillis; if (i == 9){ digitalWrite(j - 6, LOW); j++; if (j >= 15) { i = 2; j = 8; } } else { digitalWrite(i, HIGH); i++; } } } void circle4() { unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= delayTime) { previousMillis = currentMillis; if (i == 2) { digitalWrite(led1, LOW); digitalWrite(led4, HIGH); } if (i == 3) { digitalWrite(led4, LOW); digitalWrite(led5, HIGH); } if (i == 4) { digitalWrite(led5, LOW); digitalWrite(led3, HIGH); } if (i == 5) { digitalWrite(led3, LOW); digitalWrite(led6, HIGH); } if (i == 6) { digitalWrite(led6, LOW); digitalWrite(led2, HIGH); } if (i == 7) { digitalWrite(led2, LOW); digitalWrite(led7, HIGH); } if (i == 8) { digitalWrite(led7, LOW); digitalWrite(led1, HIGH); i = 1; } if (i < 1 || i > 8) { i = 1; } i++; } } void KR() { unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= delayTime) { previousMillis = currentMillis; if (i != 9) { digitalWrite(i, HIGH); if (i != 2) { digitalWrite(i - 1, LOW); } i++; j = 8; } if (i == 9) { digitalWrite(j, HIGH); if (j != 8) { digitalWrite(j + 1, LOW); } if (j == 2) { i = 2; } j--; } } } void Drop() { unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= delayTime) { previousMillis = currentMillis; if (i == 2) { digitalWrite(led1, HIGH); } if (i == 3) { digitalWrite(led1, LOW); digitalWrite(led2, HIGH); digitalWrite(led7, HIGH); } if (i == 4) { digitalWrite(led2, LOW); digitalWrite(led7, LOW); digitalWrite(led3, HIGH); digitalWrite(led6, HIGH); } if (i == 5) { digitalWrite(led3, LOW); digitalWrite(led6, LOW); digitalWrite(led4, HIGH); digitalWrite(led5, HIGH); } if (i == 6) { digitalWrite(led4, LOW); digitalWrite(led5, LOW); i = 1; } if (i < 1 || i > 5) { i = 1; } i++; } } void Drop2() { unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= delayTime) { previousMillis = currentMillis; if (i == 2) { digitalWrite(led1, HIGH); } if (i == 3) { digitalWrite(led2, HIGH); digitalWrite(led7, HIGH); } if (i == 4) { digitalWrite(led3, HIGH); digitalWrite(led6, HIGH); } if (i == 5) { digitalWrite(led4, HIGH); digitalWrite(led5, HIGH); } if (i == 6) { digitalWrite(led1, LOW); } if (i == 7) { digitalWrite(led2, LOW); digitalWrite(led7, LOW); } if (i == 8) { digitalWrite(led3, LOW); digitalWrite(led6, LOW); } if (i == 9) { digitalWrite(led4, LOW); digitalWrite(led5, LOW); i = 1; } if (i < 1 || i > 8) { i = 1; } i++; } } // Function to change the time base of the blinking void changeTimebase() { unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= 250) { previousMillis = currentMillis; if (timeChangestate == 1) { digitalWrite(led4, LOW); if ( (i % 2) == 0) { digitalWrite(led5, HIGH); } else { digitalWrite(led5, LOW); } } if (timeChangestate == 2) { digitalWrite(led5, LOW); if ( (i % 2) == 0) { digitalWrite(led6, HIGH); } else { digitalWrite(led6, LOW); } } if (timeChangestate == 3) { digitalWrite(led6, LOW); if ( (i % 2) == 0) { digitalWrite(led7, HIGH); } else { digitalWrite(led7, LOW); } } if (timeChangestate == 4) { digitalWrite(led7, LOW); if ( (i % 2) == 0) { digitalWrite(led1, HIGH); } else { digitalWrite(led1, LOW); } } if (timeChangestate == 5) { digitalWrite(led1, LOW); if ( (i % 2) == 0) { digitalWrite(led2, HIGH); } else { digitalWrite(led2, LOW); } } if (timeChangestate == 6) { digitalWrite(led2, LOW); if ( (i % 2) == 0) { digitalWrite(led3, HIGH); } else { digitalWrite(led3, LOW); } } if (timeChangestate == 7) { digitalWrite(led3, LOW); if ( (i % 2) == 0) { digitalWrite(led4, HIGH); } else { digitalWrite(led4, LOW); } } i++; if (i > 7) { i = 2; } } } void loop() { current = digitalRead(buttonPin); // if the button state changes to pressed, remember the start time if (current == LOW && previous == HIGH) { firstTime = millis(); } //released if (current == HIGH && previous == LOW) { if ((millis() - firstTime) > 100 && (millis() - firstTime) < 2000) { //pressed between 100 ms and 2 second if (timeChange == 0) { for (i = 2; i < 9; i++) { digitalWrite(i, LOW); } Mode++; if (Mode > 7) { Mode = 0; } i = 2; j = 8; } else { timeChangestate++; if (timeChangestate > 7) { timeChangestate = 1; } } } if ((millis() - firstTime) > 2000) { //pressed longer then 2 second if (timeChange == 0) { for (i = 2; i < 9; i++) { digitalWrite(i, LOW); } timeChange = 1; i = 2; } else { for (i = 2; i < 9; i++) { digitalWrite(i, LOW); } timeChange = 0; i = 2; switch (timeChangestate) { case 1: delayTime = 100; break; case 2: delayTime = 150; break; case 3: delayTime = 200; break; case 4: delayTime = 250; break; case 5: delayTime = 500; break; case 6: delayTime = 750; break; case 7: delayTime = 1000; break; default: delayTime = 250; break; } } } } previous = current; // This Switch Case starts the blinking mode functions defined earlier if (timeChange == 0) { switch (Mode) { case 0: randomBlink(); break; case 1: circle(); break; case 2: circle2(); break; case 3: circle3(); break; case 4: circle4(); break; case 5: KR(); break; case 6: Drop(); break; case 7: Drop2(); break; default: Mode = 0; break; } } else { changeTimebase(); } }