Arduino nano, sonido inesperado del zumbador al recibir datos del módulo de radio HC-12

Hago un circuito simple con un:

  • arduino nano
  • Módulo de radio de larga distancia HC-12
  • Antena HC-12
  • Condensador de 1000 uF
  • Zumbador
  • Resistencia de 220 ohmios

Necesito que el zumbador emita un ruido cuando Arduino recibe una cadena específica de HC-12. Todo funciona como se esperaba, pero tengo un problema extraño que no puedo solucionar. Durante la fase de recepción de datos, escucho un ruido extraño en el zumbador. Es algo así como el buen sonido del viejo módem. Parece una interferencia o similar pero es algo diferente porque muevo el zumbador a 20 cm de mi tablero y el problema sigue existiendo.

Probablemente sea algún tipo de error en mi código Arduino o en mi cableado, el sonido se puede escuchar antes de la función WARNINGTone() (que puedes ver dentro del código) que es la llamada que emite el sonido correcto.

Algunos antecedentes: la cadena se puede recibir más de una vez en una sola transmisión, durante la misma transmisión, cada cadena está separada por una nueva línea, por lo que puedo tener algo como:

AL_S001

AL_S001

AL_S001

etc..

Incluso 100 veces para la misma transmisión (los datos provienen de un HC-SR501 con el disparador configurado en repetible, el problema también existe con el disparador configurado como "modo de disparo único"), pero necesito hacer sonar el altavoz solo una vez por evento, si el el evento se repite después de 10 segundos, luego necesito que suene nuevamente.

Hice las pruebas para tratar de encontrar una solución: - Alejar el zumbador 20 cm de la placa - Crear una var en el código que verifique si el sonido se emite actualmente (algo así como un mutex), de esta manera trato de ejecutar el función de tono de advertencia () solo una vez por bucle

¿Como puedó resolver esté problema? Ya alcancé mi objetivo porque el sonido es alto y claro cuando se produce... pero quiero entender qué causa el sonido extraño para mi propio conocimiento.

Debajo del esquema y el código, tenga paciencia conmigo. Probablemente mis esquemas sean una pesadilla, lo sé, pero soy autodidacta y todo lo que sé en el campo de la electrónica y el idioma inglés provino de mi propio autoaprendizaje...

#include <SoftwareSerial.h>

//--- Begin Pin Declarations ---//
const byte buzzerPin = 8;

//pin HC-12 module
const byte HC12RxdPin = 2;
const byte HC12TxdPin = 3;
const byte HC12SetdPin = 4;
//--- End Pin Declarations ---//

//--- Begin variable declarations ---//
char byteIn;                                        // Temporary variable
String HC12ReadBuffer = "";                         // Read/Write Buffer 1 -- HC12 
String SerialReadBuffer = "";                       // Read/Write Buffer 2 -- Serial
boolean serialEnd = false;                          // Flag for End of Serial String
boolean HC12End = false;                            // Flag for End of HC12 String
boolean soundStart = false;                         // Flag that allow only one sound even if multiple events


// Create Software Serial Port for HC12
// Software Serial ports Rx and Tx must be inverted so HC12 Rx go as Tx and Tx go as Rx 
SoftwareSerial HC12Serial(HC12TxdPin,HC12RxdPin);

/////////////////////////////
//SETUP
void setup(){
  Serial.begin(9600);
  pinMode(buzzerPin, OUTPUT);                    // Set buzzer - pin 8 as an output

  HC12ReadBuffer.reserve(128);                   // Reserve 128 bytes for Serial message input

 //enable radio module
 Serial.println("Activate Radio Module"); 
 pinMode(HC12SetdPin, OUTPUT);                   // Output High for Transparent / Low for Command
 digitalWrite(HC12SetdPin, HIGH);                // Enter Transparent mode
 delay(80);
 HC12Serial.begin(9600);  
 HC12Serial.listen();

 //send sound to user for confirm system activation
 tone(buzzerPin, 1000);                         // Send 1KHz sound signal...
 delay(1000);                                   // ...for 1 sec
 noTone(buzzerPin);                             // Stop sound...
}

////////////////////////////
//LOOP
void loop(){
  while (HC12Serial.available()) {                  // If Arduino's HC12 rx buffer has data
    byteIn = HC12Serial.read();                     // Store each character in byteIn
    HC12ReadBuffer += char(byteIn);                 // Write each character of byteIn to HC12ReadBuffer
    Serial.println( char(byteIn));
    if (byteIn == '\n') {                           // At the end of the line
      HC12End = true;                               // Set HC12End flag to true.
    }
  }
     if(!soundStart){
 if (HC12End) {
    HC12ReadBuffer.trim();
    Serial.println("data:" + HC12ReadBuffer);        
    if( HC12ReadBuffer == "AL_S001"){
       soundStart = true;      
       warningTone();
       soundStart = false;
    }
    HC12ReadBuffer = "";                            // Empty Buffer
    HC12End = false;                                // Reset Flag
 } 
     }
}

void warningTone(){ 
        tone(buzzerPin, 1000); // Send 1KHz sound signal...
        delay(1000);        // ...for 1 sec
        tone(buzzerPin, 1500); // Send 1KHz sound signal...
        delay(1000);        // ...for 1 sec
        tone(buzzerPin, 1000); // Send 1KHz sound signal...
        delay(1000);        // ...for 1 sec
        tone(buzzerPin, 1500); // Send 1KHz sound signal...
        delay(1000);        // ...for 1 sec
        noTone(buzzerPin);     // Stop sound...  

}

