Variablen übergabe dauert lange

Hallo,
ich versuche einen Taster als AN/AUS Schlater zu programmieren.

Die Schleife läuft "direckt" durch.
Bei der letzten if, wird "digitalWrite(speicher, LOW);" ausgeführt.
Aber es dauert ca. 6 Sekunden bis über "speicher_status = digitalRead(speicher);"
der wert von "speicher" übernommen wurde.

Hat jemand eine idee warum das so ist?
Ich bin absoluter anfänger und versuche selber lösungen zu finden, aber hir finde ich nichts.
Fals es ein absoluter Grundlagernfehler ist bitte ich um nachsicht.

// programm variablen
byte power = 0;
byte speicher = 0;
byte speicher_status =0;
int zaehler=0;

// LED`s
const byte led1=2;
const byte led2=3;
const byte led3=4;
const byte led_an=8;
const byte led_aus=9;
byte hupe=15;

// schalter
const byte power_sw=10;
const byte tuer1=5;
const byte fenster1=6;
const byte fenster2=7;

byte led_an_status=0;             // port variablen
byte led_aus_status=0;
byte power_sw_status=0;


   void setup() 
   {
 //    Serial.begin(9600);
       
     pinMode(led_an, OUTPUT);     // output
     pinMode(led_aus, OUTPUT);

     pinMode(power_sw, INPUT);     // input 


   }

void loop() 
{
 power_sw_status = digitalRead(power_sw);
 led_an_status = digitalRead(led_an);
 led_aus_status = digitalRead(led_aus);
 speicher_status = digitalRead(speicher);

// Serial.println(speicher);
     
              
       
       if ((power_sw_status == HIGH) && (zaehler ==0) && (speicher_status == LOW))
        { 
          zaehler++;
          digitalWrite(speicher, HIGH);
          digitalWrite(led_an, HIGH);
          digitalWrite(led_aus, LOW);
        }

        else if ((power_sw_status == HIGH) && (zaehler == 1) && (speicher_status == LOW))
        {
           zaehler--;
           digitalWrite(speicher, HIGH);
           digitalWrite(led_an, LOW);
           digitalWrite(led_aus, HIGH);
        }


       if ((power_sw_status == LOW) && (speicher_status == HIGH))
       {
           digitalWrite(speicher, LOW);
       }
 
}

Ohne ein

pinMode(speicher, OUTPUT);

schaltet digitalWrite nicht den Zustande des Pins, sondern die Aktivierung des PullUp Widerstands.

Ich würde I/O Pins auch nicht als Speicher benutzen... aber das ist eine andere Geschichte.

"speicher" soll kein pin sein,
irgend wie sehe ich nicht wo ich speicher als pin benutze.

Kann ich nicht mit digitalWrite einen Wert in eine Variable setzen, die kein pin hat?

p.s. der Taster mit Pulldown wiederstand.

alf03181:
"speicher" soll kein pin sein,
irgend wie sehe ich nicht wo ich speicher als pin benutze.

Ich sehe keine andere Benutzung.

speicher_status = digitalRead(speicher);

// Serial.println(speicher);

if ((power_sw_status == HIGH) && (zaehler ==0) && (speicher_status == LOW))
{
zaehler++;
digitalWrite(speicher, HIGH);
digitalWrite(led_an, HIGH);
digitalWrite(led_aus, LOW);
}

else if ((power_sw_status == HIGH) && (zaehler == 1) && (speicher_status == LOW))
{
zaehler--;
digitalWrite(speicher, HIGH);
digitalWrite(led_an, LOW);
digitalWrite(led_aus, HIGH);
}

if ((power_sw_status == LOW) && (speicher_status == HIGH))
{
digitalWrite(speicher, LOW);
}

alf03181:
Kann ich nicht mit digitalWrite einen Wert in eine Variable setzen, die kein pin hat?

Nein. (Die Aussage "Variable die keinen Pin hat" ist sinnlos, keine Variable hat einen Pin)

digitalWrite()

Description

Write a HIGH or a LOW value to a digital pin.

If the pin has been configured as an OUTPUT with pinMode(), its voltage will be set to the corresponding value: 5V (or 3.3V on 3.3V boards) for HIGH, 0V (ground) for LOW.

If the pin is configured as an INPUT, digitalWrite() will enable (HIGH) or disable (LOW) the internal pullup on the input pin. It is recommended to set the pinMode() to INPUT_PULLUP to enable the internal pull-up resistor. See the digital pins tutorial for more information.

alf03181:
"speicher" soll kein pin sein,
irgend wie sehe ich nicht wo ich speicher als pin benutze.

Kann ich nicht mit digitalWrite einen Wert in eine Variable setzen, die kein pin hat?

p.s. der Taster mit Pulldown wiederstand.

Nein, mit "digitalWrite" schreibst du Daten auf einen zuvor definierten Pin.
Willst du einen Wert in eine Variable schreiben, machst du es evtl. so:
"Variablenname = Wert;"

Es läuft....
Vielen dank für die Tipps,

hier noch mal wie ich es jetzt gelöst habe, fals anderre änliche Probleme haben.

// programm variablen
byte power = 0;
byte speicher = 0;
byte speicher_status =0;
int zaehler=0;

