program that sound the imperial march
Diff: main.cpp
- Revision:
- 0:21479e8cb575
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Thu Apr 21 19:27:56 2016 +0000
@@ -0,0 +1,123 @@
+#include "mbed.h"
+
+// Definimos los tonos de frecuencia en Hertz
+#define c 261
+#define d 294
+#define e 329
+#define f 349
+#define g 391
+#define gS 415
+#define a 440
+#define aS 455
+#define b 466
+#define cH 523
+#define cSH 554
+#define dH 587
+#define dSH 622
+#define eH 659
+#define fH 698
+#define fSH 740
+#define gH 784
+#define gSH 830
+#define aH 880
+
+// Definimos una matriz con el orden en que se reproducen los tonos
+int imperialMarch[] = { a, a, a, f, cH,
+ a, f, cH, a,
+ eH, eH, eH, fH, cH,
+ gS, f, cH, a,
+ aH, a, a, aH, gSH, gH,
+ fSH, fH, fSH,
+
+ aS, dSH, dH, cSH,
+ cH, b, cH,
+
+ f, gS, f, a,
+ cH, a, cH, eH,
+ aH, a, a, aH, gSH, gH,
+ fSH, fH, fSH,
+
+ aS, dSH, dH, cSH,
+ cH, b, cH,
+
+ f, gS, f, cH,
+ a, f, c, a};
+
+// Definimos otra matriz con la duración de los tonos
+int tones[] = { 500, 500, 500, 350, 150,
+ 500, 350, 150, 1000,
+ 500, 500, 500, 350, 150,
+ 500, 350, 150, 1000,
+ 500, 350, 150, 500, 250, 250,
+ 125, 125, 250,
+
+ 250, 500, 250, 250,
+ 125, 125, 250,
+
+ 125, 500, 375, 125,
+ 500, 375, 125, 1000,
+ 500, 350, 150, 500, 250, 250,
+ 125, 125, 250,
+
+ 250, 500, 250, 250,
+ 125, 125, 250,
+
+ 250, 500, 375, 125,
+ 500, 375, 125, 1000};
+
+// Definimos el número total de tonos que empleamos
+int tones_num = 66;
+
+// Establecemos una salida PWM( PB_3 ) para el buzzer, y una digital para el LED
+// de la Núcleo( PA_5 ) como indicador de que se está reproduciendo un tono
+PwmOut Buzzer(PWM_OUT);
+DigitalOut Led1(LED1);
+
+// Definimos una función prototipo
+void Play_tunes(PwmOut name, int notes, int tones);
+
+// ----- FUNCIÓN PRINCIPAL DEL PROGRAMA -----
+int main(void)
+{
+ // Declaramos una variable i para el siguiente ciclo FOR
+ int i;
+
+ // Con este ciclo FOR recorremos cada uno de los tonos y sus duraciones
+ for(i=0; i<tones_num; i++)
+ {
+ // Mandamos a llamar a la función Play_tunes dandole los valores del
+ // pin del buzzer, el valor i de la matriz de notas y de los tonos
+ Play_tunes(Buzzer, imperialMarch[i], tones[i]);
+ // Aquí separamos las estrofas de nuestra melodía
+ if( i == 27 || i == 34 || i == 51 || i == 58 )
+ {
+ // ... estas estrofas se separan 250ms una de la otra
+ wait_ms(250);
+ }
+ }
+}
+
+// Esta es la función Play_tunes que mandamos a llamar dandole algunos
+// valores anteriormente
+void Play_tunes(PwmOut name, int notes, int tones)
+{
+ // Declaramos una variable tipo flotante
+ float period;
+ // Calculamos el periodo de la nota en turno a reproducir
+ period = 1000000/notes;
+ // Activamos el led de la Núcleo para indicar que estamos reproduciendo
+ // una nota
+ Led1 = 1;
+ // Establecemos el periodo calculado a la salida PWM
+ name.period_us(period);
+ // Establecemos un ciclo de trabajo del %50
+ name.write(0.50f);
+ // Esperamos el tiempo establecido por el tono i
+ wait_ms(tones);
+ // Desactivamos el led de la Núcleo para indicar el fin de la nota
+ Led1 = 0;
+ // Terminamos la nota
+ name.period_us(0);
+ // Esperamos un poco para diferenciar entre una nota y otra
+ wait_ms(20);
+}