Arduino nano, sonido inesperado del timbre cuando se reciben datos del módulo de radio HC-12

1

Hago un circuito simple con un:

  • Arduino Nano
  • Módulo de radio de larga distancia HC-12
  • Antena HC-12
  • 1000 uF Condensador
  • zumbador
  • Resistencia de 220 ohmios

Necesito que el zumbador emita un ruido cuando Arduino recibe una cadena específica del 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 procedente del zumbador. Es algo así como el buen sonido del viejo modem. Parece una interferencia o algo similar, pero es algo diferente porque muevo el timbre a 20 cm de distancia de mi tablero y el problema sigue existiendo.

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

Alguna información de fondo: 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 un disparador configurado como repetible, el problema también existe con el gatillo configurado como "modo de disparo único"), pero necesito hacer sonar el altavoz solo una vez por evento , si el evento se repite después de 10 segundos, entonces necesito volver a sonar.

Hice las pruebas para tratar de encontrar una solución: - Mueve el zumbador a 20 cm del tablero. - Cree una var en el código que verifica si el sonido se emite actualmente (algo así como un mutex), de esta manera, trato de ejecutar la función warningTone () solo una vez por bucle

¿Cómo puedo resolver este problema? Ya alcancé mi objetivo porque el sonido es alto y claro cuando se produce ... pero quiero entender qué causa el extraño sonido por mi propio conocimiento.

Debajo del esquema y el código, ten paciencia conmigo. Probablemente mis esquemas son 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 estudio personal ...

#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 placa de pruebas: Siguiendo toda sugerencia cambio alguna ruta: 1- Mueva el capacitor de 1000 uF lo más cerca posible del módulo de radio 2- Cambie el pin del zumbador para que esté lo más alejado posible del capacitor. 3- Mueva el buzzer 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í :(

06-12-2017ACTUALIZACIÓN-Imagendealtaresolucióndelaplacayelvideoconunsonidoextraño

Este es el video, el único sonido que espero sea el tono dual que comienza alrededor del segundo 3, el sonido anterior es inesperado y parece algo tipo de ruido

    
pregunta Marco

1 respuesta

1

Por favor, intente 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...
}
    
respondido por el AltAir

Lea otras preguntas en las etiquetas