Paso 2: código
// TONES ==========================================
Comenzar por definir la relación entre / / nota, período y frecuencia. #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 a 2272 / / 440 Hz #define b 2028 / / 493 Hz #define C 1912 / / 523 Hz / / Define una nota especial, 'R', para representar un resto #define R 0 / Instalación === / / configurar el altavoz en un perno PWM (digital 9 10 u 11) int speakerOut = 9; int speakerOnTime = 250; Declarar redOnTime un int y establecida en 250 msegundos int speakerOffTime = 0; ¿Declarar redOffTime un int y establecida en 250 / / queremos depuración en serie hacia fuera? 1 para sí, 0 para no int DEBUG = 1; int rojo = 10; Declarar redLEDPin un int y establece en pin 20 int redledOnTime = 250; Declarar redOnTime un int y establecida en 250 msegundos int redledOffTime = 0; Declarar redOffTime un int y establecida en 250 int yellowled = 11; Declarar redLEDPin un int y establece en pin 20 int yellowledOnTime = 250; Declarar redOnTime un int y establecida en 250 msegundos int yellowledOffTime = 0; Declarar redOffTime un int y establece en 250 int tecla = 2; int statePin = bajo; void setup() {pinMode (rojo, salida); / / Arduino Dile que redLEDPin es una salida pines pinMode (yellowled, salida); / Arduino Dile que redLEDPin es una salida pines pinMode (botón, salida); pinMode(speakerOut, OUTPUT); si (depurar) {Serial.begin(9600); / / Set serie hacia fuera si queremos depurar}} / / melodía y tiempo === / [melodía] es un conjunto de notas, acompañada de golpes [], / que establece longitud relativa (# más, más Nota) int [] melodía de cada nota = {c g, a, g, f, e, d, c, g, f, e, d, g}; beats de int [] = {8, 8, 8, 8, 16, 8, 8, 8, 16, 16, 8, 8}; int número = sizeof(melody) / 2; Longitud de la melodía, para bucle. Set global tempo largo de tempo = 10000; Duración de pausa entre notas int pausa = 1000; Variable de bucle para aumentar la longitud de resto int rest_count = 100; <-BLETCHEROUS HACK; Ver notas / / inicializar base variables int tone_ = 0; vencer a int = 0; duración = 0; Reproducir tono === / / pulso del altavoz para reproducir un tono para una particular duración nula playTone() {elapsed_time largo = 0; si (digitalRead(button)==HIGH) {si (tone_ > 0) {/ / si esto no es un ritmo de descanso, mientras que el tono tiene / / jugó menos tiempo de 'duración', pulse Altavoz alta y baja mientras (elapsed_time < duración) {digitalWrite(speakerOut,HIGH); delayMicroseconds(tone_ / 2); / / abajo digitalWrite (speakerOut BAJA); delayMicroseconds(tone_ / 2); Hacer un seguimiento de cuánto tiempo hemos pulsado elapsed_time += (tone_); {}} más {/ / resto vencer; tiempos de loop retrasan (int j = 0; j < rest_count; j ++) {/ / ver nota en rest_count delayMicroseconds(duration);}}} } / / Deje el WILD RUMPUS comenzar === void loop() {/ / configurar un contador para tirar de [] de melodía y ritmos [] para (int me = 0; me playTone(); / / pausa entre notas... delayMicroseconds(pause); analogWrite(speakerOut,500); digitalWrite(redled,HIGH); //Turn roja LED en delay(redledOnTime); //Leave en para redOnTime digitalWrite(redled,LOW); //Turn rojo LED off delay(redledOffTime); //Leave de para redOffTime digitalWrite(yellowled,HIGH); //Turn LED rojo delay(yellowledOnTime); //Leave en para redOnTime digitalWrite (yellowled BAJA); Activar LED rojo apagado delay(yellowledOffTime); digitalWrite(speakerOut,HIGH); delayMicroseconds(tone_ / 2); Delay(speakerOnTime); Dejar redOnTime digitalWrite (speakerOut, bajo); delayMicroseconds(tone_ / 2); Delay(speakerOffTime); Deje apagado para redOffTime digitalWrite(redled,HIGH); Activar LED rojo delay(redledOnTime); Dejar redOnTime digitalWrite(redled,LOW); Activar LED rojo apagado delay(redledOffTime); Deje apagado para redOffTime digitalWrite(yellowled,HIGH); Activar LED rojo delay(yellowledOnTime); Dejar redOnTime digitalWrite(yellowled,LOW); Activar LED rojo apagado delay(yellowledOffTime); Dejar de redOffTime}} / * * notas * el programa pretende mantener un tono de microsegundos de 'duración'. * Mentiras mentiras mentiras! Tiene para por lo menos microsegundos de 'duración', _plus_ * cualquier sobrecarga creado por elapsed_time incremeting (podría ser exceso de * K 3 microsegundos) _plus_ sobrecarga de bucle y dos digitalWrites() de ** como resultado, mucho más lentamente que un resto se escuchará un tono de 'duración' * de' duración' rest_count crea una variable de bucle para traer 'resto' beats * en consonancia con los ritmos del 'tono' de la misma longitud. ** rest_count se verán afectadas por la arquitectura de viruta y la velocidad, así como * arriba de mods de cualquier programa. Comportamiento pasado no es garantía de futuro * rendimiento. Su kilometraje puede variar. Fusible luz y escapar. ** Esto puede utilizar una serie de mejoras: * agregar código para dejar que el programador especifique cuantas veces la melodía debe * lazo antes de parar * añadir otra octava * movimiento ritmo, pausa y rest_count a las declaraciones de #define * volver a escribir incluir volumen, usando analogWrite, como con el segundo programa en * http://www.arduino.cc/en/Tutorial/PlayMelody * ADD código para hacer el tempo configurables por pot u otro dispositivo de entrada * ADD código para tomar ritmo o volumen configurable por comunicación serial * (0005 requiere o superior.) * Código de ADD para crear un desplazamiento de tono (superior o inferior) a través de olla etc. * reemplazar melodía al azar con la apertura de bares a 'Humo sobre el agua' * /