HC-12 sendet keine Daten

Hallo,
ich bin gerade dabei folgendes Programm umzusetzen:

Dabei soll das Signal eines Tasters über ein HC-12 Modul gesendet und beim anderen empfangen und als LED Signal umgesetzt werden.

Den Schaltplan sowie die Programme habe ich 1:1 benutzt.

Dies hat auch beim ersten mal direkt funktioniert -bis ich die Antenne an einem Board abgebochen habe...

Ich hab das Board ersetzt, nur funktioniert nun gar nichts mehr richtig.
2 der 4 HC-12 Boards können gegenseitig über den Seriellen Monitor Nachrichten senden und empfangen, eins empfängt nur und eins scheint tot zu sein...

Den Befehl, die LED anzuschalten, während der Taster gedrückt ist, kommt gar nicht an über die HC-12 Module.

Verbinde ich beide Arduinos mit Kabeln direkt (RX-TX RX-TX) dann funktioniert es... Das Programm scheint also zu passen... Laut dem seriellen Monitor scheinen ja auch die Module etwas zu senden und zu empfangen... Ich versteh nur noch Bahnhof, ich hoffe jemand von euch hat einen Tipp...

Programme:

//HC-12 Momentary Button Receive
//Autor Tom Heylen tomtomheylen.com

//RECEIVE

#include <SoftwareSerial.h>

SoftwareSerial mySerial(0,1); // RX, TX

int ledPin = 13;

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

}

void loop() {

  if (mySerial.available() > 1) {
    int input = mySerial.parseInt();//read serial input and convert to integer (-32,768 to 32,767)
    if (input == 1111) { //if on code is received
      digitalWrite(ledPin, HIGH);//turn LED on
 
      delay(500);

      digitalWrite(ledPin, LOW);
   
      //delay(500);
      delay(2000);


    }
    if (input == 0000) { //if off code is received
      digitalWrite(ledPin, LOW);//turn LED off
    }
  }
  mySerial.flush();//clear the serial buffer for unwanted inputs

  delay(200);//delay little for better serial communication

}
//HC-12 Momentary Button Send
//Autor Tom Heylen tomtomheylen.com


#include <SoftwareSerial.h>

SoftwareSerial mySerial(2,3); //RX, TX

int buttonPin = 9;
boolean onOff = 0;
void setup() {
  pinMode(13, OUTPUT); // signal button pressed
  pinMode(buttonPin, INPUT);
  mySerial.begin(9600);
}

void loop() {

  int buttonState = digitalRead(buttonPin);//read button state

  if (buttonState == 1) { //if button is down
    digitalWrite(13,HIGH); // signal button pressed
    mySerial.println(1111);//send unique code to the receiver to turn on. In this case 1111
    onOff = 1;//set boolean to 1
  }
  if (buttonState == 0 && onOff == 1) { //Verifier to send off signal once
    digitalWrite(13,LOW);
    mySerial.println(0000);//send unique code to the receiver to turn off. In this case 0000
  }
  delay(200);//delay little for better serial communication


}

Grüße
Flo

Welche Arduinos verwendest du ?

Warum nimmst du beim Empfänger für SoftwareSerial die Pins D0 und D1 ?
Die werden normalerweise vom USB-Port verwendet, da können somit leicht Probleme auftreten.

ursprünglich einen Uno als Sender und einen Nano als Empfänger... Der nano hat sich jedoch verabschiedet (irgendwie haben die China dinger da ein Problem dass die sich nicht mehr programmieren lassen nach ner Zeit)

Nun hab ich 2x Uno aber auch nen neuen Nano und nichts möchte klappen.

für RX TX hab ich D2 und D3, das steht falsch im Programm sorry... Hab das mal durchgetestet ob der Fehler vielleicht nicht doch da irgendwo liegt...

Wie hast du die Betriebsspannung an den HC12 angeschlossen ?
Der benötigt min. 100 mA bei 5 Volt.

Ich hab ein separates Netzteil bei Vin (5V 1000mA)

