attachInterrup bei interaktivem Programm mit delays

Moin,

ich komme gerade nicht weiter, da ich nicht weiß wie ich interaktive Porgramme mit delay(); unterbrechen muss. Mir wurde die Funktion attachInterrupt empfohlen, nur weiß ich nicht wie und wo ich diese in meine Funktion einbinden kann. Meine Programmierkenntnisse sind hierfür nicht ausreichen :~ Die Funktion hängt beim dimmen, da diese mit delays arbeitet. Wo und wie muss ich also die Funktion unterbrechen, damit ich weitere Modi ansteuern kann?

int led1 = 9;
int led2 = 10;

int modiSchalter = 2;
int schalterStatus;
int modus = 0;  

int zustand1;
int zustand2;

int helligkeit = 20;
int dimmstufen = 5;

int schalter(int zustand1)   
{
  zustand1 = digitalRead(modiSchalter);         
  delay(10);                            
  zustand2 = digitalRead(modiSchalter);       
  if (zustand1 == zustand2) {                  
    if (zustand1 != schalterStatus) {         
      if (zustand1 == LOW && modus < 5) {                
        modus++;               
      }
      else  
        if (zustand1 == LOW && modus == 5) {  
        modus = 0;
      }
    }
  }
  schalterStatus = zustand1;                
  return modus;
}


void setup() {   
  pinMode(modiSchalter, INPUT); 
  schalterStatus = digitalRead(modiSchalter);
} 


void loop() { 
  schalter (zustand1);
  switch (modus)
  { 
  case 0: // aus 
    analogWrite(led1, 0);
    analogWrite(led2, 0);
    break;

  case 1: // dimmen
    dimmen(50);
    break;
  case 2: // leuchten
    analogWrite(led1, 255);
    analogWrite(led2, 255);
  }
}

void dimmen(int delayWert){
  for(int i = 0; i<=255; i++){
    analogWrite(led1, i);
    analogWrite(led2,255-i);
    delay(delayWert);
  }
  for(int i = 0; i<=255; i++){
    analogWrite(led1,255- i);
    analogWrite(led2,i);

    delay(delayWert);
  }
}

Gruß und vielen Dank!

Dennis

Solange Du nicht sagst was Dein Program tun soll / wie es reagieren soll wird Dir niemand sagen können wie es geschrieben werden sollte.

Ich dachte das könnte man dem beigefügten Code entnehmen :~. Also hier nochmal als Beschreibung;

Es werden zwei LED's angesteuert. Ein Taster regelt den Modus (aus, an, dimmen, blinken, etc...). Über switch/case werden, je nach Tasterbetätigung, die verschiedenen Modis durchgeschaltet. Sobald aber ein delay auftritt, dass größer als etwa eine Sekunde ist, lässt sich der Modus nicht oder nur schwer umschalten (man muss in dem Fall genau den Moment erwischen, wo die Funktion von vorne anfängt). Jetzt soll diese Interrupt-Funktion verhindern, dass das Programm, an der Stelle wo das delay eintritt, nicht mehr auf Modusänderungen über den Taster reagiert.

Meine Frage ist nun wie ich das anstelle und wo das vor allem hingehört.

Gruß
Dennis

Aus dem Programm kann man entnehmen was Du geschrieben hast nicht was Du schreiben wolltest. :wink: :wink:

Da mußt Du das ganze Programm umstrukturieren. Ein Interrupt unterbricht das Hauptprogramm und dieses setzt nach der abarbeitung der interruptfunktion an der unterbrochenen stelle weiter. Also wenn Du 1 Sekunde delay hast dann kannst Du mit dem Interrupt den Modus ändern aber die Änderung tritt erst nach Abarbeitung des Hauptprogramms, wo Du den Modus kontrollierst in Kraft.
Ich rate Dir millis() zu nehmen siehe blink without delay welches als beispiel im IDE zu finden ist.
So kannst Du in den Wartezeiten die Taster abfragen und auch einen Programmteil vorzeitig beenden.

Grüße Uwe

uwefed:
Aus dem Programm kann man entnehmen was Du geschrieben hast nicht was Du schreiben wolltest. :wink: :wink:

Da mußt Du das ganze Programm umstrukturieren. Ein Interrupt unterbricht das Hauptprogramm und dieses setzt nach der abarbeitung der interruptfunktion an der unterbrochenen stelle weiter. Also wenn Du 1 Sekunde delay hast dann kannst Du mit dem Interrupt den Modus ändern aber die Änderung tritt erst nach Abarbeitung des Hauptprogramms, wo Du den Modus kontrollierst in Kraft.
Ich rate Dir millis() zu nehmen siehe blink without delay welches als beispiel im IDE zu finden ist.
So kannst Du in den Wartezeiten die Taster abfragen und auch einen Programmteil vorzeitig beenden.

Grüße Uwe

Vielen Dank für deine Antwort! Soweit ich das jetzt verstanden habe kann ich mit millis das delay umegehen. Aber funktioniert das auch in einer Schleife?

Gruß
Dennis

Grüße Uwe