Mit HC-12 und Buttons Relay ansteuern

Hallo zusammen,

ich habe bezüglich dem HC-12 Modul ein Problem, nämlich möchte ich per Funk ein Relay ansteuern, was aber nicht klappen will.
Folgenes habe ich ausprobiert:

Sender:

#include <SoftwareSerial.h>

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


int buttonPin = 8;
int buttonPin2 = 9;
boolean onOff = 0;
void setup() {
  pinMode(buttonPin, INPUT);
  pinMode(buttonPin2, INPUT);
  mySerial.begin(9600);
  Serial.begin(9600);
}

void loop() {
 
  int buttonState = !digitalRead(buttonPin);//read button state
  int buttonState2 = !digitalRead(buttonPin2);//read button state
  
  if(buttonState == 1){//if button is down
    mySerial.println(1);//send unique code to the receiver to turn on. In this case 1111
    Serial.println(1);
    onOff = 1;//set boolean to 1
  }
  if(buttonState2 == 1){//Verifier to send off signal once
    mySerial.println(2);
    Serial.println(2);//send unique code to the receiver to turn off. In this case 0000
  }
  delay(20);//delay little for better serial communication
}

Empfänger:

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


#include <SoftwareSerial.h>

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

int ledPin = 11;
int relay = 7;
//Spätere Zuenddauer des Zünders
int zuenddauer = 1000;


void setup() {
  mySerial.begin(9600);
  pinMode(ledPin, OUTPUT);
  pinMode(relay, OUTPUT);
  digitalWrite(relay, LOW);
}

void loop() {
   
  if(mySerial.available() > 0){    

    //read serial input and convert to integer (-32,768 to 32,767)    
    int input = mySerial.parseInt();
    

    switch(input){
      
        case 1 :
          digitalWrite(relay, HIGH);
          delay(zuenddauer);
          digitalWrite(relay, LOW);
        break;

        case 2 : 
          digitalWrite(ledPin, HIGH);

        break;
      
      }

      
  }
  //Clear Buffer
  mySerial.flush();
 
}

Wäre nett wenn ihr mal drüberschauen könntet.

Das ist interessant....wenn du noch beischreiben könntest, was funktioniert und was nicht funktioniert.

Dann wäre für uns die Suche einfacher.

Also wenn ich den Button 1 der an Pin 8 anliegt drücke wird nichts im Seriellen Monitor angezeigt, und auch nichts gesendet. Mit diesem Code (siehe unten)hat es mit einer Led geklappt, aber mit dem Relay und mehreren Buttons nicht

Voheriger Sender mit Led

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


#include <SoftwareSerial.h>

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


int buttonPin = 8;
boolean onOff = 0;
void setup() {
  pinMode(buttonPin, INPUT);
  mySerial.begin(9600);
  Serial.begin(9600);
}

void loop() {
 
  int buttonState = !digitalRead(buttonPin);//read button state
  
  if(buttonState == 1){//if button is down
    mySerial.println(1);//send unique code to the receiver to turn on. In this case 1111
    Serial.println(1);
    onOff = 1;//set boolean to 1
  }
  if(buttonState == 0 && onOff == 1){//Verifier to send off signal once
    mySerial.println(0);
    Serial.println(0);//send unique code to the receiver to turn off. In this case 0000
  }
  delay(20);//delay little for better serial communication
}

Empfeanger mit led

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


#include <SoftwareSerial.h>

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

int ledPin = 11;

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

void loop() {
   
  if(mySerial.available() > 0){    
    int input = mySerial.parseInt();//read serial input and convert to integer (-32,768 to 32,767)    
    if(input == 1){//if on code is received
      digitalWrite(ledPin, HIGH);//turn LED on
    }
    if(input == 0){//if off code is received
      digitalWrite(ledPin, LOW);//turn LED off
    }
  }
  mySerial.flush();//clear the serial buffer for unwanted inputs     
  
  //delay(20);//delay little for better serial communication
 
}

Denke es liegt am "senden" werde aber nicht schlüssig

Dann sind deine Taster falsch angeschlossen.

Du musst einen Pullup bzw. Pulldown-Widerstand am Pin einsetzen, je nach dem ob du gegen Plus oder GND schaltest.

Und bitte nicht immer neue/andere Sketche posten, dann weiß keiner mehr was nun aktuell ist, also bleibe bei einem Sketch.

Wenn du auf High abfragst, brauchst du einen Pulldown.

