// remember the colors of the rgb led // simple game for arduino // author: Tomasz Rękawek // http://newton.net.pl/ int latchPin = 8, clockPin = 12, dataPin = 3; //shift register byte data = 0; //shift register data int led8 = 7, led9 = 6; //additional leds int ledR = 11, ledG = 10, ledB = 9; //rgb led int buttonLeft = 5, buttonRight = 4; //buttons int speakerPin = 13; //speaker void setup() { Serial.begin(57600); for(int i=3;i<=13;i++) pinMode(i, OUTPUT); pinMode(buttonLeft, INPUT); pinMode(buttonRight, INPUT); digitalWrite(buttonLeft, HIGH); digitalWrite(buttonRight, HIGH); randomSeed(analogRead(0)); clearLeds(); } // main loop void loop() { effect(); clearLeds(); if(waitForButton() == 3) return; for(int j=3;j<=8;j++) if(!playLevel(7, j)) return; } // play one level // colors - number of colors to choose from // howMuch - numer of lights to remember boolean playLevel(int colors, int howMuch) { byte level[8]; boolean ok = true; int btn, color; for(int i=0;i=0;i--) { data = 0; set(i, true); setColor(i); playTone(i * 100 + 900, 50); } } // set color to rgb led void setColor(int color) { switch(color + 1) { 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); } // turn off all leds void clearLeds() { data = 0; set(0, false); set(8, false); set(9, false); setRGB(0,0,0); } // set one led on and turn off the rest void setOne(int i) { clearLeds(); set(i, true); } // turn on or off one led void set(int i, boolean s) { if(i == 8) digitalWrite(led8, s ? HIGH : LOW); if(i == 9) digitalWrite(led9, s ? HIGH : LOW); else { digitalWrite(latchPin, LOW); if(s) data = data | (1 << i); else data = data & (255 - 1 << i); shiftOut(dataPin, clockPin, MSBFIRST, data); digitalWrite(latchPin, HIGH); } } // get i button state (1 for left or 2 for right) boolean get(int i) { switch(i) { case 1: return digitalRead(buttonLeft) == LOW; case 2: return digitalRead(buttonRight) == LOW; default: return false; } } // wait for button and return it // 1 - left // 2 - right // 3 - both int waitForButton() { int b = 0; while(!b) { if(get(1)) b = 1; if(get(2)) b = 2; } while(get(b)) if(get(b == 1 ? 2 : 1)) b = 3; delay(50); return b; } // 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); } }