2017-11-10 - Última versión de mi protoboard: siguiendo todas las sugerencias, cambio algunas rutas: 1- Mover el condensador de 1000 uF lo más cerca posible del módulo de radio 2- Cambiar el pin del zumbador para que esté lo más lejos posible del condensador 3- Mover el zumbador GND a otro pin del pin utilizado por el módulo de radio

Además, actualizo el firmware con los cambios sugeridos.

Todavía no hay suerte... el extraño sonido de "transmisión" todavía está aquí :(

ingrese la descripción de la imagen aquí

12-06-2017 ACTUALIZACIÓN: imagen de alta resolución de la placa de prueba y video con el sonido extraño

ingrese la descripción de la imagen aquí

Este es el video, el único sonido que espero es el tono dual que comienza alrededor del segundo 3, el sonido anterior es inesperado y parece una especie de ruido.

¿Cuál es el voltaje a través del zumbador cuando está en silencio?
el módulo HC-12 probablemente consume mucha corriente y está alimentando el zumbador debido a la caída de voltaje resultante. ... intente alimentar el HC-12 desde una fuente de alimentación separada, como una batería. ... o coloque una tapa más grande en los pines de alimentación HC-12 ... nota: los pines de alimentación del módulo HC-12 parecen estar invertidos.
Hola, muchas gracias por su respuesta, tiene razón en los esquemas, cometí un error con vcc y gnd, pero en mi propia placa real, todas las conexiones están colocadas de la manera correcta... la imagen estaba mal porque hice algunos cambios para encontrar una mejor ubicación para el condensador. Actualmente uso un condensador de 1000uF, ¿cuál es el tamaño que sugiere para tratar de resolver el problema? ¡Prefiero tener una sola fuente de alimentación para mantener el ensamblaje lo más pequeño posible!
Conecte un cable al zumbador a través de la resistencia para dar salida a Arduino. Conecte otro cable a tierra. Use cables separados para conectar el zumbador y el HC-12 a una fuente de alimentación.
@AltAir hola, el pin D8 que controla el zumbador ya está conectado a través de una resistencia de 220 ohmios. ¿Hice algo mal?
Hola, @AltAir, cambio la conexión, ahora el zumbador está conectado en el pin d8 y GND, pero cuando recibo los datos de HC-12, todavía escucho el sonido extraño. También conecto el gnd a un pin diferente al pin utilizado por receptor pero sin suerte... ¿tiene alguna otra sugerencia? gracias
@jsotola, ¿podría sugerir un tamaño de condensador para tratar de resolver este problema como ya sugiere? gracias
intente 100uF electrolítico lo más cerca posible de los pines de alimentación del módulo RF ... mueva el zumbador positivo lo más cerca posible de arduino
@AltAir Acabo de agregar el video y la imagen de alta resolución de mi tablero, lo siento por responder tan tarde y muchas gracias por su ayuda
Elimina todas las cosas de la radio. Solo haz que tu Arduino reproduzca el sonido una y otra vez. ¿Sigue sonando igual?

Respuestas (1)

Por favor, intente con el siguiente código:

#include <SoftwareSerial.h>

const byte buzzerPin = 8;
const byte HC12RxdPin = 2;
const byte HC12TxdPin = 3;
const byte HC12SetdPin = 4;

char byteIn;                                     // Temporary variable
String HC12ReadBuffer = "";                      // Read/Write Buffer 1 -- HC12

SoftwareSerial HC12Serial(HC12TxdPin, HC12RxdPin);

void setup() {
  Serial.begin(9600);
  pinMode(buzzerPin, OUTPUT);                    // Set buzzer - pin 8 as an output
  HC12ReadBuffer.reserve(128);                   // Reserve 128 bytes for Serial message input
  pinMode(HC12SetdPin, OUTPUT);                  // Output High for Transparent / Low for Command
  digitalWrite(HC12SetdPin, HIGH);               // Enter Transparent mode
  delay(80);
  HC12Serial.begin(9600);
  Serial.println("Radio Module Activated");
  //send sound to user for confirm system activation
  tone(buzzerPin, 1000);                         // Send 1KHz sound signal...
  delay(1000);                                   // ...for 1 sec
  noTone(buzzerPin);                             // Stop sound...
}

void loop() {
  HC12ReadBuffer = "";                            // Empty Buffer
  while (HC12Serial.available()) {                // If Arduino's HC12 rx buffer has data
    byteIn = HC12Serial.read();                   // Store each character in byteIn
    HC12ReadBuffer += char(byteIn);               // Write each character of byteIn to HC12ReadBuffer
  }
  HC12ReadBuffer.trim();
  Serial.println("data:" + HC12ReadBuffer);
  if ( HC12ReadBuffer == "AL_S001") {
    HC12Serial.stopListening();
    warningTone();
    HC12Serial.listen();
  }
}

void warningTone() {
  tone(buzzerPin, 1000); // Send 1KHz sound signal...
  delay(1000);        // ...for 1 sec
  tone(buzzerPin, 1500); // Send 1KHz sound signal...
  delay(1000);        // ...for 1 sec
  tone(buzzerPin, 1000); // Send 1KHz sound signal...
  delay(1000);        // ...for 1 sec
  tone(buzzerPin, 1500); // Send 1KHz sound signal...
  delay(1000);        // ...for 1 sec
  noTone(buzzerPin);     // Stop sound...
}
SoftwareSerial y el tono pueden ser incompatibles