int ledR = 11, ledG = 10, ledB = 9; //rgb led int speakerPin = 3; //speaker int leds[] = {7, 6, 5, 4}; int photoLeds[] = {A0, A1, A2, A3, A4}; void setup() { Serial.begin(57600); for(int i=3;i<=13;i++) pinMode(i, OUTPUT); randomSeed(analogRead(5)); } void loop() { clearLeds(); while(getPhoto(false) == -1) continue; beginEffect(); int score = game(); Serial.print("Score: "); Serial.println(score); } int game() { int howMuch = 1; int score = 0; while(true) { for(int i=0;i<5;i++) { if(!getShot(howMuch, 500 + howMuch * 500 - i * 100)) return score; score += howMuch * 100 + i * 50; } if(howMuch < 3) howMuch++; else { while(getShot(howMuch, 500 + howMuch * 500 - 5 * 100)) score += howMuch * 100 + 5 * 50; return score; } } } boolean getShot(int howMuch, int wait) { int i, j; boolean leds[5]; clearLeds(); for(i=0;i<5;i++) leds[i] = false; for(i=0;i -1 && leds[p]) { leds[p] = false; successEffect(p); while(getPhoto(false) > -1); delay(500); if(--howMuch == 0) return true; } else if(p != -1) { failedEffect(p); return false; } delay(1); } timeoutEffect(leds); return false; } void beginEffect() { int order[] = {0, 1, 4, 2, 3, 4, 0}; for(int i=0;i<7;i++) { clearLeds(); setLed(order[i], true); playTone(900 + order[i]*100, 100); } clearLeds(); delay(300); } void successEffect(int led) { for(int i=0;i<3;i++) { setLed(led, true); playTone(900, 100); setLed(led, false); delay(50); } } void failedEffect(int led) { for(int i=0;i<3;i++) { setLed(led, true); playTone(2000, 500); setLed(led, false); delay(200); } } void timeoutEffect(boolean leds[]) { for(int i=0;i<3;i++) { for(int j=0;j<5;j++) setLed(j, leds[j]); playTone(2000, 500); for(int j=0;j<5;j++) setLed(j, false); delay(200); } } // turn off all leds void clearLeds() { for(int i=0;i<4;i++) digitalWrite(leds[i], LOW); setRGB(0,0,0); } // set one led void setLed(int i, boolean state) { if(i == 4) setColor(state ? random(6)+1 : 0); else digitalWrite(leds[i], state ? HIGH : LOW); } // check if photodiode is floodlit int getPhoto(boolean block) { int i; if(block) { while((i = getPhoto(false)) == -1); return i; } for(i=0;i<5;i++) if(analogRead(photoLeds[i]) > 900) return i; return -1; } // play tone on piezo void playTone(int tone, int duration) { for (long i = 0; i < duration * 1000L; i += tone * 2) { digitalWrite(speakerPin, HIGH); delayMicroseconds(tone); digitalWrite(speakerPin, LOW); delayMicroseconds(tone); } } // set color to rgb led void setColor(int color) { switch(color) { case 0: //nothing setRGB(0, 0, 0); break; case 1: //blue setRGB(0, 0, 128); break; case 2: //green setRGB(0, 128, 0); break; case 3: //red setRGB(255, 0, 0); break; case 4: //seledin (?) setRGB(0, 128, 128); break; case 5: //violet setRGB(32, 0, 64); break; case 6: //yellow setRGB(64, 128, 0); break; case 7: //white setRGB(128, 255, 255); break; } } // set rgb led values void setRGB(int r, int g, int b) { analogWrite(ledR, r); analogWrite(ledG, g); analogWrite(ledB, b); }