Hago un circuito simple con un:
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í :(
12-06-2017 ACTUALIZACIÓN: imagen de alta resolución de la placa de prueba y video con el sonido extraño
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.
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...
}
jsotola
jsotola
marco
AltAir
marco
marco
marco
jsotola
marco
usuario253751