Ich mache eine einfache Schaltung mit:
Ich brauche, dass der Summer ein Geräusch abgibt, wenn Arduino eine bestimmte Zeichenfolge von HC-12 empfängt. Alles funktioniert wie erwartet, aber ich habe ein seltsames Problem, das ich nicht beheben kann. Während der Datenempfangsphase höre ich ein seltsames Geräusch vom Summer. Ist sowas wie der gute alte Modemsound. Scheint eine Störung oder ähnliches zu sein, ist aber etwas anderes, weil ich den Summer auf 20 cm von meiner Platine wegbewege und das Problem immer noch besteht.
Wahrscheinlich ist ein Fehler in meinem Arduino-Code oder in meiner Verkabelung, der Ton ist vor der Funktion warningTone() (die Sie im Code sehen können) zu hören, die der Aufruf ist, der den richtigen Ton ausgibt.
Einige Hintergrundinformationen: Die Zeichenfolge kann mehr als einmal in einer einzigen Übertragung empfangen werden, während derselben Übertragung wird jede Zeichenfolge durch Zeilenumbruch getrennt, sodass ich so etwas wie Folgendes haben kann:
AL_S001
AL_S001
AL_S001
usw..
Sogar 100 Mal für dieselbe Übertragung (Daten kommen von einem HC-SR501 mit Triggereinstellung auf wiederholbar, das Problem besteht auch mit Triggereinstellung als "Single Trigger Mode"), aber ich muss den Lautsprecher nur einmal pro Ereignis ertönen lassen, wenn die Ereignis wird nach 10 Sekunden wiederholt, dann muss ich erneut klingen.
Ich habe die Tests durchgeführt, um zu versuchen, eine Lösung zu finden: - Bewegen Sie den Summer 20 cm von der Platine weg - Erstellen Sie eine Variable im Code, die überprüft, ob der Ton gerade ausgegeben wird (so etwas wie ein Mutex), auf diese Weise versuche ich, das auszuführen warningTone() Funktion nur einmal pro Schleife
Wie kann ich dieses Problem lösen? Ich habe mein Ziel bereits erreicht, weil der Ton laut und klar ist, wenn er erzeugt wird. Aber ich möchte verstehen, was den seltsamen Ton für mein eigenes Wissen verursacht.
Bitte haben Sie unter dem Schaltplan und dem Code etwas Geduld mit mir. Wahrscheinlich ist mein Schaltplan ein Albtraum, ich weiß, aber ich bin ein Selbstlerner und alles, was ich auf dem Gebiet der Elektronik und der englischen Sprache weiß, stammt aus meinem eigenen Selbststudium ...
#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...
}
10.11.2017 - Letzte Version meines Steckbretts: Nach allen Vorschlägen ändere ich einige Routings: 1- Bewegen Sie den 1000-uF-Kondensator näher als möglich an das Funkmodul. 2- Ändern Sie den Summerstift so, dass er so weit wie möglich vom Kondensator entfernt ist. 3- Bewegen den Summer GND mit einem anderen Pin als dem vom Funkmodul verwendeten Pin
Außerdem aktualisiere ich die Firmware mit den vorgeschlagenen Änderungen.
Immer noch kein Glück ... das seltsame "Übertragungs" -Geräusch ist immer noch da :(
UPDATE vom 12.06.2017 - Hochauflösendes Bild des Steckbretts und Video mit dem seltsamen Geräusch
Dies ist das Video, der einzige Ton, den ich erwarte, ist der Doppelton ab Sekunde 3. Der vorherige Ton ist unerwartet und scheint eine Art Rauschen zu sein
Bitte versuchen Sie den folgenden Code:
#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
Benutzer253751