Hilfe bei Sketch button_delay

Hallo ich grüße euch.
Könnt ihr mir bei einer Stelle im Sketch erklären wie es funktioniert und warum?

Ab der Funktion " void button_delay(int msec, int btnpin)"

Hier wird doch der Variablentyp integer verwendet. Einmal msec und btnpin. Da keine Werte dahinter stehen, ist der Wert erst mal 0.
Dann wird noch eine Variable int btnstate mit dem Wert 0 versehenen.

Dann wird btnpin ausgelesen und der Wert in btnstate geschrieben.

Die if Abfrage trifft zu, wenn btnstate HIGH entspricht.

Ich versteh aber nicht wie die Werte sich überhaupt ändern sollen und wie das sich mit der Pause button_delay(delayTime,buttonPin); nach jeder Sequenz verhält.

Freu mich über Hilfe.

const int ledPins[] = {2,3,4,5,6,7,8,9,10,11,12,13};
const int buttonPin = A0;

//const int zise_array = 12;
 
// eine für den Zustand des Buttons so wie in Video Nr 2, und eine für die Sequenzen.
int stateButton  = 0;
int sequenceLed = 1;


void setup(){ 
  
   // Hier wird jede einzige Pin des Arrays als Ausgang konfiguriert.
  
                                    // pinMode(2,OUTPUT);
                                    // pinMode(3,OUTPUT);
  for(int i=0; i<13; i++){          // .            
    pinMode(ledPins[i],OUTPUT);     // .
  }                                 // pinMode(12,OUTPUT);
                                    // pinMode(13,OUTPUT);
  
  pinMode(buttonPin, INPUT);        // Der Button-Pin wird hier als Eingang definiert

}                                   
                                 
void loop(){
  
  stateButton = digitalRead(buttonPin);     // der Zustand des Buttons wird gelesen
  
  if(stateButton == LOW) 
  {
      if(sequenceLed == 4)          // Wenn die Sequenz bereits bei 4 ist, dann mach wieder 1
      {
         sequenceLed = 1;
      } else
          {
            sequenceLed++;         // Ansonsten geht es zur nächsten Sequenz
          }
          delay(300);              // Wir brauchen das hier, um sicherzustellen, dass nur eine Taste gedrückt wird
  }                                // Sonst wird die Sequenz sehr schnell inkrementiert und die Schaltung funktioniert nicht
                                   // Wenn du nicht verstehst was wir meinen, entferne diese Verzögerung und versuche es ...
  

  // die verschiedene Blink-Sequenzen werden ausgewählt (geschaltet)
  
  switch (sequenceLed) { 
    case 1: 
      Sequence1();    
      break; 
    case 2: 
      Sequence2();
      break; 
    case 3: 
      Sequence3();   
      break; 
    case 4: 
      Sequence4();
      break; 
      } 
  delay(125); 
  
}

// Begin erste Sequenz

void Sequence1(){
  
  int delayTime = 50;
  
  for (int i=2; i<=13; i++){              
    digitalWrite(i, HIGH);                
    digitalWrite(i-1,LOW);                
    button_delay(delayTime,buttonPin);
    }
    
  for (int i=13; i>=2; i--){              
    digitalWrite(i, LOW);                 
    digitalWrite(i-1,HIGH);
    button_delay(delayTime,buttonPin);
    }
}


// Begin zweite Sequenz

void Sequence2(){
  
  int delayTime = 50;
  int k=11;                            
  
  for(int i=6; i<=13; i++){             
    digitalWrite(i, HIGH);              
    digitalWrite(k-i, HIGH);            
    button_delay(delayTime,buttonPin);
    }
    
  for(int i=13; i>=2; i--){    
    digitalWrite(i, LOW);
    digitalWrite(k-i, LOW);
    button_delay(delayTime,buttonPin);
    }
}

// Begin dritte Sequenz

void Sequence3(){
  
  int delayTime = 50;
  
  for(int i=2; i<=13; i++){
    digitalWrite(i,HIGH);
    button_delay(delayTime,buttonPin);
    }
    
  for(int i=13; i>=2; i--){
    digitalWrite(i,LOW);
    button_delay(delayTime,buttonPin);
    }
}

// Begin vierte Sequenz

void Sequence4(){
  
  int delayTime = 50;                               
  int k=11;
  
  for(int i=2; i<=13; i++){
    digitalWrite(i,HIGH);
    digitalWrite(k-i,LOW);
    }
    
  button_delay(delayTime,buttonPin);
  
  for(int i=2; i<=13; i++){
    digitalWrite(i,LOW);
    digitalWrite(k-i,HIGH);
    }
    
  button_delay(delayTime,buttonPin);
  
}

// die Funktion button_delay der Wartezeit für unsere Sequenzen.

void button_delay(int msec, int btnpin)  
{
  int btnstate = 0;                     
  btnstate = digitalRead(btnpin);
  
  if(btnstate == HIGH)
  {
    delay(msec);
  }  
}
void button_delay(int msec, int btnpin) 
{
  int btnstate = 0;                     
  btnstate = digitalRead(btnpin);
 
  if(btnstate == HIGH)
  {
    delay(msec);
  } 
}

ist die Definition der Funktion, die Du selbst für diesen Sketch definierst. Es werden keine Werte eingefügt (übergeben) und auch nichts berechnet.