-Aber, nun funktioniert es!

Ich kann mir nicht erklären weshalb!

Ich hab absolut nichts geändert, alles nur noch mal an die USB Ports und einfach den Taster gedrückt....
Seit 2h versuche ich das... Ich komme mir gerade richtig dumm vor...

Vielen Dank trotzdem für deine Mühe!

Floduino:
Ich hab ein separates Netzteil bei Vin (5V 1000mA)

-Aber, nun funktioniert es!

Ich kann mir nicht erklären weshalb!

Ich hab absolut nichts geändert, alles nur noch mal an die USB Ports und einfach den Taster gedrückt....
Seit 2h versuche ich das... Ich komme mir gerade richtig dumm vor...

Vielen Dank trotzdem für deine Mühe!

Ok....kein Problem.
Evtl nur ein Wackler in den Steckverbindern.
Wichtig ist, es funktioniert wieder.

Ich hoffe ich kann noch mal deine Hilfe in Anspruch nehmen :slight_smile:

Beim Empfänger lege ich den Digitalausgang auf den Basiswiderstand (110Ohm) eines N-Channel Mosfets (65N06).

Parallel dazu einen Pulldown (10kOhm) auf GND

Ich möchte dass die LEDs am Mosfet kurz aufblitzen (50ms an 200ms aus)

Jedoch bleiben die länger an als der Ausgang geschaltet ist, so als ob das Mosfet sich nicht schnell genug entläd.

Ich hab das ganze nun auf einen Transistor (BF869) umgebaut und der Effekt ist der Gleiche.

Edit: Hab nun nen BC548 rein und es hat sich immer noch nichts verändert :confused:

Hast du Vorschläge?

Dann zeige bitte den aktuellen Empfängersketch und das kompletten Schaltbild wie du die Led ansteuerst.

Hast du Vorschläge?

Nein.

Du machst was falsch.
Hältst aber vor dir, und damit auch gleich vor uns, geheim welchen Bock du da schießt.

Übrigens, der FET ist kein LL-FET.
Er ist nicht geeignet.

Hallo,
sorry du hast Recht, ohne Schaltplan ist es tatsächlich nicht hilfreich.

Ich hab einen in Paint angefertigt... Ich bitte um Nachsicht, ich zeichne die sonst nur grob auf Papier.

Der Schaltplan zeigt den Aufbau des Empfängers, den Pull-Down Widerstand hab ich testweise mal durch einen 2kOhm Widerstand ersetzt.
Der Effekt bleibt der Gleiche...

//HC-12 Momentary Button Receive
//Autor Tom Heylen tomtomheylen.com


#include <SoftwareSerial.h>

SoftwareSerial mySerial(2,3); // RX, TX

int ledPin = 13; //zur Überprüfung

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

void loop() {

  if (mySerial.available() > 1) {
    int input = mySerial.parseInt();//read serial input and convert to integer (-32,768 to 32,767)
    if (input == 1111) { //if on code is received
      digitalWrite(ledPin, HIGH);//turn LED on
      digitalWrite(5, HIGH);//turn LED on
      delay(50);

      digitalWrite(ledPin, LOW);
   
      delay(500);
      


    }
    if (input == 0000) { //if off code is received
      digitalWrite(ledPin, LOW);//turn LED off
      digitalWrite(5, LOW);
    }
  }
  mySerial.flush();//clear the serial buffer for unwanted inputs

  delay(200);//delay little for better serial communication

}

Der Pin D5 geht ja erst wieder auf LOW wenn du "0000" sendest bzw. empfängst.

5V ist ein bisschen wenig an Vin.
Was kommt denn so am 5V-Pin raus?

Wenn das Netzteil wirklich nur 5V liefert, und der Nano keine USB-Verbindung hat, kannst du es direkt am 5V-Pin und GND anschliessen.

Wenn du nur 5V an Vin hast, macht es einen großen Unterschied, ob über USB nochmal 5V reinkommen.

Am Vin hab ich 4.5V und an dem 5V Pin hab ich 3.5V

