Arduino nano, unerwarteter Ton vom Summer, wenn Daten vom Funkmodul HC-12 empfangen werden

Ich mache eine einfache Schaltung mit:

  • Arduino-Nano
  • HC-12 Langstrecken-Funkmodul
  • HC-12 Antenne
  • 1000 uF Kondensator
  • Summer
  • 220 Ohm Widerstand

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 :(

Geben Sie hier die Bildbeschreibung ein

UPDATE vom 12.06.2017 - Hochauflösendes Bild des Steckbretts und Video mit dem seltsamen Geräusch

Geben Sie hier die Bildbeschreibung ein

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

Wie hoch ist die Spannung am Summer, wenn er leise ist?
Das HC-12-Modul zieht wahrscheinlich viel Strom und speist aufgrund des resultierenden Spannungsabfalls in den Summer ein. ... versuchen Sie, den HC-12 über eine separate Stromversorgung, z. B. eine Batterie, mit Strom zu versorgen. ... oder setzen Sie eine größere Kappe auf die HC-12-Stromanschlüsse ... Hinweis: Die Stromanschlüsse Ihres HC-12-Moduls scheinen vertauscht zu sein.
Hallo, vielen Dank für Ihre Antwort, Sie haben Recht in Schaltplänen. Ich mache einen Fehler in Bezug auf vcc und gnd, aber in meinem eigenen realen Board sind alle Verbindungen richtig platziert ... das Bild war falsch, weil ich einige Änderungen vorgenommen habe Suche nach einer besseren Platzierung für den Kondensator. Derzeit verwende ich einen 1000-uF-Kondensator. Welche Größe schlagen Sie vor, um das Problem zu lösen? Ich ziehe es vor, nur eine Stromquelle zu haben, um die Baugruppe so klein wie möglich zu halten!
Bitte verbinden Sie den Summer mit einem Draht durch den Widerstand, um Arduino auszugeben. Verbinden Sie einen anderen Draht mit der Erde. Verwenden Sie getrennte Kabel, um Summer und HC-12 an eine Stromversorgung anzuschließen.
@AltAir Hallo, der D8-Pin, der den Summer steuert, ist bereits über einen 220-Ohm-Widerstand verbunden. Habe ich etwas falsch gemacht?
Hallo @AltAir, ich ändere die Verbindung, jetzt ist der Summer an Pin d8 und GND angeschlossen, aber wenn ich die Daten von HC-12 empfange, höre ich immer noch das seltsame Geräusch. Ich verbinde auch den GND mit einem anderen Pin als dem von verwendeten Pin Empfänger, aber ohne Erfolg. Haben Sie einen anderen Vorschlag? Danke
@jsotola könnten Sie bitte eine Kondensatorgröße vorschlagen, um zu versuchen, dieses Problem zu lösen, wie Sie es bereits vorgeschlagen haben? Danke
Probieren Sie 100uF elektrolytisch so nah wie möglich an den Leistungspins des HF-Moduls aus ... bewegen Sie den Summer so nah wie möglich an Arduino
@AltAir Ich habe gerade das Video und das hochauflösende Bild meines Boards hinzugefügt. Entschuldigen Sie die so späte Antwort und vielen Dank für Ihre Hilfe
Löschen Sie alle Radiosachen. Lassen Sie einfach Ihren Arduino den Ton immer und immer wieder spielen. Klingt es immer noch gleich?

Antworten (1)

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...
}
SoftwareSerial und Ton sind möglicherweise nicht kompatibel