Besser ist, wenn du ein Schaltbild postest, wie du alles angeschlossen hast.

Hier hab ich den Schaltplan gebastelt:

Gebastelt ist richtig. :wink:

Was hast du für einen HC-12 ? Datenblatt lesen und poste bitte einen Hyperlink zum anklicken.
ich kenne nur welche, die mit 5 Volt arbeiten.

Der Taster schaltet gegen GND, dann kannst du nicht auf High abfragen. Und ein Pullup fehlt.
Die Led braucht einen Vorwiderstand, anders killst du evtl. den Ausgang von Uno.

Ich sehe schon, du musst noch einige Grundlagen lernen. Das kann so nicht funktionieren.

Sehe erst mal zu, dass du mit einem Taster eine Led ein bzw. ausschalten kannst. ganz ohne Funkmodule. Das ist nochmal ein anderer Schritt, den du erst gehen solltest, wenn alles andere (Taster mit Led) funktioniert.

Edit:

OK....habe im Datenblatt gesehen, die arbeiten schon ab 3,2 Volt. Da reicht aber der Strom nicht aus, vom Uno.

Wenn du im Setup folgendes schreibst:

pinMode(buttonPin, INPUT_PULLUP);

Kannst du den Taster gegen GND verwenden und schaltest den internen Pullup-Widerstand ein.
Aber du musst auf Low abfragen, wie z.B.:

 if(buttonState == 0){}

Ich hatte den Wiederstand vergessen einzuzeichen :frowning:
Aber ich habe doch hier

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

es umgekehrt, dann kann ich es nicht so auch machen? Ich probiere es mal aus.

Gruß
Sebastian

kiefer_dev:
Aber ich habe doch hier

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

es umgekehrt, dann kann ich es nicht so auch machen? Ich probiere es mal aus.

Ja, das geht auch. Da musst du noch einen anderen Fehler machen, dem ich nicht sehen kann.

Teste mal den folgenden, minimalen Sketch.
Der funktioniert def. und die Led 13 geht an (Pin8 auf GND) bzw. aus (Pin8 offen).

int buttonPin = 8;
int ledPin = 13;


void setup() {
  Serial.begin(9600);
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(ledPin, OUTPUT);
}

void loop() {
  int buttonState = !digitalRead(buttonPin);

  if (buttonState) {
    digitalWrite(ledPin, HIGH);
    Serial.print("1");
  }
  else {
    digitalWrite(ledPin, LOW);
    Serial.print("0");
  }
}

Ich habe den Sketch jetzt so umgeschrieben, hat auch funktioniert und dann bei einem neuen Upload hat es nicht mehr geklappt:

Sender

#include <SoftwareSerial.h>

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

int buttonPin = 8;
boolean onOff = 0;
void setup() {
  pinMode(buttonPin, INPUT);
  mySerial.begin(9600);
  Serial.begin(9600);
  
}

void loop() {
  int buttonState = digitalRead(buttonPin);//read button state
  
  if(buttonState == 1){//if button is down
    mySerial.println(1);//send unique code to the receiver to turn on. In this case 1111
    Serial.println(1);
    onOff = 1;//set boolean to 1
  }
  if(buttonState == 0 && onOff == 1){//Verifier to send off signal once
    mySerial.println(0);//send unique code to the receiver to turn off. In this case 0000
    Serial.println(0);
  }
  delay(20);//delay little for better serial communication
}

Empfänger

#include <SoftwareSerial.h>

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

int ledPin = 12;
int onOff = 0;
int zuenddauer = 1000;
int freischaltWarteZeit = 4000;
void setup() {
  mySerial.begin(9600);
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);
}
void loop() {
   
  if(mySerial.available() > 0){    
 
    int input = mySerial.parseInt();//read serial input and convert to integer (-32,768 to 32,767)    
    if(input == 1 && onOff == 0){//if on code is received
      digitalWrite(ledPin, HIGH);//turn LED on
      delay(zuenddauer);
      digitalWrite(ledPin, LOW);//turn LED on
      onOff = 1;
    }
    if(input == 0 && onOff == 1){//if off code is received
      
      onOff = 0;
    }
  }
  mySerial.flush();//clear the serial buffer for unwanted inputs     
  
  delay(20);//delay little for better serial communication
 
}

Hat einer eine Idee was es sein könnte?

Ja, du hast etwas falsch gemacht.

