HC-12 Transceiver: weit gekommen, aber klappt nicht

Hallo liebe Forum,

die Funkmodule, die ich vor einiger Zeit hier anfragte, sind da.

Diese sind es geworden:

Tja, ihr wusstet es wohl schon, es klappt nicht so einfach.

Wieder habe ich viel gelesen und am einfachsten erhschien mir folgender Weg:

Mit diesem Code wird geprüft, wie die HC-12 Module eingestellt sind:

#include <SoftwareSerial.h>;
#define RX 2 //Connect to the TX pin of the HC-12
#define TX 3 //Connect to the RX pin of the HC-12
SoftwareSerial mySerial(RX, TX);

void setup() {
  Serial.begin(9600);
  mySerial.begin(9600);

}

void loop() { // run over and over
  if (mySerial.available()) {
    Serial.write(mySerial.read());
  }
  if (Serial.available()) {
    mySerial.write(Serial.read());
  }
}

Mit dem Befehl AT+RX werden von beiden Modulen folgende Daten ausgelesen:

OK+B9600
OK+RC001
OK+RP:+20dBm
OK+FU3

Das sieht schon mal gut aus.

Der Sender soll nun “Hello World” senden und wenn der Empfänger dies empfängt, soll die interne LED für 500ms angehen.

Hier der Code für den Sender:

void setup() {
  Serial.begin(9600);
}

void loop() {
  Serial.print("Hello World");
  delay(2000);
}

Hier der Code für den Empfänger:

void setup() {
    Serial.begin(9600);
    pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
    if(Serial.available() > 0)
    {
        String input = Serial.readString();
        if(input == "Hello World")
        {
            digitalWrite(LED_BUILTIN, HIGH);
            delay(500);
            digitalWrite(LED_BUILTIN, LOW);
        }
    }

}

Jedoch: die Led vom Empfänger blinkt nicht. Was könnte ich falsch gemacht haben?

Was mich wundert ist, dass bei dem Code zum Auslesen der Parameter noch die folgenden Zeilen verwendet werden, also noch ein paar settings gemacht werden:

#include <SoftwareSerial.h>;
#define RX 2 //Connect to the TX pin of the HC-12
#define TX 3 //Connect to the RX pin of the HC-12
SoftwareSerial mySerial(RX, TX);

[...]

Diese Zeilen fehlen bei dem Sender-/Empfänger-Code. Aber auch wenn ich sie hinzufüge, passt es nicht.

Ich verwende zwei Arduino-Uno.

Falls Du einen Arduino mit nur 1 Seriellen Schnittstelle benutzt (z.B. UNO/NANO), dann ist diese für die USB-Verbindung zum PC. Serial.print schreibt also zum PC.
Serial ist kein Bus. Du brauchst also SoftwareSerial und musst auch darauf senden/empfangen.

Gruß Tommy

Vielen Dank!

Grundsätzlich habe ich das verstanden, aber mit der Umsetzung hapert es. Habe ich es richtig verstanden, dass ich die Bibliothek SoftwareSerial.h mit einbinden muss, also in etwas so? Hoffentlich mache ich was falsch, denn das klappt nicht.

Vielleicht noch mal zur Absicherung. Ist folgende Verkabelung korrekt?
HC12: TXD muss auf PIN D3
HC12: RXD muss auf PIN D2

Code für Sender (jetzt soll noch die LED blinken, damit ich weiß, dass sich was tut)

#include <SoftwareSerial.h>;
#define RX 2 //Connect to the TX pin of the HC-12
#define TX 3 //Connect to the RX pin of the HC-12
SoftwareSerial mySerial(RX, TX);


void setup() {
  Serial.begin(9600);
  pinMode(LED_BUILTIN, OUTPUT);
}


void loop() {
  Serial.print("Hello World");
  digitalWrite(LED_BUILTIN, HIGH);
  delay(500);
  digitalWrite(LED_BUILTIN, LOW);
  delay(2000);
}

Code für Empfänger:

#include <SoftwareSerial.h>;
#define RX 2 //Connect to the TX pin of the HC-12
#define TX 3 //Connect to the RX pin of the HC-12
SoftwareSerial mySerial(RX, TX);


void setup() {
    Serial.begin(9600);
    pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
    if(Serial.available() > 0)
    {
        String input = Serial.readString();
        if(input == "Hello World")
        {
            digitalWrite(LED_BUILTIN, HIGH);
            delay(500);
            digitalWrite(LED_BUILTIN, LOW);
        }
    }

}

