Hey guys, new to arduino and electronics in general so im having a bit of trouble wrapping my head around this one.
I want to make a Simon game using my arduino and 3 LEDS and three buttons, but I dont want the LED's to light up in a random sequence as the game progresses. I want it to be a predetermined light up sequence.
Could any one help with a simple version of what I'm asking and then hopefully I will be able to cut and past code to create my own sequence?
Made a Simon game for the ArduCap shield some time ago, which could serve as a base. You need to strip/modify all ArduCap-shields specifics and rewrite the readKey() but it could be a basis. See - http://arduino.cc/forum/index.php/topic,54242.0.html -
Oh that's unbelievably perfect.The next stage of my project was to have capacitor sensors replace the buttons. But this ArduCap - shield stuff confuses me. I was hoping to have the input be stripped wires connected to tin foil as I have found in this Playground example.
The code at the bottom is the one that works on my Arduino UNO. Depending on if I'm touching the wire, the serial monitor displays 1 (not touching) or 4-5 (touching).
I'm not entirely sure how to add these two codes together.
How do I tell it to read 1-2 as LOW and 3-5 as HIGH. as in button pushed / button not pushed?
Ok almost there. I've got the capacitors set up as the input. and the game plays perfect. except that it's still random.
how do i replace the random array with a predetermined sequence?
thanks again guys
heres the code
/*Capacitor Simon Says game by Robert Spann - Edited by Daniel Waugh - 2011*/
int led1 = 7; // first LED pin
int led2 = 6; // second LED pin
int led3 = 5; // third LED pin
//int led4 = 4; // fourth LED pin
int turn = 0;
int input1 = LOW;
int input2 = LOW;
int input3 = LOW;
//int input4 = LOW;
int randomArray[100]; //Intentionally long to store up to 100 inputs (doubtful anyone will get this far)
int inputArray[100];
void setup() {
Serial.begin(9600);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
// pinMode(led4, OUTPUT);
randomSeed(analogRead(0)); //Added to generate "more randomness" with the randomArray for the output function
for (int y=0; y<=99; y++){ //For statement to loop through the output and input functions
output();
input();
}
}
void output() { //function for generating the array to be matched by the player
for (int y=turn; y <= turn; y++){ //Limited by the turn variable
Serial.println(""); //Some serial output to follow along
Serial.print("Turn: ");
Serial.print(y);
Serial.println("");
randomArray[y] = random(1, 4); //Assigning a random number (1-4) to the randomArray[y], y being the turn count
for (int x=0; x <= turn; x++){
Serial.print(randomArray[x]);
if (randomArray[x] == 1) { //if statements to display the stored values in the array
digitalWrite(led1, HIGH);
delay(500);
digitalWrite(led1, LOW);
delay(100);
}
if (randomArray[x] == 2) {
digitalWrite(led2, HIGH);
delay(500);
digitalWrite(led2, LOW);
delay(100);
}
if (randomArray[x] == 3) {
digitalWrite(led3, HIGH);
delay(500);
digitalWrite(led3, LOW);
delay(100);
}
// if (randomArray[x] == 4) {
// digitalWrite(led4, HIGH);
// delay(500);
// digitalWrite(led4, LOW);
// delay(100);
// }
}
}
}
void input() { //Function for allowing user input and checking input against the generated array
char capval[6];
char pinval[6] = {
1<<PINB0,1<<PIN1,1<<PIN2};
//char pinval[6] = {1<<PINB0,1<<PINB1,1<<PINB2,1<<PINB3,1<<PINB4,1<<PINB5};
delay(100);
for(char i = 0; i < 1; i++)
{
capval[i] = getcap(pinval[i]);
for (int x=0; x <= turn;){ //Statement controlled by turn count
input1 = (getcap(pinval[0]));
input2 = (getcap(pinval[1]));
input3 = (getcap(pinval[2]));
// input4 = digitalRead(switch4);
if (getcap(pinval[0]) > 1)
{
digitalWrite(led1, HIGH); // sets the LED on
delay(200);
digitalWrite(led1, LOW); // sets the LED off
inputArray[x] = 1;
delay(50);
Serial.print(" ");
Serial.print(1);
if (inputArray[x] != randomArray[x]) { //Checks value input by user and checks it against
fail(); //the value in the same spot on the generated array
} //The fail function is called if it does not match
x++;
}
if (getcap(pinval[1]) > 1)
{
digitalWrite(led2, HIGH); // sets the LED on
delay(200);
digitalWrite(led2, LOW); // sets the LED off
inputArray[x] = 2;
delay(50);
Serial.print(" ");
Serial.print(2);
if (inputArray[x] != randomArray[x]) { //Checks value input by user and checks it against
fail(); //the value in the same spot on the generated array
} //The fail function is called if it does not match
x++;
}
if (getcap(pinval[2]) > 1)
{
digitalWrite(led3, HIGH); // sets the LED on
delay(200);
digitalWrite(led3, LOW); // sets the LED off
inputArray[x] = 3;
delay(50);
Serial.print(" ");
Serial.print(3);
if (inputArray[x] != randomArray[x]) { //Checks value input by user and checks it against
fail(); //the value in the same spot on the generated array
} //The fail function is called if it does not match
x++;
}
}
}
delay(500);
turn++; //Increments the turn count, also the last action before starting the output function over again
}
void fail() { //Function used if the player fails to match the sequence
for (int y=0; y<=5; y++){ //Flashes lights for failure
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
digitalWrite(led3, HIGH);
// digitalWrite(led4, HIGH);
delay(200);
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
// digitalWrite(led4, LOW);
delay(200);
}
delay(5000);
turn = -1; //Resets turn value so the game starts over without need for a reset button
}
void loop() { //Unused void loop(), though for some reason it doesn't compile without this /shrug
}
char getcap(char pin)
{
char i = 0;
DDRB &= ~pin; // input
PORTB |= pin; // pullup on
for(i = 0; i < 16; i++)
if( (PINB & pin) ) break;
PORTB &= ~pin; // low level
DDRB |= pin; // discharge
return i;
}
how do i tell it to always play in sequence of level one then level two?
and how do i tell it that level one is always "this sequence" and level two is always " this different sequence"
ok so I've got it doing predetermined sequences. but it's only...umm...how do i say this... the progression is still plus an extra move per level. so each turn it adds a extra move. so pretty close to what I want. but not quite.
void output() { //function for generating the array to be matched by the player
for (int y=turn; y <= turn; y++){ //Limited by the turn variable
Serial.println(""); //Some serial output to follow along
Serial.print("Turn: ");
Serial.print(y);
Serial.println("");
randomArray[0] = (1);
randomArray[1] = (3);
randomArray[2] = (2);
randomArray[3] = (2);
this means the game will ALWAYS progress in that sequence of led1, led3, led2, led2. (as the output and "expected" input)
HOWEVER what i would like it to do is get randomArray[0] to be