int dataPin = 0; // Attiny pin 5 int clockPin = 1; // Attiny pin 6 int registerPin = 2; // Attiny pin 7 int buttonPin = 4; // Attiny pin 3 int debouncer = 0; // timer per debouncing int multi = 8; boolean buttonState = LOW; // stato debuncer boolean oldButtonState = LOW; // controllo se pulsante sia stato premuto in precedenza unsigned long buttonHeld = 0; // microsecondi pulsante è stato premuto, per random generator unsigned long timer = 0; // millisecondi per sequenceDelay float sequenceDelayMultiplier = 1; // velocità animazioni, numero minore = animazione più veloce int sequenceDelay = 300; // millisecondi tra ogni sequenza; findAndWriteStep() 300 int sequenceNumber = 0; // quale pattern è selezionato int sequenceProgress = 0; // a quale punto del pattern si è int sequenceTotal = 16; // numero totale pattern, 14 include pattern random int sequenceLengths[16] = {1, 2, 14, 28, 16, 14, 15, 2, 4, 23, 14, 4, 13, 16, 30, 1}; // numero punti per pattern unsigned int sequenceZero[1] = {(B11111111 + (B11111111 << 8))}; // bytes spostati a sinistra ("<< 8") verranno esportati per primi, al secondo registro unsigned int sequenceOne[2] = {0, (B11111111 + (B11111111 << 8))}; unsigned int sequenceTwo[14] = {(B00010000 << 8), (B00001000 << 8), (B00000100 << 8), (B00000010 << 8), (B10000000), (B01000000), (B00100000), (B00010000), (B00001000), (B00000100), (B00000010), (B10000000 << 8), (B01000000 << 8), (B00100000 << 8)}; unsigned int sequenceThree[28] = {B00010000, B00110000, B01110000, B11110000, (B11110000 + (B10000000 << 8)), (B11110000 + (B11000000 << 8)), (B11110000 + (B11100000 << 8)), (B11110000 + (B11110000 << 8)), (B11110000 + (B11111000 << 8)), (B11110000 + (B11111100 << 8)), (B11110000 + (B11111110 << 8)), (B11110010 + (B11111110 << 8)), (B11110110 + (B11111110 << 8)), (B11111110 + (B11111110 << 8)), (B11101110 + (B11111110 << 8)), (B11001110 + (B11111110 << 8)), (B10001110 + (B11111110 << 8)), (B00001110 + (B11111110 << 8)), (B00001110 + (B01111110 << 8)), (B00001110 + (B00111110 << 8)), (B00001110 + (B00011110 << 8)), (B00001110 + (B00001110 << 8)), (B00001110 + (B00000110 << 8)), (B00001110 + (B00000010 << 8)), B00001110, B00001100, B00001000, 0}; unsigned int sequenceFour[16] = {(B11111110 + (B11111110 << 8)), (B11101110 + (B11111110 << 8)), (B11010110 + (B11111110 << 8)), (B10111010 + (B11111110 << 8)), (B01111100 + (B11111110 << 8)), (B11111110 + (B01111100 << 8)), (B11111110 + (B10111010 << 8)), (B11111110 + (B11010110 << 8)), (B11111110 + (B11101110 << 8)), (B11111110 + (B11010110 << 8)), (B11111110 + (B10111010 << 8)), (B11111110 + (B01111100 << 8)), (B01111100 + (B11111110 << 8)), (B10111010 + (B11111110 << 8)), (B11010110 + (B11111110 << 8)), (B11101110 + (B11111110 << 8))}; unsigned int sequenceFive[14] = {(B00010000 << 8), (B00110000 << 8), (B00111000 << 8), (B01111000 << 8), (B01111100 << 8), (B11111100 << 8), (B11111110 << 8), (B00010000 + (B11111110 << 8)), (B10010000 + (B11111110 << 8)), (B10010010 + (B11111110 << 8)), (B10110010 + (B11111110 << 8)), (B10111010 + (B11111110 << 8)), (B11111010 + (B11111110 << 8)), (B11111110 + (B11111110 << 8))}; unsigned int sequenceSix[15] = {(B0001000 << 8) , (B00001000 <<8), (B00000100 <<8), (B00000010 <<8), (B00000010), (B00000100), (B00001000), (B00010000), (B00100000), (B01000000), (B10000000), (B10000000 <<8), (B01000000 <<8), (B00100000 <<8), (B00010000 <<8)}; unsigned int sequenceSeven[2] = {0, (B11111110<<8)}; unsigned int sequenceEight[4] = {((B00011111 <<8) + (B00011111)), ((B11111111 <<8) + (B11111111)), ((B11110000 <<8) + (B11110000)), 0}; unsigned int sequenceNine[14] = {((B11110000)+(B11110000 <<8)), ((B11111000)+(B11100000 <<8)), ((B11111100)+(B11000000 <<8)), ((B11111110) + (B10000000 <<8)), ((B1111110) + (B00000010 <<8)), ((B01111110) + (B00000110 <<8)) , ((B00111110) + (B00001110 <<8)), ((B00011110) + (B00011110 <<8)), ((B00001110) + (B00111110 <<8)), ((B00000110) + (B01111110 <<8)), ((B00000010) + (B11111110 <<8)), ((B10000000)+(B11111110 <<8)), ((B11000000)+(B11111100 <<8)), ((B11100000)+(B11111000 <<8))}; unsigned int sequenceTen[4] = {(B11111110 <<8), ((B11111110 <<8)+(B11111110)), (B11111110), 0}; unsigned int sequenceEleven[13] = {((B00000010)+(B00000010<<8)), ((B00000100)+(B00000100 <<8)), ((B00001000)+(B00001000 <<8)), ((B00010000)+(B00010000 <<8)), ((B00100000)+(B00100000 <<8)), ((B01000000)+(B01000000 <<8)), ((B10000000)+(B10000000 <<8)), ((B01000000)+(B01000000 <<8)), ((B00100000)+(B00100000 <<8)), ((B00010000)+(B00010000 <<8)), ((B00001000)+(B00001000 <<8)), ((B00000100)+(B00000100 <<8)), ((B00000010)+(B00000010<<8))}; unsigned int sequenceTwelve[16] = {(B00010000), (B00111000), (B01111100), (B11111110), (B11111110+(B10000010<<8)),(B11111110+(B11000110<<8)),(B11111110+(B11101110<<8)), (B11111110+(B11111110<<8)),(B11111110+(B11101110<<8)), (B11111110+(B11000110<<8)), (B11111110+(B10000010<<8)), (B11111110), (B01111100), (B00111000), (B00010000), (B0000000)}; unsigned int sequenceTredici[30] = {(B00010000), (B00111000), (B01111100), (B11111110), (B11111110+(B10000010<<8)),(B11111110+(B11000110<<8)),(B11111110+(B11101110<<8)), (B11111110+(B11111110<<8)), (B11101110+(B11111110<<8)), (B11000110+(B11111110<<8)), (B10000010+(B11111110<<8)), (B00000000+(B11111110<<8)), (B01111100<<8), (B00111000<<8), (B00010000<<8), 0, (B00010000<<8), (B0011100<<8), (B01111110<<8), (B10000010+(B11111110<<8)), (B11000110+(B11111110<<8)), (B11101110+(B11111110<<8)), (B11111110+(B11111110<<8)),(B11111110+(B11101110<<8)),(B11111110+(B11000110<<8)), (B11111110+(B10000010<<8)), (B11111110), (B01111100), (B00111000), (B00010000)}; // sequenceTitheen non esiste, sequenza random void writeStep(int toBeShifted) // cambio display { digitalWrite(registerPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, (toBeShifted >> 8)); shiftOut(dataPin, clockPin, MSBFIRST, (toBeShifted)); digitalWrite(registerPin, HIGH); } void findAndWriteStep(int sequence, int progression) // conversione pattern in array { int passData = 65535; switch(sequence) { case 0: sequenceDelay = 1000; //valore poco importante, la prima sequenza ha solo un passo passData = sequenceZero[progression]; break; case 1: sequenceDelay = 50*multi; passData = sequenceOne[progression]; break; case 2: sequenceDelay = 70*multi; passData = sequenceTwo[progression]; break; case 3: sequenceDelay = 75*multi; passData = sequenceThree[progression]; break; case 4: sequenceDelay = 75*multi; passData = sequenceFour[progression]; break; case 5: sequenceDelay = 70*multi; passData = sequenceFive[progression]; break; case 6: sequenceDelay = 2*multi; passData = sequenceSix[progression]; break; case 7: sequenceDelay = 75*multi; passData = sequenceSeven[progression]; break; case 8: sequenceDelay = 75*multi; passData = sequenceEight[progression]; break; case 9: sequenceDelay = 10*multi; passData = sequenceThree[progression]; break; case 10: sequenceDelay = 3*multi; passData = sequenceNine[progression]; break; case 11: sequenceDelay = 50*multi; passData = sequenceTen[progression]; break; case 12: sequenceDelay = 30*multi; passData = sequenceEleven[progression]; break; case 13: sequenceDelay = 10*multi; passData = sequenceTwelve[progression]; break; case 14: sequenceDelay = 10*multi; passData = sequenceTredici[progression]; break; case 15: // pattern random sequenceDelay = 50*multi; passData = random(65535); break; } writeStep(passData); } void setup() { pinMode(dataPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(registerPin, OUTPUT); pinMode(buttonPin, INPUT); digitalWrite(registerPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, 0); // clear high byte shiftOut(dataPin, clockPin, MSBFIRST, 0); // clear low byte digitalWrite(registerPin, HIGH); timer = millis(); // inizializza timer } void loop() { if(digitalRead(buttonPin) == HIGH) { debouncer = 0; buttonState = LOW; buttonHeld = micros() - buttonHeld; // differenza in microsecondi tra pulsante premuto e rilasciato randomSeed(buttonHeld); // genera numeri random solo quando cambiano } else { if(debouncer < 10) { debouncer += 1; } } if(debouncer >= 10) { oldButtonState = buttonState; buttonState = HIGH; } if(oldButtonState == LOW && buttonState == HIGH) // previene false triggering { // code here for button press digitalWrite(3, HIGH); delay(100); digitalWrite(3, LOW); sequenceNumber += 1; // incrementa numero sequenza, torna a zero dopo 14 if(sequenceNumber >= sequenceTotal) { sequenceNumber = 0; } sequenceProgress = 0; // reset counter quando si preme il pulsante buttonHeld = micros(); } if(millis() - (sequenceDelay * sequenceDelayMultiplier) >= timer) //dopo troppo tempo { findAndWriteStep(sequenceNumber, sequenceProgress); sequenceProgress += 1; // incrementa la sequenza timer = millis(); } if(sequenceProgress >= sequenceLengths[sequenceNumber]) { sequenceProgress = 0; } }