Visuella / fonetiska gitarr Tuner "The Tune tränare" (2 / 4 steg)
Steg 2: programmering
här är grundläggande flödet av programmet (i pseudo-kod):
loop
-Kontrollera för knappar
-Om knappen
--Välj "frekvens"
--loop
---set ledde högt
---Ange piezo hög
---vänta "ledde puls längd"
---set ledde låg
---vänta "frekvens" / 2 - "ledde puls längd"
---Ange piezo låg
---vänta "frekvens" / 2
---Kontrollera för knappar
---Om knappen
----paus
---sluta om
--slutet loop
-sluta om
avsluta loop
och den fullständiga koden
TUNE tränare v1.0 / / av: GREG SCHOPPE / / http://www.gschoppe.com// *** / / STRÄNGAR === #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 en 9091 / / 110,00 Hz #define E 12135 / / 82.407 Hz #define ingen 0 / / standardtillstånd / /--tid lyser i varje cykel #define FlashLength 1024 / / SETUP === / / Ställ in ingång på 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; / / Ställ in utgång på en PWM stift (digital 9, 10 eller 11) int freqOut = 11; / / vill vi felsökning på serial ut? 1 för Ja, 0 för noint DEBUG = 0; void setup() {pinMode (freqOut, produktionen); / / förklara tryckknappar som ingående pinMode (inPin_e, ingång), //high-e pinMode (inPin_b, ingång); / / b pinMode (inPin_g, ingång); / / g pinMode (inPin_d, ingång); / / d pinMode (inPin_a, ingång); / / en pinMode (inPin_E, ingång); / / low-e / / slå på pull-up motstånd digitalWrite(inPin_e,HIGH); //high-e digitalWrite(inPin_b,HIGH); / / b digitalWrite (inPin_g HÖG); g digitalWrite(inPin_d,HIGH); d digitalWrite(inPin_a,HIGH); en digitalWrite(inPin_E,HIGH); Low-e om (DEBUG) {Serial.begin(9600); / / Ställ in följetong ut om vi vill felsökning} / / SIGNAL att det CHIP är redo digitalWrite(freqOut,HIGH); Delay(500); digitalWrite(freqOut,LOW); } int ingång () {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 ingen knapp har tryckts tillbaka;} int ToneLength = period/2 - FlashLength; int OffLength = period/2; / / SIGNAL att indata var ACCEPTERADE digitalWrite(freqOut,LOW); delay(100); digitalWrite(freqOut,HIGH); delay(100); digitalWrite(freqOut,LOW); delay(500); / / Fortsätt till STROBE LOOP / /--strobe loopen körs 4 strobes före varje prov, / /--att försöka förlora så få mikrosekunder som möjligt. while(true) {/ / börjar uppsättning 4 STROBES / på ton & ljus PORTB = (B00001100 | PORTB); --aktiverar Pin 11 och Pin 10. Lämnar alla andra som-är; delayMicroseconds(FlashLength); AV ljus PORTB = (B11110111 & PORTB); --stänger av Pin 11. Lämnar alla andra som-är; delayMicroseconds(ToneLength); AV båda PORTB = (B11110011 & PORTB); --stänger Pin 11 och Pin 10. Lämnar alla andra som-är; delayMicroseconds(OffLength); OM tonen & ljus PORTB = (B00001100 | PORTB); --aktiverar Pin 11 och Pin 10. Lämnar alla andra som-är; delayMicroseconds(FlashLength); AV ljus PORTB = (B11110111 & PORTB); --stänger av Pin 11. Lämnar alla andra som-är; delayMicroseconds(ToneLength); AV båda PORTB = (B11110011 & PORTB); --stänger Pin 11 och Pin 10. Lämnar alla andra som-är; delayMicroseconds(OffLength); OM tonen & ljus PORTB = (B00001100 | PORTB); --aktiverar Pin 11 och Pin 10. Lämnar alla andra som-är; delayMicroseconds(FlashLength); AV ljus PORTB = (B11110111 & PORTB); --stänger av Pin 11. Lämnar alla andra som-är; delayMicroseconds(ToneLength); AV båda PORTB = (B11110011 & PORTB); --stänger Pin 11 och Pin 10. Lämnar alla andra som-är; delayMicroseconds(OffLength); OM tonen & ljus PORTB = (B00001100 | PORTB); --aktiverar Pin 11 och Pin 10. Lämnar alla andra som-är; delayMicroseconds(FlashLength); AV ljus PORTB = (B11110111 & PORTB); --stänger av Pin 11. Lämnar alla andra som-är; delayMicroseconds(ToneLength); AV båda PORTB = (B11110011 & PORTB); --stänger Pin 11 och Pin 10. Lämnar alla andra som-är; delayMicroseconds(OffLength); AVSLUTA SET av 4 UTLÖSES //Check Input stift om ((PIND & B11111100)! = B11111100) {/ /--PIND är ett register med statligt av stift 0-7 som en byte; / /--dvs B11111101 skulle innebära att stift 1 och 5 var låg och resten var hög. / /--testning mot B11111100 är att ignorera ingångar på stift 0 och stift 1 (RX och TX) / /--så ovanstående kod innebär att om någon av stift 2-7 är låga , vi avsluta loopen. hemkomst. {}}} void loop() {playTone(input());}
Jag har sparat lite tid i den inre loopen med några hackade ihop bit verksamhet, men totalt kodning är ganska grundläggande. Dess också lite av en hacka, så vänligen inte tjatar jag om oseriösa stil syntax lagar. Jag vet vad de är, men när jag är rusar jag ignorera dem...
frekvenserna för varje knapp kan du ändra genom att ändra deklarationerna på toppen.