Arduino Uno & 433 Mhz Sender & Switch & LED

Hallo,
ich würde gerne mit meinem Arduino UNO R3, einem 433 Mhz Sender, einem Mikrotaster und einer LED sozusagen eine Fernbedienung bauen.
Wenn der Taster betätigt wird soll eine Funksteckdose eingeschaltet werden, als Bestätigung dafür soll eine LED leuchten.
Bis der Taster ein weiteres mal gedrückt wird sollen die LED und die Funksteckdose anbleiben.
Bei einer weiteren Betätigung sollen LED & Funksteckdose ausgehen.
Ich habe versucht einen Code zu schreiben jedoch muss in ihm irgendein Fehler sein. Ich finde ihn aber leider nicht.
Vielleicht könnte ja mal jemand mit mehr Erfahrung mir sagen ich alles richtig gemacht habe und ob ich es schon von Grund auf falsch angegangen habe.

MfG Dirtrunner

Der Code den ich als erstes gepostet habe war Mist. (Habe ihn gelöscht aus dem oberen Post)
Der folgende Code funktioniert wie er soll nur habe ich das Problem das man den Taster ca. 1-3sek. gedrückt halten muss.
Außerdem sendet er immer wieder die Signale aus anstatt nur dann tätig zu werden wenn der Taster ein weiteres Mal betätigt wird.
Wie man das realisieren kann weiß ich leider nicht da ich erst seit sehr kurzer Zeit programmiere und mich mit dem Arduino beschäftige..
Über eure Hilfe würde ich mich sehr freuen.

#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();
int inPin = 2;  
int outPin = 11; 

int state = HIGH;      
int reading;          
int previous = LOW; 

long time = 0;         
long debounce = 200;  

void setup() 
{
  pinMode(inPin, INPUT);
  pinMode(outPin, OUTPUT);


  Serial.begin(9600);
  mySwitch.enableTransmit(10);
}
void loop() 
{
{
  reading = digitalRead(inPin);
if (reading == HIGH && previous == LOW && millis() - time > debounce) {
    if (state == HIGH)
      state = LOW;
    else
      state = HIGH;

    time = millis();    
  }


  
if (state == LOW)
    {
    mySwitch.send("001000000000011111111");
    delay(60);
    mySwitch.send("001000000000011111111");
    delay(60);
    mySwitch.send("001000000000011111111");   
    Serial.println("AUS");
  }
    else{ 
    mySwitch.send("001000000000011101110");
    delay(60);
    mySwitch.send("001000000000011101110");
    delay(60);
    mySwitch.send("001000000000011101110");
    delay(60);
    mySwitch.send("001000000000011101110");
    Serial.println("AN");
   }
  digitalWrite(outPin, state);
  previous = reading;
}}

Wie hast Du den Taster angeschlossen? Pullup bzw -down vorhanden?

Ich bin in dem Fall dem Tutorial auf Arduino.cc gefolgt und habe einen 10kohm Widerstand zwischen die Masse des Taster und die Masse des Arduino geschaltet (also einen Pulldown-Widerstand).
Ich hab mal eine kleine Skizze gemacht.

...habe einen 10kohm Widerstand zwischen die Masse des Taster und die Masse des Arduino geschaltet (also einen Pulldown-Widerstand).
Ich hab mal eine kleine Skizze gemacht.

Da ein Taster zwar mechanisch 4 Pins hat, logisch aber nur 2, taugt ein Fritzing Bild nicht viel.
Kann sein der Taster ist um 90 ° falsch gedreht.
Wichtig ist, dass der Arduino Eingang immer eine elektrische Verbindung braucht:
Bei Pulldown immer über Widerstand mit GND verbunden, unabhängig vom Taster-Zustand. Wenn gedrückt, wird der Eingang zusätzlich direkt mit 5V verbunden.

5V  ----.__.---+----> In
               | 
GND --- 10k ---+

