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