Dann button_delay(delayTime,buttonPin);
wird die Funktion im Sketch aufgerufen und die Parameter delayTime mit dem Wert 50 und buttonPin mit dem Wert A0 übergeben und mit diesem Werten in der Funktion gearbeitet/gerechnet.

Grüße Uwe

Vielen Dank für die schnelle Antwort.

Mal grundsätzlich für mein Verständnis und zur Erklärung die Frage.
Um eine der 4 laufenden Sequenzen zu unterbrechen, wird diese Funktion benötigt. Zu der bei Tastendruck dann gesprungen wird?

Also *button_delay(delayTime,buttonPin); * sorgt dafür, das zu void button_delay(int msec, int btnpin) gesprungen wird.

void button_delay(int msec , int btnpin)
msec bekommt den Wert 50 von oben?
btnpin den Wert A0

Also wird hier dann A0 ausgelesen ob HIGH oder LOW anliegt.
btnstate = digitalRead(btnpin);

Liegt HIGH an wird 50 ms Pause ausgeführt und der loop beginnt am Anfang.
if(btnstate == HIGH)

So in etwa?

Commodore-64:
Liegt HIGH an wird 50 ms Pause ausgeführt und der loop beginnt am Anfang.

Der loop beginnt danach nicht am Anfang, sondern macht an der Stelle nach dem Aufruf weiter.

Gruß Tommy

Ich denke noch zu einfach. Das läuft ja eh alles ständig von oben nach unten durch, nur das die Sequenz nicht geändert wird solange kein weiterer Tassendruck registriert wird.

Also button_delay definiert nur die Wartezeit für die Sequenzen so lange die Taste nicht gedrückt und somit auf HIGH steht. Und warum das außerhalb? Damit jederzeit eine Änderung zwischen den Sequenzen möglich ist ohne das die direkte delay Funktion dies beeinträchtigt?

Also wäre die Pause in der Sequenz bspw. jetzt 1 Sekunde lang , würde ja auch kein Tastendruck mehr eingelesen werde können. Geht es darum?

Und wenn jetzt bei Tastendruck AO bei der Abfrage auf LOW gezogen ist, wird keine Pause ausgeführt sondern direkt im neuen Durchlauf die nächste Sequenz gestartet.

Ich hoffe das stimmt langsam. :relaxed:

Commodore-64:
Ich denke noch zu einfach. Das läuft ja eh alles ständig von oben nach unten durch, nur das die Sequenz nicht Und warum das außerhalb?

Damit Du das nicht für jede Sequence alles nochmal schreiben musst.

Gruß Tommy

Wer hat das Programm geschrieben?

Wenn Du es aus dem Internet hast, suche Dir bitte ein besseres, wenn Du es selbst geschrieben hast, sollten wir über ein paar Dinge reden.

Hi.

Ich habe das Programm aus dem Internet. Jedoch nicht weil ich es bräuchte. Ich wollte mir ein Überblick über Funktionen machen. Dann habe ich dieses Video mit entsprechendem Sketch gesehen. Es geht mir allein nur darum die Abläufe zu begreifen.

Du sagst ich sollte mir ein besseres suchen. Also das ich den Sketch im Grunde nicht benötige weißt du ja jetzt. Im Gegenzug wüsste ich aber nicht, was das funktionierende Programm so schlecht macht, um mir ein neues suchen zu müssen.

Bin also an allem interessiert was mein Verständnis erweitert.

Commodore-64:
Bin also an allem interessiert was mein Verständnis erweitert.

Das wollte ich wissen, denn nur dann macht es Sinn, wenn ich was schreibe.

Alle meine Codes ungetestet!

const byte ledPins[] = {2,3,4,5,6,7,8,9,10,11,12,13};

Der Typ byte (0 bis 255) reicht für die Pins und braucht nur ein Byte anstelle zwei für Interger, das spart Speicher.

Ein Feld hat eine feste Anzahl Elemente, die kann ich abzählen oder berechnen lassen. Ich bin faul:

const byte elemente = sizeof(ledPins)/sizeof(ledPins[0]);

Bei einem Feld vom Typ byte ist die Division überflüssig, aber bei anderen Typen notwendig, da sizeof() die Anzahl der Bytes, nicht die der Elemente zurückliefert.

for(byte i=0; i<elemente; i++){
    pinMode(ledPins[i],OUTPUT);
  }

Das Feld ledPins hat 12 Elemente von 0 bis 11, da ist i<13 falsch. Leider gibt es keine Überwachung der Feldelemente zur Laufzeit, da mußt Du selbst drauf achten! Das ist ganz wichtig, denn auf diese Art entstehen "unerklärliche" Programmabstürze. Ich bin wieder faul und nutze j<elemente.

Bei den Sequenzen wird dann das Feld überhaupt nicht mehr genutzt, was keinen Sinn macht.

pinMode(buttonPin, INPUT);        // Der Button-Pin wird hier als Eingang definiert

Das ist richtig, wenn Du einen externen PullUp- oder PullDown-Widerstand nutzt. Ich neige auch diesmal zur Faulheit und verwende gerne den internen PullUp-Widerstand:

pinMode(buttonPin, INPUT_PULLUP);        // Der Button-Pin wird hier als Eingang definiert

Bekommst Du es hin, meinen Tipp auf das gesammte Programm zu übertragen?