User:Fako Berkers/simonsays: Difference between revisions
Fako Berkers (talk | contribs) (→Coding) |
Fako Berkers (talk | contribs) (→Coding) |
||
Line 68: | Line 68: | ||
void flushit() { | void flushit() { | ||
memset(marks,0,buttonlimit); // Clears the array | memset(marks,0,buttonlimit); // Clears the array | ||
imarks = 0; | imarks = 0; | ||
cmillis = 0; | cmillis = 0; | ||
pmillis = 0; | pmillis = 0; | ||
} | } | ||
void play() { | void play() { | ||
// Do not play anything if there's no input yet. | // Do not play anything if there's no input yet. | ||
if(!pmillis) return; | if(!pmillis) return; | ||
Line 95: | Line 98: | ||
// Flush the pattern after it is played. | // Flush the pattern after it is played. | ||
flushit(); | flushit(); | ||
} | } | ||
</source> | </source> |
Revision as of 20:32, 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();
}