Es reicht ja aus um Daten zu empfangen. Die LED an PIN 13 blitzt auch genau in dem Takt in dem ich es möchte.

Nur der Transistor an D5 schaltet nicht wieder schnell genug ab. Zumindest kommt es mir so vor...

Der Transistor an Pin 5 schaltet allerfrühestens nach einer guten halben Sekunde ab, hoffe ich mal.
Das hast du jedenfalls so programmiert. ( Ausserdem muss die Nachricht mit der 0 rechtzeitig kommen... )

Das Programm sagt doch

LED an
warte 50ms

LED aus
warte 500ms

Wie gesagt, die onBoard LED funktioniert genau richtig, die "stärkeren" LEDs gehen aktuell gar nicht mehr aus, außer ich lasse den Taster los, und hier auch verzögert um ca 1.5 Sekunden...

Stimmt: 1.5 sec macht auch Sinn.

LED 13 / LED 5 gehen an, wenn "1111" empfangen wurde
LED 13 geht nach 50 ms wieder aus, LED 5 bleibt an.

nach 500 ms wird mySerial.flush() gemacht. Was nichts bewirkt, jedenfalls zum Glück nicht das was im Kommentar steht.
Nach weiteren 200 ms geht es endlich weiter.

Wenn inzwischen mindestens ein weiteres Zeichen gekommen sind, wartet parseInt() 1 sec, bis klar ist, dass die nächste Zahl komplett ist. Falls dann nur eine 0 erkannt wurde, geht die LED 5 auch aus, sonst bleibt sie eben an.

Das mit dem flush hab ich ohne nachzudenken übernommen.

Aber: vielen vielen Dank!!! Ich war so unendlich blind!

Du hast natürlich recht, PIN5 bleibt HIGH... wo auch immer diese Zeile mit dem LOW hin ist...

Danke noch mal an alle! Nun funktioniert es wunderbar!

Hallo
währe es möglich, denn Sketch in eine Library umzuschreiben,
könnte mir jemand ein paar Tipps geben.

setup und loop müssten in eine cpp

/* HC12 Send/Receive Example Program 2
By Mark J. Hughes
for AllAboutCircuits.com

This code will automatically detect commands as sentences that begin
with AT and both write them and broadcast them to remote receivers
to be written. Changing settings on a local transceiver will
change settings on a remote receiver.

Connect HC12 "RXD" pin to Arduino Digital Pin 4
Connect HC12 "TXD" pin to Arduino Digital Pin 5
Connect HC12 "Set" pin to Arduino Digital Pin 6

Do not power HC12 via Arduino over USB. Per the data sheet,
power the HC12 with a supply of at least 100 mA with
a 22 uF to 1000 uF reservoir capacitor and connect a 1N4007 diode in
series with the positive supply line if the potential difference exceeds 4.5 V.

Upload code to two Arduinos connected to two computers
that are separated by at least several meters.

*/

#include <SoftwareSerial.h>

const byte HC12RxdPin = 4; // "RXD" Pin on HC12
const byte HC12TxdPin = 5; // "TXD" Pin on HC12
const byte HC12SetPin = 6; // "SET" Pin on HC12

unsigned long timer = millis(); // Delay Timer

char SerialByteIn; // Temporary variable
char HC12ByteIn; // Temporary variable
String HC12ReadBuffer = ""; // Read/Write Buffer 1 for HC12
String SerialReadBuffer = ""; // Read/Write Buffer 2 for Serial
boolean SerialEnd = false; // Flag to indicate End of Serial String
boolean HC12End = false; // Flag to indiacte End of HC12 String
boolean commandMode = false; // Send AT commands

// Software Serial ports Rx and Tx are opposite the HC12 Rx and Tx
// Create Software Serial Port for HC12
SoftwareSerial HC12(HC12TxdPin, HC12RxdPin);