// LED`s
const byte led_an=8;
const byte led_aus=9;


// schalter
const byte power_sw=10;

// port variablen
byte led_an_status=0;
byte led_aus_status=0;
byte power_sw_status=0;


   void setup() 
   {   
           
     pinMode(led_an, OUTPUT);  // output
     pinMode(led_aus, OUTPUT);
                 
     pinMode(power_sw, INPUT);     // input 

   }

void loop() 
{
 power_sw_status = digitalRead(power_sw);
 led_an_status = digitalRead(led_an);
 led_aus_status = digitalRead(led_aus);
     
           
       
       if ((power_sw_status == HIGH) && (zaehler ==0) && (speicher == 0))
        { 
          zaehler++;
          speicher = 1;
          digitalWrite(led_an, HIGH);
          digitalWrite(led_aus, LOW);
        }

        else if ((power_sw_status == HIGH) && (zaehler == 1) && (speicher == LOW))
        {
           zaehler--;
           speicher = 1;
           digitalWrite(led_an, LOW);
           digitalWrite(led_aus, HIGH);
        }


       if ((power_sw_status == LOW) && (speicher == 1))
       {
            speicher = 0;
       }
 
}

Und wofürverwendest du "led_an_status" und "led_aus_status" ?
Sowie digitalRead(led_an) an dem Pin den du als Output definiert hast.

Die sehe ich nicht weiiter in Verwendung.

Optimal ist das noch nicht.

Da kommt noch was ran, wird eine Alarmanlage als anfänger spielerei.

Ich glaube da kann mann sich den status sparen und direkt die LED ports lesen und schreiben, also ja da geht noch was.

Kann jemand mir aber erklären wiso es vorher ging aber immer mit 6sek. verzögerung bei der Variablen übergabe.

Wäre nur gut zu wissen was da passiert ist.

Weil du etwas falsch gemacht hast.
Es war keine Variablenübergabe, hatteich doch schon geschrieben.
Du wolltest etwas auf einen Pin schreiben, den es nicht gibt.

Ja, aber es ging ja nach 6Sekunden, es war aber nirgends ein delay drin.
das ist das was ich nicht verstehe.

Das ich da den besagten Fehler hatte weiss ich jetzt auch, ich bin auch froh das ich den mit eurer hilfe lösen und verstehen könnte.

Nur die 6Sek. verzögerung bei den fehler verstehe ich nicht.

alf03181:
Hallo,
ich versuche einen Taster als AN/AUS Schlater zu programmieren.

Du meinst sowas in der Art: Einmal drückdn, Ausgang HIGH schalten, nochmal drücken, Ausgang LOW schalten?

Hast Du das zur IDE mitgelieferte Programmbeispiel "StateChangeDetection schon mal ausprobiert?

Wenn ja: Hast Du dabei was gelernt?
Wenn nein: Warum nicht?

Den Status eines Ausgangs zu lesen funktioniert nicht bei allen Arduinos (beim DUE nicht, bei anderen weiß ich es nicht) Darum sollte man es sich nicht angewöhnen Den Zustand von Ausgängen einzulesen sondern den Zustand in einer Variablen zwischenzuspeichern. Dann kann man auch einfach die Variable in den digitalWrite schreiben:
digitalWrite(pin , status_pin);

Grüße Uwe

@jurs

  1. Ja so soll es laufen
  2. IDE mitgelieferte Programmbeispiel "StateChangeDetection schon mal ausprobiert? -->> Die kenne ich nicht ^^

@uwefed
Danke für den Hinweis.

alf03181:
2. IDE mitgelieferte Programmbeispiel "StateChangeDetection schon mal ausprobiert? -->> Die kenne ich nicht ^^

Das wäre aber wichtig, da lernt man schon eine ganze Menge um mit dem Arduino zurecht zu kommen.
Dafür sind ja alle Beispiele vorhanden.

alf03181:
@jurs

  1. IDE mitgelieferte Programmbeispiel "StateChangeDetection schon mal ausprobiert? -->> Die kenne ich nicht

Die IDE wird mit einer ganzen Menge kleiner Beispielprogramme ausgeliefert, Du findest die Beispiele im Hauptmenü der IDE unter:
"Datei-Beispiele" bzw. "File-Examples" (je nach Spracheinstellung Deutsch/Englisch)

Das Beispiel "StateChangeDetection" erklärt, wie ein mechanischer (prellender) Taster daraufhin abgefragt wird, ob er gedrückt wird, sich also sein Status(State) von "nnicht betätigt" nach "betätigt" ändert.

Hast Du denn die Taster-Grundschaltung im Griff? Es gibt zwei bis drei Möglichkeiten, einen Taster richtig anzuschließen:
1.) Mit einem externen Pulldown-Widerstand
2.)Mit einem externen Pullup-Widerstand
3.)Mit dem aktivierten internen Pullup-Widerstand des Controllers

Beschreibe mal Deine Taster-Anschluß verkabelung mit dem Arduino!
Mit dieser Zeile in der setup()-Funktion : pinMode(power_sw, INPUT);
müßtest Du eigentlich die Anschlußvariante "Mit einem externen Pulldown-Widerstand" haben.
Hast Du?
Oder fehlt in Deiner Taster-Schaltung der externe Pulldown-Widerstand?