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.
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;
}
}
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:
Bei einem Druck toggelt der Zustand.
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);
}
}
}