Relais bleibt eingeschaltet.

Ich habe eine 433MHz Funkstrecke mit zwei Arduinos die super funktioniert.

Es werden zwei Relais gesteuert die beim auslösen per funk auch einschalten aber dann nicht mehr aus gehen wenn ich den Taster los lasse.

/*
  Simple example for receiving
  
  http://code.google.com/p/rc-switch/
  
  Need help? http://forum.ardumote.com
*/

#include <RCSwitch.h>
const int upPin = 7;
const int downPin = 8;

int led = 13;
RCSwitch mySwitch = RCSwitch();
#define pressed1 9   //defines incoming data set by user which is transmitted
#define pressed2 5


void setup() {
  pinMode(upPin, OUTPUT);
  digitalWrite (upPin, HIGH);

  pinMode(downPin, OUTPUT);
  digitalWrite (downPin, HIGH);
  
  Serial.begin(9600);
 mySwitch.enableReceive(0);  // Receiver on interrupt 0 => that is pin #2 pinMode(led,OUTPUT);
}
void loop() {
 
  if (mySwitch.available()) {
    
    int value = mySwitch.getReceivedValue();
    
    if (value == 0) {
      Serial.print("Unknown encoding");
    } 
    
          
if (mySwitch.getReceivedValue())

{
    process();

}

mySwitch.resetAvailable();

}
  
}
void process()
{
  unsigned long res = mySwitch.getReceivedValue();
  
  switch (res){
    case pressed1:
     Serial.println("pressed 1");
     digitalWrite (upPin, LOW);
     break;
     case pressed2:
     Serial.println("pressed 2");
     digitalWrite (downPin, LOW);
     break;
     default:
     Serial.println("nothing pressed"); //zum debugen
     digitalWrite (upPin, HIGH);
     digitalWrite (downPin, HIGH);
     break;

  }
}

Du rufst 3 Mal mySwitch.getReceivedValue() auf. Könnte es sein, dass dann kein Wert mehr da ist?

Speichere doch mal den Wert des ersten Aufrufs in einer globalen Variable und arbeite mit dieser.

Gruß Tommy

Danke für deinen Beitrag!

Sieht jetzt so aus und verhält sich unverändert:

/*
  Simple example for receiving
  
  http://code.google.com/p/rc-switch/
  
  Need help? http://forum.ardumote.com
*/

#include <RCSwitch.h>
const int upPin = 7;
const int downPin = 8;
int res = 0;

RCSwitch mySwitch = RCSwitch();
#define pressed1 9   //defines incoming data set by user which is transmitted
#define pressed2 5


void setup() {
  pinMode(upPin, OUTPUT);
  digitalWrite (upPin, HIGH);

  pinMode(downPin, OUTPUT);
  digitalWrite (downPin, HIGH);
  
  Serial.begin(9600);
 mySwitch.enableReceive(0);  // Receiver on interrupt 0 => that is pin #2 pinMode(led,OUTPUT);
}
void loop() {
 
  if (mySwitch.available()) {
    
   res = mySwitch.getReceivedValue();
   
   if (res == 0) {
    Serial.print("Unknown encoding");
    } 

    else {
      process();
    }
    
mySwitch.resetAvailable();

}
  
}

void process()
{
 
  switch (res){
    case pressed1:
     Serial.println("pressed 1");
     digitalWrite (upPin, LOW);
     break;
     case pressed2:
     Serial.println("pressed 2");
     digitalWrite (downPin, LOW);
     break;
     default:
     Serial.println("nothing pressed"); //zum debugen
     digitalWrite (upPin, HIGH);
     digitalWrite (downPin, HIGH);
     break;

  }
}

"default:" aus dem switch...case wird nie ausgeführt da ich im serial monitor nie "nothing pressed" ausgegeben bekomme!

So wie ich es verstehe, drückst du den Taster länger und solange du drückst, soll der Sender auch dein Signal aussenden ?
Ist das so richtig ?
Wenn ja, ist das grober unfug und du solltest aufpassen, dass du nicht Ärger mit deinen Nachbarn bekommst.
Das ist durchweg nicht erlaubt.

Aber es gibt Abhilfe.
Du schaltest mit dem ersten Signal ein und mit einem weiteren Signal aus.

@HotSystems

Danke für deinen Vorschlag/Einwand!

Ja, genau! Es wird solange gesendet wie der Taster am Sender gedrückt wird.

Ich möchte gerne ein elektrisches Fensterrollo damit steuern. Es gibt also einen Taster für hoch und einen für runter.

Wie könnte ich denn deinen Vorschlag umsetzen? --> boolean TRUE/FALSE?

petemanzel:
@HotSystems

Danke für deinen Vorschlag/Einwand!

Ja, genau! Es wird solange gesendet wie der Taster am Sender gedrückt wird.

Ich möchte gerne ein elektrisches Fensterrollo damit steuern. Es gibt also einen Taster für hoch und einen für runter.

Wie könnte ich denn deinen Vorschlag umsetzen? --> boolean TRUE/FALSE?

Hat dein Rollo einen Endschalter ?
Wenn ja, würde ich darauf abfragen.

Ansonsten die Zeit messen und es per "Timer" steuern.

Für die entsprechende Abfrage der Variablen kannst du boolean (bool) verwenden.

Genau, mit Timer funktioniert es ohne Probleme dank der Endschalter.

Es soll aber nicht nur ganz oben oder ganz unten sein.

Es soll auch mal einfach irgendwo an irgend einer Stelle dazwischen angehalten werden können.