Beschreibe doch mal besser, was du genau gemacht hast und was nicht funktioniert.

Warum muss man immer nachfragen ?
Deine Aussagen sind sehr dürftig.

Schau mal, wo onOff jemals wieder auf false gesetzt wird ...

    mySerial.println(1);//send unique code to the receiver to turn on. In this case 1111

Falsche Kommentare sind übrigens sehr unschön.

kiefer_dev:
Hat einer eine Idee was es sein könnte?

Warum machst du dir das so schwer ?
Ich hatte dir ein Beispiel gepostet, mit dem du die Tastenfunktion erst aufbauen und lernen kannst.

Wenn das funktioniert, geht es weiter mit dem Sender.
Da deine Grundlagen aber nach wie vor nicht ausreichen, solltest du langsam an das Projekt gehen.

Mit dem Kopf durch die Wand, ist nie optimal.

Wie hast du denn deinen Taster jetzt angeschlossen ?

So ich habe jetzt dein Beispiel genommen und es hat geklappt, nun wenn ich die Daten über Serial.println() ausgebe funtioniert es, wenn ich jetzt mySerial.println() dazuschreibe, wird nichts mehr ausgegeben, gar gesendet.

HotSystems:
Wenn das funktioniert, geht es weiter mit dem Sender.
Da deine Grundlagen aber nach wie vor nicht ausreichen, solltest du langsam an das Projekt gehen.

Ich habe bereits mehrere Arduino Projekte umgesetzt auch mit tastern, und per wireless mit VirtualWire,
nun möchte ich mich mit dem hc-12 auseinandersetzen und habe mir schon viele tutorials darüber angeschaut, aber bis jetzt habe ich allles ausser das wie oben beschrieben geschafft.

michael_x:
Schau mal, wo onOff jemals wieder auf false gesetzt wird ...

Im Sender oder im Empfänger? Wäre hilfreich

Habe den Empfänger jetzt so:

#include <SoftwareSerial.h>

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

int buttonPin = 8;
boolean onOff = 0;
void setup() {
  pinMode(buttonPin, INPUT_PULLUP);
  HC12.begin(9600);
  Serial.begin(9600);
}

void loop() {
 
  int buttonState = !digitalRead(buttonPin);//read button state
  
  if(buttonState){//if button is down
    Serial.println(1);
    HC12.println(1);
    onOff = 1;//set boolean to 1
  }
  if(!buttonState && onOff== 1){//Verifier to send off signal once
     Serial.println(0);
    HC12.println(0);
    
  }
  delay(20);//delay little for better serial communication
}

Ehrlich.....wie soll man da noch durchsteigen.

Ich hatte dir schon mal geschrieben, du sollst bei einem Sketch bleiben und den nicht ständig austauschen.

Auch verstehe ich nicht, warum du nicht den Sketch zeigst, der das Problem darstellt.
Wozu braucht der Empfängersketch einen Eingangspin ?

Du machst es uns nicht gerade leicht zu helfen.

Ach tut mir leid der gepostete Sketch is der von dem Sender.
Das problem liegt darin das er nicht mehr die Daten im seriellen Monitor ausgibt und nicht mehr sendet,
wenn man die HC12.println() rausnimmt wird alles richtig ausgeben, jetzt möchte ich es nur noch hinbekommen die Daten auch zu senden

Beantworte bitte auch die anderen Fragen.

So ich erkläre dir noch Mal mein Projekt und das dazugehörige Problem und hoffe du verstehst es und kannst mir helfen.
Ich baue einen Fernzünder für Silvester, der per Funk über das hc-12 Modul läuft, der Sender hat 16 Buttons, die je eine Zahl an den Empfänger senden der dann diesen Kanal (das relay) 1s lang zündet, der Empfänger funktioniert soweit wenn er die Daten bekommt, der Sender allerdings nicht, das ausgeben ob der Button gedrückt ist funktioniert im seriellen Monitor, aber sobald ich über das hc-12 Modul senden will kommt weder die Daten im Monitor an als das sie gesendet werden , also mein Problem liegt also am Sender der die Daten weder im Monitor als auch an das hc-12 Modul ausgeben will. Ich hoffe du hast es halbwegs gut verstanden

Das habe ich schon verstanden, auch vorher....nur du verstehst meine Frage nicht.

Wie hast du den Taster jetzt angeschlossen ?

Den habe ich an D8 und GND angeschlossen