Hotboards MX
/
Buzzer
program that sound the imperial march
Embed:
(wiki syntax)
Show/hide line numbers
main.cpp
00001 #include "mbed.h" 00002 00003 // Definimos los tonos de frecuencia en Hertz 00004 #define c 261 00005 #define d 294 00006 #define e 329 00007 #define f 349 00008 #define g 391 00009 #define gS 415 00010 #define a 440 00011 #define aS 455 00012 #define b 466 00013 #define cH 523 00014 #define cSH 554 00015 #define dH 587 00016 #define dSH 622 00017 #define eH 659 00018 #define fH 698 00019 #define fSH 740 00020 #define gH 784 00021 #define gSH 830 00022 #define aH 880 00023 00024 // Definimos una matriz con el orden en que se reproducen los tonos 00025 int imperialMarch[] = { a, a, a, f, cH, 00026 a, f, cH, a, 00027 eH, eH, eH, fH, cH, 00028 gS, f, cH, a, 00029 aH, a, a, aH, gSH, gH, 00030 fSH, fH, fSH, 00031 00032 aS, dSH, dH, cSH, 00033 cH, b, cH, 00034 00035 f, gS, f, a, 00036 cH, a, cH, eH, 00037 aH, a, a, aH, gSH, gH, 00038 fSH, fH, fSH, 00039 00040 aS, dSH, dH, cSH, 00041 cH, b, cH, 00042 00043 f, gS, f, cH, 00044 a, f, c, a}; 00045 00046 // Definimos otra matriz con la duración de los tonos 00047 int tones[] = { 500, 500, 500, 350, 150, 00048 500, 350, 150, 1000, 00049 500, 500, 500, 350, 150, 00050 500, 350, 150, 1000, 00051 500, 350, 150, 500, 250, 250, 00052 125, 125, 250, 00053 00054 250, 500, 250, 250, 00055 125, 125, 250, 00056 00057 125, 500, 375, 125, 00058 500, 375, 125, 1000, 00059 500, 350, 150, 500, 250, 250, 00060 125, 125, 250, 00061 00062 250, 500, 250, 250, 00063 125, 125, 250, 00064 00065 250, 500, 375, 125, 00066 500, 375, 125, 1000}; 00067 00068 // Definimos el número total de tonos que empleamos 00069 int tones_num = 66; 00070 00071 // Establecemos una salida PWM( PB_3 ) para el buzzer, y una digital para el LED 00072 // de la Núcleo( PA_5 ) como indicador de que se está reproduciendo un tono 00073 PwmOut Buzzer(PWM_OUT); 00074 DigitalOut Led1(LED1); 00075 00076 // Definimos una función prototipo 00077 void Play_tunes(PwmOut name, int notes, int tones); 00078 00079 // ----- FUNCIÓN PRINCIPAL DEL PROGRAMA ----- 00080 int main(void) 00081 { 00082 // Declaramos una variable i para el siguiente ciclo FOR 00083 int i; 00084 00085 // Con este ciclo FOR recorremos cada uno de los tonos y sus duraciones 00086 for(i=0; i<tones_num; i++) 00087 { 00088 // Mandamos a llamar a la función Play_tunes dandole los valores del 00089 // pin del buzzer, el valor i de la matriz de notas y de los tonos 00090 Play_tunes(Buzzer, imperialMarch[i], tones[i]); 00091 // Aquí separamos las estrofas de nuestra melodía 00092 if( i == 27 || i == 34 || i == 51 || i == 58 ) 00093 { 00094 // ... estas estrofas se separan 250ms una de la otra 00095 wait_ms(250); 00096 } 00097 } 00098 } 00099 00100 // Esta es la función Play_tunes que mandamos a llamar dandole algunos 00101 // valores anteriormente 00102 void Play_tunes(PwmOut name, int notes, int tones) 00103 { 00104 // Declaramos una variable tipo flotante 00105 float period; 00106 // Calculamos el periodo de la nota en turno a reproducir 00107 period = 1000000/notes; 00108 // Activamos el led de la Núcleo para indicar que estamos reproduciendo 00109 // una nota 00110 Led1 = 1; 00111 // Establecemos el periodo calculado a la salida PWM 00112 name.period_us(period); 00113 // Establecemos un ciclo de trabajo del %50 00114 name.write(0.50f); 00115 // Esperamos el tiempo establecido por el tono i 00116 wait_ms(tones); 00117 // Desactivamos el led de la Núcleo para indicar el fin de la nota 00118 Led1 = 0; 00119 // Terminamos la nota 00120 name.period_us(0); 00121 // Esperamos un poco para diferenciar entre una nota y otra 00122 wait_ms(20); 00123 }
Generated on Tue Jul 26 2022 21:34:33 by 1.7.2