petemanzel:
Genau, mit Timer funktioniert es ohne Probleme dank der Endschalter.

Es soll aber nicht nur ganz oben oder ganz unten sein.

Es soll auch mal einfach irgendwo an irgend einer Stelle dazwischen angehalten werden können.

Warum gibst du nicht gleich alle Informationen ?

Hast du schon einen fertigen Sketch dafür, wie du es mit dem Timer machst ?

Du musst dann eine Status-Variable setzen, die speichert ob das Rollo steht, hoch fährt oder runter fährt.
Die wird in der Loop abgefragt und diese setzt du durch das Funksignal.

HotSystems:
Warum gibst du nicht gleich alle Informationen ?

Hast du schon einen fertigen Sketch dafür, wie du es mit dem Timer machst ?

Du musst dann eine Status-Variable setzen, die speichert ob das Rollo steht, hoch fährt oder runter fährt.
Die wird in der Loop abgefragt und diese setzt du durch das Funksignal.

Sorry!

So funktioniert es mit den Delays!

/*
  Simple example for receiving
  
  http://code.google.com/p/rc-switch/
  
  Need help? http://forum.ardumote.com
*/

#include <RCSwitch.h>
const int upPin = 7;
const int downPin = 8;
int res = 0;

RCSwitch mySwitch = RCSwitch();
#define pressed1 9   //defines incoming data set by user which is transmitted
#define pressed2 5


void setup() {
  pinMode(upPin, OUTPUT);
  digitalWrite (upPin, HIGH);

  pinMode(downPin, OUTPUT);
  digitalWrite (downPin, HIGH);
  
  Serial.begin(9600);
 mySwitch.enableReceive(0);  // Receiver on interrupt 0 => that is pin #2 pinMode(led,OUTPUT);
}
void loop() {
 
  if (mySwitch.available()) {
    
   res = mySwitch.getReceivedValue();
   
   if (res == 0) {
    Serial.print("Unknown encoding");
    
    } 

    else {
      process();
    }

mySwitch.resetAvailable();

}
  
}

void process()
{
 
  switch (res){
    case pressed1:
     Serial.println("pressed 1");
     digitalWrite (upPin, HIGH);
     digitalWrite (downPin, HIGH);
     digitalWrite (upPin, LOW);
     delay (10000);
     digitalWrite (upPin, HIGH);
     digitalWrite (downPin, HIGH);
     break;
     case pressed2:
     Serial.println("pressed 2");
     digitalWrite (upPin, HIGH);
     digitalWrite (downPin, HIGH);
     digitalWrite (downPin, LOW);
     delay (10000);
     digitalWrite (upPin, HIGH);
     digitalWrite (downPin, HIGH);
     break;
     default:
     Serial.println("nothing pressed"); //zum debugen
     digitalWrite (upPin, HIGH);
     digitalWrite (downPin, HIGH);
     break;

  }
}

petemanzel:
So funktioniert es mit den Delays!

Nein, mit den delays() geht das nicht.
Dann kannst du nicht zwischendurch schalten, weil ein delay den Controller "anhält".

Du musst die Funktion "millis()" verwenden.
Sieh dir dazu "BlinkWithoutDelay" an, das gibt es als Beispiel in der IDE.

HotSystems:
Nein, mit den delays() geht das nicht.
Dann kannst du nicht zwischendurch schalten, weil ein delay den Controller "anhält".

Du musst die Funktion "millis()" verwenden.
Sieh dir dazu "BlinkWithoutDelay" an, das gibt es als Beispiel in der IDE.

Ich habe das jetzt für einen Taster gemacht.

Verhält sich aber komisch:

  1. Bei einem Druck toggelt der Zustand.

  2. Bei gedrückt halten schaltet es jede Sekunde ein mal ein und nach einer Sekunde aus.

/*
  Simple example for receiving
  
  http://code.google.com/p/rc-switch/
  
  Need help? http://forum.ardumote.com
*/

#include <RCSwitch.h>
const int upPin = 7;
const int downPin = 8;
int res = 0;

int upState = HIGH;             // Relais normal aus


unsigned long previousMillis = 0;        // will store last time relais was updated

// constants won't change:
const long interval = 1000;           // interval at which to blink (milliseconds)


RCSwitch mySwitch = RCSwitch();
#define pressed1 9   //defines incoming data set by user which is transmitted
#define pressed2 5


void setup() {
  pinMode(upPin, OUTPUT);
  digitalWrite (upPin, HIGH);

  pinMode(downPin, OUTPUT);
  digitalWrite (downPin, HIGH);
  
  Serial.begin(9600);
 mySwitch.enableReceive(0);  // Receiver on interrupt 0 => that is pin #2 pinMode(led,OUTPUT);
}
void loop() {
 
 
  
  if (mySwitch.available()) {
    
   res = mySwitch.getReceivedValue();
   
   if (res == 0) {
    Serial.print("Unknown encoding");
    
    } 

    else {
      process();
    }

mySwitch.resetAvailable();

}
  
}

void process()
{
 
  
  switch (res){
    case pressed1:
    Serial.println("pressed 1");
    
    unsigned long currentMillis = millis();
        
    if (currentMillis - previousMillis >= interval) {
    // save the last time you blinked the LED
    previousMillis = currentMillis;
    
    // if the LED is off turn it on and vice-versa:
    if (upState == LOW) {
      upState = HIGH;
    } else {
      upState = LOW;
    }
     
     digitalWrite(upPin, upState);
     
      }
  }
}