User:Fako Berkers/simonsays: Difference between revisions
Fako Berkers (talk | contribs) (→Coding) |
Fako Berkers (talk | contribs) (→Coding) |
||
Line 39: | Line 39: | ||
void loop() { | void loop() { | ||
// Read the input. | // Read the input. | ||
Line 49: | Line 45: | ||
// If input changed, then work needs to be done! | // If input changed, then work needs to be done! | ||
if (butState != input_pin) { | if (butState != input_pin) { | ||
butState = input_pin; | butState = input_pin; | ||
Line 63: | Line 60: | ||
} | } | ||
// Check if pattern should be played. | |||
if(millis() - pmillis > timelimit) play(); // No changes for a long time. | |||
if(imarks > buttonlimit) play(); // Button pressed to often. | |||
} | } | ||
Line 85: | Line 86: | ||
// Play the pattern. | // Play the pattern. | ||
int i = 0 | int i = 1; // First element in array is always 0, so start at second | ||
while (marks[i]) { | |||
if (i%2) tone(pinSpeaker,500,marks[i]); // Every odd index number is the length of a button push and sould create sound. | if (i%2) tone(pinSpeaker,500,marks[i]); // Every odd index number is the length of a button push and sould create sound as long as that length. | ||
delay(marks[i]); | delay(marks[i]); | ||
i++; | i++; | ||
} | } | ||
// Flush the pattern after it is played. | // Flush the pattern after it is played. |
Revision as of 20:31, 5 November 2010
Simon Says on Arduino
Hardware
The hardware is very simple. Connect one end of the button to pin 8 and the other to pin 2. Set the speaker to pin 13 and ground.
Coding
#include <stdlib.h>
const int timelimit = 4000;
const int buttonlimit = 100;
const int pinIn = 2;
const int pinOut = 8;
const int pinSpeaker = 13;
int butState = HIGH; // HIGH means not pressed
int marks[buttonlimit];
int imarks = 0;
unsigned long cmillis = 0;
unsigned long pmillis = 0;
void setup() {
// Set the pins.
pinMode(pinIn,INPUT);
pinMode(pinOut, OUTPUT);
digitalWrite(pinIn, HIGH);
digitalWrite(pinOut, LOW); // Pin out is low and pinIn becomes low when button is pushed.
// Set the Serial.
Serial.begin(115200);
Serial.println("START");
}
void loop() {
// Read the input.
int input_pin = digitalRead(pinIn);
// If input changed, then work needs to be done!
if (butState != input_pin) {
butState = input_pin;
// Get time values to work with.
if(!pmillis) pmillis = millis(); // Only true the first push (makes first marker 0)
cmillis = millis();
// Save time difference between last button change and current time.
marks[imarks] = cmillis - pmillis;
imarks++;
// Save time value for next time.
pmillis = cmillis;
}
// Check if pattern should be played.
if(millis() - pmillis > timelimit) play(); // No changes for a long time.
if(imarks > buttonlimit) play(); // Button pressed to often.
}
void flushit() {
memset(marks,0,buttonlimit); // Clears the array
imarks = 0;
cmillis = 0;
pmillis = 0;
}
void play() {
// Do not play anything if there's no input yet.
if(!pmillis) return;
// Visual output.
for(int i=0; i<buttonlimit; i++) {
Serial.print(marks[i]);
Serial.print(" ");
}
Serial.println("");
// Play the pattern.
int i = 1; // First element in array is always 0, so start at second
while (marks[i]) {
if (i%2) tone(pinSpeaker,500,marks[i]); // Every odd index number is the length of a button push and sould create sound as long as that length.
delay(marks[i]);
i++;
}
// Flush the pattern after it is played.
flushit();
}