This Program generate a audibly frequency on a Buzzer

Dependencies:   mbed

Revision:
0:309da55d6e5a
diff -r 000000000000 -r 309da55d6e5a main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Thu Feb 28 17:14:57 2019 +0000
@@ -0,0 +1,166 @@
+#include "mbed.h"
+
+
+
+
+//******************************************************************************
+//                          Definiciones
+
+/// Puerto Serial
+Serial SerialPort(SERIAL_TX, SERIAL_RX, 9600);
+
+/// PWM OUTPUTS
+PwmOut Buzzer(LED1);
+
+//  Temporizadores 
+Ticker LengthTonoBuzzer;
+
+// constantes
+const int long_vector = 10; // longitud del vector
+
+/// Global Variables
+
+uint8_t VCOMANDS     [long_vector]; // vector en donde se almacena la informacion 
+                                    // Recividos por el PC (Los Comandos)
+uint8_t VINDICATORS  [long_vector]; // vector en donde se almacena la informacion 
+                                    // que se Enviara al PC (Los indicadores)
+
+uint8_t i = 0;                      // Variable usada como Indice de los vectores,
+                                    // indica la posicion del vector en donde se reciben 
+                                    // ó se almacenan los datos
+
+float periodo_Buzzer = 1;           
+uint8_t duracion_Tono = 1;
+
+//******************************************************************************
+
+//                  Prototipo de Funciones
+
+void ReadPort(void);                // Lee el puerto Serial
+void MainConfig(void);              // Configuracion Inicial de los Perifericos del uC
+
+
+void stopBuzzer(void);              // Detiene el Sonido del Buzzer
+void BuzzerSound(void);             // Genera la Frecuencia de Audio en el Buzzer
+
+//******************************************************************************
+
+///             Configuración Inicial
+
+void MainConfig(void)
+    {
+        
+    // se habilita la interrupción RX
+        SerialPort.attach(&ReadPort, Serial::RxIrq );
+          
+        
+    // configuracion inicial del PWM Buzzer
+        Buzzer.period(periodo_Buzzer);
+        Buzzer.write(0.50);
+    
+    
+    
+    }
+
+
+
+///             Función Principal
+
+int main()
+{
+    
+    MainConfig();
+    // Mensaje Inicial
+    SerialPort.printf("Hello World, System Run !!\n");
+    
+    
+    
+    
+    while(1)
+     {
+
+            if(VCOMANDS[2] != 0)            // Si hemos enviado el comando de Ejecucion de Tono
+                {
+                    BuzzerSound();          // Genera el Tono Seleccionado   
+                }
+                
+            /// Visualizamos la informacion que hemos Modificado
+            SerialPort.printf("VCOMANDS[%d] = %d  - VCOMANDS[9] = %d\n", i, VCOMANDS[i], VCOMANDS[9]);
+            wait(1); 
+            
+            
+    }
+
+
+}
+
+//******************************************************************************
+
+//                  Funciones Secundarias
+
+
+void stopBuzzer(void)                               // Detiene el Tono del Buzzer, poniendo el ancho de pulso a 0;
+{
+    Buzzer.period(1); Buzzer.write(0);              // Volvemos a la configuracion Inicial del Buzzer       
+    LengthTonoBuzzer.attach(&stopBuzzer,10000);     // Mientras no se envie un nuevo comando de tiempo para
+                                                    // La interrupcion se deja un tiempo muy alto para generar la interrupcion
+                                                    // Lo menos Posible
+}
+
+void BuzzerSound(void)
+    {
+        
+    // Se calcula el valor del Periodo para el Buzzer limitando el ancho de banda de las
+        // Frecuencias de entradas entre 1 y 20Hz ó 1 y 20KHz
+        
+        // hallamos el valor de 1 a 20 que se ha ingresado    
+        if(VCOMANDS[1] <= 40) periodo_Buzzer = 1.0;           // Se restringe el limite inferior del valor ingresado a 40 y lo hace equivalente a un periodo de 1 segundo.
+                    else if (VCOMANDS[1] > 60) periodo_Buzzer = 20.0;     // Se restringe el limite Superior del valor ingresado a 60 y lo hace equivalente a un periodo de 20 segundo.
+                    else periodo_Buzzer = (float)(VCOMANDS[1] - 40);
+                    periodo_Buzzer = (1 / periodo_Buzzer); //Se realiza la conversión de Frequencia a Periodo
+
+                        
+                    // Ahora si VCOMANDS[2] == 48 == '0'; la frecuencia estará en el orden de los Herz    
+                    if (VCOMANDS[2] == 48) 
+                        {
+                            Buzzer.period(periodo_Buzzer);
+                            VCOMANDS[2] = 0 ;
+                        } 
+                    // Pero si VCOMANDS[2] == 49 == '1'; la frecuencia estará en el orden de los KiloHerz
+                    else if (VCOMANDS[2] == 49) 
+                        {
+                            Buzzer.period_us( (uint8_t)(periodo_Buzzer * 1000) );
+                            VCOMANDS[2] = 0 ;
+                        }
+                    // Determinamos el tiempo por el cual estará sonando el Buzeer
+                    if(VCOMANDS[0] <= 40) duracion_Tono = 1;           // Se restringe el limite inferior del valor ingresado a 40 y lo hace equivalente a una duración de 1 segundo.
+                    else if (VCOMANDS[0] > 100) duracion_Tono = 60;     // Se restringe el limite Superior del valor ingresado a 60 y lo hace equivalente a una duración de 60 segundo.
+                    else duracion_Tono = (VCOMANDS[0] - 40);
+                    
+                    Buzzer.write(50); // Se carga el ancho de pulso a 50 ya que en la 
+                                      // Interrupcion se pone a 0   
+                    // Se habilita la interrupcion del ticker y se le asigna
+                    // La función que ejecutará cuando se genere la interrupción
+                    LengthTonoBuzzer.attach(&stopBuzzer,duracion_Tono); // Cargamos el Tiempo(0-60 segundos) ingresado
+                                                                        // y se lo Cargamos al Ticker del Buzzer
+                                                                        
+                    VCOMANDS[9] = (uint8_t) (periodo_Buzzer * 1000); // Almacenamos El resultado del periodo en VCOMANDS[9] para visualizarlo
+                                                                     // Y confirmar que el valor sea el correcto
+    
+    
+    
+    
+    }
+
+
+
+void ReadPort()
+{
+
+//   if  (SerialPort.readable())
+    VCOMANDS[i] = SerialPort.getc();
+    i++;
+    if(i > 2) i = 0;
+
+
+}
\ No newline at end of file