Step 2Programming
here's the basic flow of the program (in pseudo-code):
loop
-check for buttons
-if button
--set "frequency"
--loop
-- -set led HIGH
-- -set piezo HIGH
-- -wait "led pulse length"
-- -set led LOW
-- -wait "frequency"/2 - "led pulse length"
-- -set piezo LOW
-- -wait "frequency"/2
-- -check for buttons
-- -if button
-- --break
-- -end if
--end loop
-end if
end loop
and the full code
//**************************// THE TUNE TRAINER v1.0// BY: GREG SCHOPPE// http://www.gschoppe.com//**************************// STRINGS ========================================#define e 3034 // 329.63 Hz#define b 4050 // 246.94 Hz#define g 5102 // 196.00 Hz#define d 6811 // 146.83 Hz#define a 9091 // 110.00 Hz#define E 12135 // 82.407 Hz#define NONE 0 // Default State// -- length of time the LED is on in each cycle#define FlashLength 1024// SETUP ============================================// Set up input on 6 pinsint inPin_e = 7;int inPin_b = 6;int inPin_g = 5;int inPin_d = 4;int inPin_a = 3;int inPin_E = 2;// Set up output on a PWM pin (digital 9, 10 or 11)int freqOut = 11;// Do we want debugging on serial out? 1 for yes, 0 for noint DEBUG = 0;void setup() { pinMode(freqOut, OUTPUT); // declare pushbuttons as input pinMode(inPin_e, INPUT); //high-e pinMode(inPin_b, INPUT); // b pinMode(inPin_g, INPUT); // g pinMode(inPin_d, INPUT); // d pinMode(inPin_a, INPUT); // a pinMode(inPin_E, INPUT); // low-e // turn on pull-up resistors digitalWrite(inPin_e,HIGH); //high-e digitalWrite(inPin_b,HIGH); // b digitalWrite(inPin_g,HIGH); // g digitalWrite(inPin_d,HIGH); // d digitalWrite(inPin_a,HIGH); // a digitalWrite(inPin_E,HIGH); // low-e if (DEBUG) { Serial.begin(9600); // Set serial out if we want debugging } // SIGNAL THAT THE CHIP IS READY digitalWrite(freqOut,HIGH); delay(500); digitalWrite(freqOut,LOW); }int input () { if(digitalRead(inPin_e)==LOW) { return(e); } if(digitalRead(inPin_b)==LOW) { return(b); } if(digitalRead(inPin_g)==LOW) { return(g); } if(digitalRead(inPin_d)==LOW) { return(d); } if(digitalRead(inPin_a)==LOW) { return(a); } if(digitalRead(inPin_E)==LOW) { return(E); } return(NONE);}void playTone (int period) { if(period==NONE) { //if no button has been pressed return; } int ToneLength = period/2 - FlashLength; int OffLength = period/2; // SIGNAL THAT THE INPUT WAS ACCEPTED digitalWrite(freqOut,LOW); delay(100); digitalWrite(freqOut,HIGH); delay(100); digitalWrite(freqOut,LOW); delay(500); // CONTINUE TO STROBE LOOP // -- the strobe loop runs 4 strobes before each test, // -- to try and lose as few microseconds as possible. while(true) { // BEGIN SET OF 4 STROBES // ON TONE & LIGHT PORTB = (B00001100 | PORTB); // -- turns on Pin 11 and Pin 10; Leaves all others as-is; delayMicroseconds(FlashLength); // OFF LIGHT PORTB = (B11110111 & PORTB); // -- turns off Pin 11; Leaves all others as-is; delayMicroseconds(ToneLength); // OFF BOTH PORTB = (B11110011 & PORTB); // -- turns off Pin 11 and Pin 10; Leaves all others as-is; delayMicroseconds(OffLength); // ON TONE & LIGHT PORTB = (B00001100 | PORTB); // -- turns on Pin 11 and Pin 10; Leaves all others as-is; delayMicroseconds(FlashLength); // OFF LIGHT PORTB = (B11110111 & PORTB); // -- turns off Pin 11; Leaves all others as-is; delayMicroseconds(ToneLength); // OFF BOTH PORTB = (B11110011 & PORTB); // -- turns off Pin 11 and Pin 10; Leaves all others as-is; delayMicroseconds(OffLength); // ON TONE & LIGHT PORTB = (B00001100 | PORTB); // -- turns on Pin 11 and Pin 10; Leaves all others as-is; delayMicroseconds(FlashLength); // OFF LIGHT PORTB = (B11110111 & PORTB); // -- turns off Pin 11; Leaves all others as-is; delayMicroseconds(ToneLength); // OFF BOTH PORTB = (B11110011 & PORTB); // -- turns off Pin 11 and Pin 10; Leaves all others as-is; delayMicroseconds(OffLength); // ON TONE & LIGHT PORTB = (B00001100 | PORTB); // -- turns on Pin 11 and Pin 10; Leaves all others as-is; delayMicroseconds(FlashLength); // OFF LIGHT PORTB = (B11110111 & PORTB); // -- turns off Pin 11; Leaves all others as-is; delayMicroseconds(ToneLength); // OFF BOTH PORTB = (B11110011 & PORTB); // -- turns off Pin 11 and Pin 10; Leaves all others as-is; delayMicroseconds(OffLength); // END SET OF 4 STROBES //Check Input Pins if ( (PIND & B11111100) != B11111100) { // -- PIND is a register containing the state of pins 0-7 as a byte; // -- i.e. B11111101 would signify that pins 1 and 5 were LOW and the rest were HIGH. // -- the testing against B11111100 is to ignore inputs on pin 0 and pin 1 (RX and TX) // -- so, the above code means that if any of pins 2-7 are low, we exit the loop. return; } } }void loop() { playTone(input());}I saved a bit of time in the inner loop with some hacked together bit operations, but overall the coding is pretty basic. Its also a bit of a hack, so please don't nag me about rogue style syntax laws. I know what they are, but when I'm rushing, I ignore them...
you can change the frequencies of each button by altering the declarations at the top.
tune trainer.pde4 KB| « Previous Step | Download PDFView All Steps | Next Step » |
![]() |
Add Comment
|









