void setup() {

HC12ReadBuffer.reserve(64); // Reserve 64 bytes for Serial message input
SerialReadBuffer.reserve(64); // Reserve 64 bytes for HC12 message input

pinMode(HC12SetPin, OUTPUT); // Output High for Transparent / Low for Command
digitalWrite(HC12SetPin, HIGH); // Enter Transparent mode
delay(80); // 80 ms delay before operation per datasheet
Serial.begin(9600); // Open serial port to computer
HC12.begin(9600); // Open software serial port to HC12
}

void loop() {

while (HC12.available()) { // While Arduino's HC12 soft serial rx buffer has data
HC12ByteIn = HC12.read(); // Store each character from rx buffer in byteIn
HC12ReadBuffer += char(HC12ByteIn); // Write each character of byteIn to HC12ReadBuffer
if (HC12ByteIn == '\n') { // At the end of the line
HC12End = true; // Set HC12End flag to true
}
}

while (Serial.available()) { // If Arduino's computer rx buffer has data
SerialByteIn = Serial.read(); // Store each character in byteIn
SerialReadBuffer += char(SerialByteIn); // Write each character of byteIn to SerialReadBuffer
if (SerialByteIn == '\n') { // Check to see if at the end of the line
SerialEnd = true; // Set SerialEnd flag to indicate end of line
}
}

if (SerialEnd) { // Check to see if SerialEnd flag is true

if (SerialReadBuffer.startsWith("AT")) { // Has a command been sent from local computer
HC12.print(SerialReadBuffer); // Send local command to remote HC12 before changing settings
delay(100); //
digitalWrite(HC12SetPin, LOW); // Enter command mode
delay(100); // Allow chip time to enter command mode
Serial.print(SerialReadBuffer); // Echo command to serial
HC12.print(SerialReadBuffer); // Send command to local HC12
delay(500); // Wait 0.5s for a response
digitalWrite(HC12SetPin, HIGH); // Exit command / enter transparent mode
delay(100); // Delay before proceeding
} else {
HC12.print(SerialReadBuffer); // Transmit non-command message
}
SerialReadBuffer = ""; // Clear SerialReadBuffer
SerialEnd = false; // Reset serial end of line flag
}

if (HC12End) { // If HC12End flag is true
if (HC12ReadBuffer.startsWith("AT")) { // Check to see if a command is received from remote
digitalWrite(HC12SetPin, LOW); // Enter command mode
delay(100); // Delay before sending command
Serial.print(SerialReadBuffer); // Echo command to serial.
HC12.print(HC12ReadBuffer); // Write command to local HC12
delay(500); // Wait 0.5 s for reply
digitalWrite(HC12SetPin, HIGH); // Exit command / enter transparent mode
delay(100); // Delay before proceeding
HC12.println("Remote Command Executed"); // Acknowledge execution
} else {
Serial.print(HC12ReadBuffer); // Send message to screen
}
HC12ReadBuffer = ""; // Empty buffer
HC12End = false; // Reset flag
}
}

Hi

Ja, man kann einen Sketch in eine Lib umstricken.
Ja, hier gibt es wohl auch einige Leute, Die Das könnten.
Nein, Das wird wohl So nicht passieren - zumindest würde ich darauf nicht wetten :wink:

ABER: Du kannst Das selber - zumindest bekommst Du hier von diesen Leuten mit großer Wahrscheinlichkeit alle nur erdenkliche Hilfe, daß Du Das selber hinbekommen kannst.
Nicht in den nächsten 7 Tagen - aber Es wird werden!

Davon ab - warum MUSS das Zeug in eine Lib?

MfG

PS: Setze bitte Deinen Sketch in Code-Tags (</> Knopf im Editor) - kannst Du auch nachträglich machen

PPS: Was hat Dein Anliegen mit diesem Thread zu tun?
Wenn NICHTS, bitte einen eigenen Thread eröffnen ("HC-12" alleine reicht hier nicht)

Ich kann auch nicht erkennen, warum der kopierte Sketch in eine Library gepackt werden soll.
Aber hier findest du eine Beschreibung dazu, oder auch hier.