Notabschaltung schaltet nicht automatisch

Hallo zusammen,
ich habe ein kleines Problem, bei meinem Sketch.
Ich sende auf 433 MHz mit dem Sendemodul FS1000A. Ein Taster an A1-Pin sendet ON oder OFF an einem Empfänger, der ein Relais ansteuert. Klappt soweit auch

Wenn ich den Taster betätige leuchtet eine Betriebs LED an Pin 2 und das Relais bleibt so lange geschaltet, bis ich ein weiteres Mal den Taster drücke. Nach 10000 ms soll die Abschaltung der Betriebs LED sowie das Senden des OFF Wertes automatisch erfolgen.
Leider bisher erfolglos, nach 10000 ms passiert nix. was mache ich da falsch?

#include <VirtualWire.h>

#undef int
#undef abs
#undef double
#undef float
#undef round

const int Pumpe_IO_Taster = A1;                 // Taster für Pumpe EIN / AUS , 
const int rxPin     = 10;                       // Daten Empfang
const int Pumpenbetriebs_ledPin    = 2;         // LED für Pumpenbetrieb
unsigned long LED_timestore;
int state;
int lastState;
int pumpenState;
char *message;

void setup()
{
  pinMode(Pumpenbetriebs_ledPin, OUTPUT);
  pinMode(Pumpe_IO_Taster, INPUT);

  vw_set_ptt_inverted(true);
  vw_setup(1000);
  vw_set_tx_pin(rxPin);
}
void loop()
{   
   state = digitalRead(Pumpe_IO_Taster);
   
    if (state != lastState)               // wenn Taster gedrückt, wird die Pumpe eingeschaltet, erneutes drücken schaltet die Pumpe aus
  {
    if (state == HIGH)                   // wenn Sstatus Positiv ist....
    {
      if (pumpenState == HIGH)            // wenn Betriebsstatus eingeschaltet ist....
      {
      if (millis() - LED_timestore > 10000 ) {  // nach der Zeit von 10000 ms soll Pumpe automatisch AUS schalten
        pumpenState = LOW;                   //  schalte Betriebslampe aus
        message = "OFF";                         //  schreibe den Befehl "OFF" in das Sende Protokoll
      }}
      else                                             // ansonsten wenn alles aus ist....
      {
        pumpenState = HIGH;                //  schalte Betriebslampe ein
        message = "ON";                   //  schreibe den Befehl "ON" in das Sende Protokoll

      }
          digitalWrite(Pumpenbetriebs_ledPin, pumpenState);     
       
      
                                                        // LED am Sender ein- oder ausschalten
       vw_send((uint8_t *)message, strlen(message)); // LED Status ON oder OFF an Empfänger senden
      vw_wait_tx();  
      
      }
 
    lastState = state;
    delay(20);
  }  
}

if (state != lastState)

sicher dass diese Bedingung nach 10 sec noch erfüllt ist ?

Mit richtigem Einrücken evtl. leichter zu sehen ...

Und wann wird LED_timestore jemals gesetzt ?

Oh , sorry da hatte ich noch ein paar Zeilen vergessen.

#include <VirtualWire.h>

#undef int
#undef abs
#undef double
#undef float
#undef round

const int Pumpe_IO_Taster = A1;                 // Taster für Pumpe EIN / AUS ,
const int rxPin     = 10;                       // Daten Empfang
const int Pumpenbetriebs_ledPin    = 2;         // LED für Pumpenbetrieb

unsigned long LED_timestore = 0;
unsigned long interval = 1000;

int state;
int lastState;
int pumpenState;
char *message;

void setup()
{
  pinMode(Pumpenbetriebs_ledPin, OUTPUT);
  pinMode(Pumpe_IO_Taster, INPUT);

  vw_set_ptt_inverted(true);
  vw_setup(1000);
  vw_set_tx_pin(rxPin);
}
void loop()
{
  unsigned long currentMillis = millis();
  
  state = digitalRead(Pumpe_IO_Taster);
  
  if (state != lastState)               // wenn Taster gedrückt, wird die Pumpe eingeschaltet, erneutes drücken schaltet die Pumpe aus
  {
    if (state == HIGH)                   // wenn Status Positiv ist....
    {
      if (pumpenState == HIGH)            // wenn Betriebsstatus eingeschaltet ist....
      {
        if (currentMillis - LED_timestore >= 10000 ) {  // nach der Zeit von 10000 ms soll Pumpe automatisch AUS schalten
          LED_timestore = currentMillis;
          pumpenState = LOW;                   //  schalte Betriebslampe aus
          message = "OFF";                         //  schreibe den Befehl "OFF" in das Sende Protokoll
        }
      }
      else                                             // ansonsten wenn alles aus ist....
      {
        pumpenState = HIGH;                //  schalte Betriebslampe ein
        message = "ON";                   //  schreibe den Befehl "ON" in das Sende Protokoll

      }
      digitalWrite(Pumpenbetriebs_ledPin, pumpenState);
                                                     // LED am Sender ein- oder ausschalten
      vw_send((uint8_t *)message, strlen(message)); // LED Status ON oder OFF an Empfänger senden
      vw_wait_tx();
    }
    lastState = state;
    delay(20);
  }
}

Jetzt lässt sich nach dem einschalten das Relais 10 sec. nicht mehr Abschalten.

Mal kurz zum Verständnis.
Ich will eine Pumpe mittels Taster, per Funk einschalten und jederzeit wieder abschalten. Wenn ich vergessen sollte die Pumpe auszuschalten, soll nach einer Zeit von 5 min
(habe es auf 10000 ms gesetzt, damit ich nicht so lange warten muss) die Pumpe automatisch abgeschaltet werden.

Wozu soll das gut sein?

#undef int
#undef abs
#undef double
#undef float
#undef round

Wenn die Notabschaltung nur getestet wird, wenn am Taster eine Änderung eintritt, dann kann das ja nicht funktionieren.

Alles klar?

Ich habe mich an folgendem Tutorial orientiert. fluuux.de Dort waren die #undef … Zeilen auch drin.
Sorry, verstehe nicht ganz was du meinst mit dem testen. Oder muss ich die Abschaltung von dem Relais in dem Empfänger Modul reinschreiben?

Eine Frage habe ich aber, warum nutzt du in Sender Sketch die Direktiven #undef int, #undef abs,#undef double,#undef float,#undef round ?

Hat das was mit dem Attiny zu tun?
Ich frage, weil ich bei der Benutzung eines ATTiny84 (nicht auf das Beispiel oben bezogen, also komplett anderer Sketch) Probleme bei der Nutzung globaler Variablen habe. Es scheint mir fast so, als „vergisst“ der Tiny die eine oder andere global deklarierte Variable. Hat das vielleicht was damit zu tun?

Danke.

profwebapps
on 9. Juli 2014 at 11:06 said:

Nein ich denke eher das hat was mit der VirtualWire Library zu tun.
Als ich damit anfing habe ich das so in den verschiedensten Beiträgen und im Arduino Kochbuch gefunden.
Habe mich aber nicht weiter damit beschäftigt.

Da wusste schon der Author nicht was er veröffentlicht, echt traurig.

Du möchtest zwei Aufgaben erledigen, die sich nicht gegenseitig blockieren dürfen. Die sollten nacheinander in loop() drinstehen, oder in zwei Unterprogrammen, die beide in loop() aufgerufen werden. Die erste Funktion fragt den Taster ab, und schaltet den Motor ein und aus. Die zweite Funktion prüft ständig, ob und wie lange der Motor schon läuft, und schaltet ihn bei Überschreiten der maximalen Zeit ab.