Türkontaktschaltung schneller ausführen (Hilfe)

Hallo Leute,

Ich komme leider bei meinem Code nicht weiter. Er funktioniert so weit aber leider wird er zu langsam ausgeführt hat jemand eine Idee wie ich die Sache ein bisschen beschleunigen könnte? Zum Code: Ich habe einen Türkontakt, 1 LED und einen Schalter wenn man das ganze System über den Schalter (switch1) einschaltet sollte die LED als funktionsanzeige hoch und runter gedimmt werden und wenn die Tür geöffnet wird soll ein Signal auf pin 6 (signal1) ausgegeben werden. Wenn dann der Türkontakt ausgelöst wurde soll die LED schneller hoch und runter gedimmt werden um alles zu resetten muss man den Schalter aus und wieder ein schalten. Nun ist das Problem das wenn der Türkontakt auf geht (LOW) das dimmen der LED erst zuende geführt wird und dann ein Signal an pin 6 ausgegeben wird ich möchte aber das dass Signal mit der kleinst möglichen verzögerung augeben wird d.h Tür auf = Signal auf pin 6
Danke im Vorraus für eure Hilfe
J4ck

int switch1 = A4;
int switch1value;
int storage = 0;
int tuersensor = A8;
int tuersensorvalue = 0;
int LED = 5;
int signal1 = 6;

void setup() {

  Serial.begin(9600);

  pinMode(switch1, INPUT);
  pinMode(LED, OUTPUT);
  pinMode(signal1, OUTPUT);


}

void loop() {


  switch1value = digitalRead(A4);
  tuersensorvalue = digitalRead(A8);
  

  if (switch1value == HIGH)
  {
    for (int i = 0; i < 255; i++) { 
      analogWrite(LED, i); 
      delay(4); 
    }
    for (int i = 255; i > 0; i--) { 
      analogWrite(LED, i);
      delay(4);
    }
    if (storage == 0)
    {
      if (tuersensorvalue == LOW)
      {
        digitalWrite(signal1, HIGH);
        delay(100);
        digitalWrite(signal1, LOW);
        storage = 1;
      }
    }
    else
    {
      for (int i = 0; i < 255; i++) 
      { 
        analogWrite(LED, i); 
        delay(1); 
      }
      for (int i = 255; i > 0; i--) 
      { 
        analogWrite(LED, i);
        delay(1);
      }
    }
    if (signal1 == HIGH)
    {
      digitalWrite(LED, HIGH);
      
    }
  }
  else
  {
    digitalWrite(signal1, LOW);
    digitalWrite(LED, LOW);
    storage = 0;
  }
  

}

Mehrere Schleifen mit delay drin sind Dein Problem. 2 mal 255 * 4 ms = > 1 Sekunde.

Schau Dir mal BlinkWitoutDelay und die Nachtwächtererklärung an.

Gruß Tommy

Super! Hat funktioniert danke für die schnelle und kompetente Hilfe. :)

Anbei nochmal der Code falls irgendwer bei der integration Probleme hat.

int switch1 = A4;
int switch1value;
int storage = 0;
int tuersensor = A8;
int tuersensorvalue = 0;
int LED = 5;
int signal1 = 6;
unsigned long LED_timestore;  
int LedStatus = LOW;
int LedPin = 5;

void setup() {

  Serial.begin(9600);

  pinMode(switch1, INPUT);
  pinMode(LED, OUTPUT);
  pinMode(signal1, OUTPUT);


}

void loop() {


  switch1value = digitalRead(A4);
  tuersensorvalue = digitalRead(A8);


  if (switch1value == HIGH)
  {
    if (LedStatus == LOW) {
      if (millis() - LED_timestore > 1000 ) {
        digitalWrite(LedPin, HIGH);
        LED_timestore = millis();
        LedStatus = HIGH;
      }
    } else {
      if (millis() - LED_timestore > 300) {
        digitalWrite(LedPin, LOW);
        LedStatus = LOW;
      }
    }
    if (storage == 0)
    {
      if (tuersensorvalue == LOW)
      {
        digitalWrite(signal1, HIGH);
        storage = 1;
      }
    }
    else
    {
      if (LedStatus == LOW) {
        if (millis() - LED_timestore > 500 ) {
          digitalWrite(LedPin, HIGH);
          LED_timestore = millis();
          LedStatus = HIGH;
        }
      } else {
        if (millis() - LED_timestore > 300) {
          digitalWrite(LedPin, LOW);
          LedStatus = LOW;
        }
      }
    }
    if (signal1 == HIGH)
    {
      digitalWrite(LED, HIGH);

    }
  }
  else
  {
    digitalWrite(signal1, LOW);
    digitalWrite(LED, LOW);
    storage = 0;
  }


}

Du solltest Deinen Code nochmal überdenken. Es ist nicht richtig, LED_timestore für mehrere Aufgaben zu benutzen (Schalter entprellen, LED blinken lassen...), da muß jede Zeit in einer eigenen Variablen gespeichert werden. So ist er keine brauchbare Integrationshilfe :-(

Auch sonst entspricht Dein Code nicht Deiner Aufgabenstellung, und könnte mit etwas Übung auf die Hälfte gekürzt werden (mindestens). Das ist zwar nicht unbedingt notwendig, erhöht aber die Lesbarkeit und vereinfacht das Finden der enthaltenen Fehler.

Hi

Auch ist dort kein Hoch-/Runterdimmen mehr drin enthalten. Der Ansatz passt aber. Selber würde ich eine Variabel 'status' hochzählen, je nachdem, in welchem Programm-Abschnitt wir uns befinden. Weiter kannst Du die Dimmgeschwindigkeit vom aktuellen Status abhängig machen, indem die Endzeit, bevor weiter gedimmt wird, kürzer/länger gesetzt wird.

Dann noch die Frage: Ist ein Endprellen des Taster überhaupt nötig? Sobald ich das erste Taster-Signal bekomme ist klar, daß die Tür AUF ist (bzw. nicht mehr ganz zu). Auch das Prellen beim Schließen der Tür stört nicht, da ich die ganze Maschine ja erst zurück setze, wenn die Tür sicher verschlossen ist - verstand ich zumindest so. Und da ein prellender Taster viel schneller ist, als ein Tür schließender Mensch, würde ich dort auf eine Endprell-Routiene verzichten.

MfG