top of page

Copycat Code

#define R 11

#define G 10

#define B 9

#define lR 2

#define lG 5

#define lB 6

#define b1 A0

#define b2 A1

#define b3 A2

#define b4 A3

#define b5 A4

#define buz 3

#define timerLen 10000

 

int count = 0;

 

void setup() {

  int outputs[] = { R, G, B, lR, lG, lB, buz };

  for (int i = 0; i < 7; i++) {

    pinMode(outputs[i], OUTPUT);

  }

  pinMode(b1, INPUT);

  pinMode(b2, INPUT);

  pinMode(b3, INPUT);

  pinMode(b4, INPUT);

  pinMode(b5, INPUT);

  Serial.begin(9600);

  Serial.println("Setup complete");

}

 

bool test(int light) {

  long long int endTime = millis() + timerLen;

 

  while (millis() < endTime && pressed() == -1) {

    continue;

  }

 

  return (millis() < endTime && pressed() == light);

}

 

void setLight(int light) {

  if (light == 0) {

    digitalWrite(lR, HIGH);

  } else if (light == 1) {

    digitalWrite(lG, HIGH);

  } else if (light == 2) {

    digitalWrite(lB, HIGH);

  } else if (light == 3) {

    digitalWrite(lG, HIGH);

    digitalWrite(lB, HIGH);

  } else if (light == 4) {

    digitalWrite(lR, HIGH);

    digitalWrite(lG, HIGH);

    digitalWrite(lB, HIGH);

  }

}

 

void allOff() {

  int outputs[] = { R, G, B, lR, lG, lB };

  for (int i = 0; i < 6; i++) {

    digitalWrite(outputs[i], LOW);

  }

}

 

int pressed() {

  int buttons[] = { b1, b2, b3, b4, b5 };

  for (int i = 0; i < 5; i++) {

    if (analogRead(buttons[i]) >= 512) {

      return i;

    }

  }

  return -1;

}

 

void loop() {

  randomSeed(analogRead(A5));

  int sequence[] = { 0, 0, 0, 0, 0 };

  for (int i = 0; i < 5; i++) {

    sequence[i] = random(0, 5);

  }

  Serial.println("Sequence declared");

  bool allRight = true;

 

  for (int max = 0; max < 5 && allRight; max++) {

    playSec(sequence, max);

 

    Serial.print("Testing first ");

    Serial.print(max + 1);

    Serial.println(" lights in sequence");

    for (int cur = 0; cur <= max && allRight; cur++) {

      Serial.print("Light requested: ");

      Serial.println(sequence[cur]);

      allRight = test(sequence[cur]);

      delay(1000);

      if (allRight) {

        setLight(sequence[cur]);

        delay(500);

        allOff();

        //toEncoder(sequence[cur]);

        continue;

      } else {

        lose();

        delay(1000);

      }

    }

 

    if (max == 4 && allRight) {

      win();

      count++;

      break;

    }

  }

}

 

void playSec(int lights[], int amount) {

  Serial.print("Playing sequence with ");

  Serial.print(amount + 1);

  Serial.println(" lights");

  for (int i = 0; i <= amount; i++) {

    setLight(lights[i]);

    delay(1500);

    allOff();

    delay(500);

  }

}

 

void win() {

  tone(buz, 2349, 250);

  delay(250);

  tone(buz, 2793, 250);

  delay(250);

  tone(buz, 3135, 250);

  delay(250);

  tone(buz, 3520, 250);

  delay(250);

  tone(buz, 3951, 250);

  delay(250);

  noTone(buz);

}

 

void lose() {

  int notes[] = { 3729, 3322, 3135, 2793 };

  for (int i : notes) {

    tone(buz, i, 250);

    delay(250);

  }

  noTone(buz);

}

 

void toEncoder(int light) {

  int endTime = millis() + 5000;

  while (pressed() == light && endTime > millis()) {

    continue;

  }

  if (millis() > endTime) {

    encode();

  }

}

 

void encode() {

  allOff();

  if (count <= 10) {

    digitalWrite(R, HIGH);

  } else if (count <= 20 && count > 10) {

    digitalWrite(G, HIGH);

  } else if (count <= 30 && count > 20) {

    digitalWrite(B, HIGH);

  } else if (count <= 40 && count > 30) {

    digitalWrite(R, HIGH);

    digitalWrite(B, HIGH);

  } else {

    digitalWrite(R, HIGH);

    digitalWrite(G, HIGH);

    digitalWrite(B, HIGH);

  }

  delay(5000);

  digitalWrite(R, LOW);

  digitalWrite(G, LOW);

  digitalWrite(B, LOW);

}

bottom of page