(In Fritzing wird es eindeutig, wenn du nur 2 diagonal gegenüberliegende Pins des Tasters verbindest)

Sorry, wenn das für dich klar war

Okay... Ich denke der Taster hat nichts direkt damit zu tun das die Schaltung "so langsam ist" hatte vorher eine Schaltung mit selbem Aufbau gemacht und da ging die LED sofort an bzw. aus.
Ich denke es ist eher ein Problem im Code?
Den Tastendruck erkennt er ja auch nur das es halt eine kurze Zeit dauert...

Wie lange dauert 4*

mySwitch.send("001000000000011101110");
  • 3*60 ms
  • 200 ms debounce ?

Eine halbe Sekunde Reaktionszeit ist "langsam" :wink:
Setz debounce mal auf 5 ... 10

Hab ich bringt leider auch nichts.
Eigentlich wäre es auch vom Code besser wenn nur wenn sich der Zustand von HIGH auf LOW bzw. LOW auf HIGH ändert auch wirklich gesendet.
Nur wie man das umsetzt bringt mich grad ein bisschen zum verzweifeln :frowning:

Hab's mir grade nochmal angeguckt und sollte eigentlich einfach sein :wink:
(Hab mal globale Variable rausgeschmissen.
Debounce brauchst du auch nicht, wenn nach jedem Wechsel ein delay drin ist)

void loop() 
{
  static boolean previous;  // alter Tasterzustand
  static boolean state;  // LED Zustand 
  boolean reading = digitalRead(inPin);
  if (reading != previous) 
  { 
     if (reading == HIGH)
     {
        state = ! state;
        RC_Send(state); // mit delay
     }
     else
     {
          delay(5); // auch beim loslassen entprellen 
     }
  previous = reading;
  }
  digitalWrite(outPin, state);
}

void RC_Send(boolean x)
{
   if (x == HIGH)
   {
      // myswitch ...
      delay(60);   
   }
   else
   {
      // myswitch ...
      delay(60);   
   }
}

Ungetestet, noch nicht mal testkompiliert
Sollte die LED ohne Verzögerung umschalten.
RC_send() wird nur einmal bei jedem neuen Tastendruck aufgerufen.

Also ich hab es jetzt so gelöst.
Funktioniert super schaltet schnell und ohne Probleme :slight_smile:
der Code funktioniert jetzt auch endlich so das wenn nichts passiert auch kein Signal gesendet wird :slight_smile:
Hab die Lösung jetzt mal gepostet vielleicht kann es ja noch jemand anders gebrauchen :slight_smile:
Falls jemand einen Verbesserungsschlag bescheid sagen :wink:

#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();
int inPin = 2;  
int outPin = 11; 

int state = HIGH;      
int reading;          
int previous = LOW; 

long time = 0;         
long debounce = 200;  

void setup() 
{
  pinMode(inPin, INPUT);
  pinMode(outPin, OUTPUT);


  Serial.begin(9600);
  mySwitch.enableTransmit(10);
}
void loop()
{
  reading = digitalRead(inPin);
    if (reading == HIGH && previous == LOW && millis() - time > debounce)
     {
    previous = reading;
    Serial.println(" ");      
    Serial.println("AUS");
    mySwitch.send("001000000000011111111");
    delay(60);
    mySwitch.send("001000000000011111111");
    delay(60);
    mySwitch.send("001000000000011111111");   
    digitalWrite(outPin, LOW);
    previous = HIGH;
    
    }
    else if (reading == HIGH && previous == HIGH)  
    {
    previous = LOW;
    mySwitch.send("001000000000011101110");
    delay(60);
    mySwitch.send("001000000000011101110");
    delay(60);
    mySwitch.send("001000000000011101110");
    delay(60);
    mySwitch.send("001000000000011101110");
    Serial.println(" ");
    Serial.println("AN");
    digitalWrite(outPin, HIGH);
    }
    else
    {
    }
  }