Und warum gehst du nicht nach den Beispielen die man dir nennt ?
Ich habe dir doch genau hier den Tipp gegeben, wo du eine super Beschreibung findest.
Warum glaubst du das nicht ?

Zu deinem Sketch:

Wenn du etwas mit der SoftwareSerial senden willst, musst du die auch nutzen.
Dann macht es keinen Sinn auf die Hardware serial zu schreiben.

Hoffentlich mache ich was falsch, denn das klappt nicht.

Wenn du schon SoftwareSerial - Objekte definierst, solltest du sie auch verwenden.
(Und Serial nur für Test/Debug-Zwecke benutzen)

Lieber Dieter,

bitte sei nicht böse mit mir. Der Grund, warum ich deinen Tip nicht verwendet habe ist recht banal. Ich habe meinen Post nicht mehr gefunden. Ja, das ist der Grund. Schlag ruhig die Hände über dem Kopf zusammen und lache über mich. Das ist es tatsächlich. Und glaube mir, ich habe lange gesucht. Da habe ich einfach kein Talent. Ich finde auch die Butter im Kühlschrank nicht.

Eigentlich war ich der Überzeugung, dass in meinem Profil alle Beiträge von mir angezeigt werden. Doch da war nichts.

Meine Strafe war es, erst lange nach meinem Post zu suchen und dann noch mal lange nach brauchbarem Code und nun die Hosen hier runter zu lassen. Ich bitte um Entschuldigung und werde deinen Hinweis jetzt anwenden!

Ah, ich sehe grad, da bin ich bei meiner Recherche auch vorbeigekommen. Das hat mir schon viel geholfen. Das andere erschien mir noch kürzer, darum wollte ich damit beginnen. Weniger Code = einfacher, so meiner Überlegung.

Viele Grüße
Ingo

Ok....ok.
Klicke in diesem Thread auf deinen Namen und dann auf "Show Posts".
Da findest du deine Posts.

Ah, da ist die Funktion. Danke - so hatte ich nicht gesucht. Merkwürdig, dass ich es über die SuFu nicht gefunden habe. Doch anderes Thema.

Nun, ich arbeite mich grad nochmal durch.

Verzeih bitte meiner Nachfrage. Wenn ich bei meinem Beispeil bleiben möchte, so vermute ich, dass diese Zeile nicht funktioniert:

Serial.print("Hello World");

Damit spreche ich die Serielle Schnittstelle an, nicht die der Bibliothe "SoftwareSerial". Richtig?

Liebe Grüße
Ingo

Richtig?

Richtig.
Mit deiner Zeile

    SoftwareSerial mySerial(RX, TX);

definierst du ein Objekt namens mySerial. Das kann dann z.B. in

    mySerial.begin(9600);
    mySerial.print("Hello");

verwendet werden.

Versuche mal, die Beispiele auch zu verstehen.

Bin Grad dabei.

Ich hatte den Code von der Seite

kopiert. Da steht es leider anders und ich bin ins Messer gelaufen. Ich dachte, es wäre ein Kochrezept, aber das ist es nicht. Nun will ich das mal knacken. Es geht ja "nur" darum, die Bibliothek SoftwareSerial anzusprechen. Leider habe ich nie gelernt, was eine Bibliothek ist oder was ein Objekt ist.

Ich schaffe das!

LG
Ingo

GESCHAFFT!

Danke, vielen Dank an euch - ich bin froh, heute noch was auf die Beine gestellt zu haben.

So geht es:

Sender:

#include <SoftwareSerial.h>;
#define RX 2 //Connect to the TX pin of the HC-12
#define TX 3 //Connect to the RX pin of the HC-12
SoftwareSerial mySerial(RX, TX);

void setup() {
  mySerial.begin(9600);
 }

void loop() {
  mySerial.print("Hello World");
  delay(2000);
}

Empfänger:

#include <SoftwareSerial.h>;
#define RX 2 //Connect to the TX pin of the HC-12
#define TX 3 //Connect to the RX pin of the HC-12
SoftwareSerial mySerial(RX, TX);


void setup() {
    mySerial.begin(9600);
    pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
    if(mySerial.available() > 0)
    {
        String input = mySerial.readString();
        if(input == "Hello World")
        {
            digitalWrite(LED_BUILTIN, HIGH);
            delay(2000);
            digitalWrite(LED_BUILTIN, LOW);
        }
    }

}

Prima und danke für die Rückmeldung.

Gruß Tommy