Stap 2: Code
// TONES ==========================================
Beginnen met het definiëren van de relatie tussen / / opmerking, periode, & frequentie. #define c 3830 / / 261 Hz #define d 3400 / / 294 Hz #define e 3038 / / 329 Hz #define f 2864 / / 349 Hz #define g 2550 / / 392 Hz #define een 2272 / / 440 Hz #define b 2028 / / 493 Hz #define C 1912 / / 523 Hz / / definiëren een speciale opmerking, 'R', te vertegenwoordigen een rust #define R 0 / / SETUP === / / spreker op een PWM-pin (digitale 9 instellen 10 of 11) int speakerOut = 9; int speakerOnTime = 250; Verklaren redOnTime een int en ingesteld op 250 mseconds int speakerOffTime = 0; Verklaren redOffTime een int en ingesteld op 250 / / willen wij debuggen op seriële out? 1 voor Ja, 0 voor geen int DEBUG = 1; int redled = 10; Verklaren redLEDPin een int en ingesteld op pin 20 int redledOnTime = 250; Verklaren redOnTime een int en ingesteld op 250 mseconds int redledOffTime = 0; Verklaren redOffTime een int en ingesteld op 250 int yellowled = 11; Verklaren redLEDPin een int en ingesteld op pin 20 int yellowledOnTime = 250; Verklaren redOnTime een int en ingesteld op 250 mseconds int yellowledOffTime = 0; Verklaren redOffTime een int en ingesteld op 250 int knop = 2; int statePin = laag; void setup {pinMode (redled, OUTPUT); / / Arduino vertellen dat redLEDPin is een uitgang pin pinMode (yellowled, OUTPUT); / / Arduino vertellen dat redLEDPin is een uitgang pin pinMode (knop, OUTPUT); pinMode(speakerOut, OUTPUT); als (DEBUG) {Serial.begin(9600); / / Set seriële uit als we willen dat foutopsporing}} / / melodie en TIMING === / / [melodie] is een array van nota's, vergezeld van beats [], / / waarin elke nota's relatieve lengte (hogere # en langere opmerking) int melodie [] = {c g, a, g, f, e, d, c, g, f, e, d, g}; int verslaat [] = {8, 8, 8, 8, 16, 8, 8, 8, 16, 16, 8, 8}; int MAX_COUNT = sizeof(melody) / 2; Melodie de lengte, voor een lus. Set algehele tempo lange tempo = 10000; Instellen van de lengte van de pauze tussen notities int pauze = 1000; Lus variabele toe Rest lengte int rest_count = 100; <-BLETCHEROUS HACK; Zie ' opmerkingen ' / / initialiseren kern variabelen int tone_ = 0; int verslaan = 0; lange duur = 0; PLAY TONE === / / Pulse de spreker om af te spelen van een Toon voor een bepaalde duur nietig playTone() {lange elapsed_time = 0; als (digitalRead(button)==HIGH) {als (tone_ > 0) {/ / als dit niet een Rest beat, terwijl de Toon heeft / / luidspreker die hoge en lage minder lang dan 'duur' gespeeld, pulse (elapsed_time < duur) {digitalWrite(speakerOut,HIGH); delayMicroseconds(tone_ / 2); / / neer digitalWrite (speakerOut LAAG); delayMicroseconds(tone_ / 2); Bijhouden van hoe lang we gepulseerde elapsed_time += (tone_); {}} else {/ / Rest verslaan; lus keer vertraging voor (int j = 0; j < rest_count; j ++) {/ / zienoot op rest_count delayMicroseconds(duration);}}} } / / Laat de WILD RUMPUS beginnen === void loop {/ / instellen van een teller te trekken uit de melodie [] en beats [] voor (int ik = 0; ik playTone(); / / een pauze tussen merkt... delayMicroseconds(pause); analogWrite(speakerOut,500); digitalWrite(redled,HIGH); //Turn rode LED op delay(redledOnTime); //Leave op voor redOnTime digitalWrite(redled,LOW); //Turn rode LED off van delay(redledOffTime) //Leave uit voor de redOffTime digitalWrite(yellowled,HIGH); //Turn rode LED op delay(yellowledOnTime), //Leave op voor redOnTime digitalWrite (yellowled LAAG); Zet rode LED uit delay(yellowledOffTime); digitalWrite(speakerOut,HIGH); delayMicroseconds(tone_ / 2); delay(speakerOnTime); Laat op redOnTime digitalWrite (speakerOut, laag); delayMicroseconds(tone_ / 2); delay(speakerOffTime); Weglaten voor redOffTime digitalWrite(redled,HIGH); Zet de rode LED op delay(redledOnTime); Laat op redOnTime de digitalWrite(redled,LOW); Zet rode LED uit delay(redledOffTime); Weglaten voor redOffTime digitalWrite(yellowled,HIGH); Zet de rode LED op delay(yellowledOnTime); Laat op redOnTime de digitalWrite(yellowled,LOW); Zet rode LED uit delay(yellowledOffTime); Weglaten voor redOffTime}} / * * opmerkingen * het programma pretendeert te houden een Toon voor 'duur' microseconden. * Leugens ligt leugens! Het geldt voor ten minste 'duur' microseconden, _plus_ * overhead gemaakt door incremeting elapsed_time (zou dan * 3K microseconden) _plus_ overhead van looping en twee digitalWrites() ** dientengevolge een Toon van 'duur' speelt veel langzamer dan een rest * van 'duur.' rest_count maakt een lus variabele om 'rest' beats * in overeenstemming met 'Toon' beats van dezelfde lengte. ** rest_count zal worden beïnvloed door chiparchitectuur en snelheid, evenals * overhead van elk programma mods. Afgelopen gedrag is geen garantie voor de toekomst * prestaties. Jouw snelheid kan variëren. Lichte fuse en wegkomen. ** Dit kon gebruiken een aantal verbeteringen: * toevoegen code te laten de programmeur opgeven hoeveel keer de melodie moet * lus voordat stoppen * toevoegen een ander octave * MOVE tempo, pauze en rest_count #define verklaringen * HERSCHRIJVEN te nemen volume, met behulp van analogWrite, net als bij het tweede programma op * http://www.arduino.cc/en/Tutorial/PlayMelody * ADD code om het tempo instelbaar door pot of een ander invoerapparaat * ADD code te nemen tempo of volume instelbaar door seriële communicatie * (0005 vereist of hoger.) * ADD code om te creëren een Toon-offset (hoger of lager) via pot enz * vervangen willekeurige melodie met opening bars 'Smoke on the Water' * /