Schleife für Array zeitgesteuert auslesen…

Schleife für Array zeitgesteuert auslesen…
Hallo,
ich habe hier so mein Problem oder verstehe etwas nicht richtig.
Es geht um DTFM, genauer um die Ausgabe der Töne.
Was passieren soll:
Ich betätige einen Kontakt, es wird 500ms gewartet bis die erste Adresse[0]
des Array ausgelesen wird.
Das wird nur einmal durchlaufen.

Dann wird die erste Adresse[0] ausgelesen und steht (LED/Ton an) 70ms
Dann gibt es eine Pause von 35ms
Dann wird die zweite Adresse[1] ausgelesen und steht (LED/Ton an) 70ms
Dann gibt es eine Pause von 35ms
u.s.w

Hier geht es drum:

while (millis() - Zeitstempel < FreiZ); // die ersten 500ms
  {
 for (int gwZifferZlAs = 0; gwZifferZlAs < gwZifferZl; gwZifferZlAs++)

Serial.print (gwZifferA[gwZifferZlAs]);

// als Beispiel
// LED an: Ton hörbar/wird übertragen, länge 70ms
// LED aus: Pause zwischen den Tönen, länge 35ms
}

Hier wird "while" genutzt, es wird also gewartet, "while" habe ich genutzt, weil
ich "delay()" hasse.
Aber warum hier "while"? Der Arduino kann doch im Hintergrund nichts machen.
Ist das hier richtig? Dann kann ich doch auch gleich delay() nehmen.

Das muß doch auch mit einem Intervall-Timer funktionieren der im Hintergrund
läuft?
Ich muss doch nicht für jede Zeit/Adresse "while" setzen und warten?
Gruß und Dank
Andreas

So sieht es jetzt aus, nur mit 500ms Wartezeit

int gwZiffer; // gewählte Ziffer
int gwZifferZl; // das ist der Zähler für die Ziefern, 1. Ziffer, 2. Ziffer, u.s.w.
int gwZifferZlAs; // das ist der Zähler für die Array-Adressen, Ausgabe
int gwZifferA[21]={gwZiffer}; // das Array für 20 Ziffern oder weniger


unsigned long Zeitstempel = 0;
long FreiZ = 500; // länge Freizeichen in ms
long Ton = 70; // Länge Ton in ms
long Pause = 35; // Länge Pause zwischen den Tönen in ms




valZS1 = digitalRead(S1);             
if (valZS1 != buttonStateS1) 
{                                     
if (valZS1 == HIGH) // wenn gedrückt läuft der bis zum Ende durch
{                                      
buttonPressesS1++;                          
}
} 
buttonStateS1 = valZS1;
if (buttonPressesS1 == 1)
{
 Zeitstempel = millis();   
  
 while (millis() - Zeitstempel < FreiZ); // hier wird der gedrückte Taster aufgehalten
  {
 
 for (int gwZifferZlAs = 0; gwZifferZlAs < gwZifferZl; gwZifferZlAs++)


  Serial.print (gwZifferA[gwZifferZlAs]);
}
 
  

}

 if (buttonPressesS1 > 0)
{
buttonPressesS1 = 0; // Taster fertig gedrückt
}

Hallo,
da wollte wohl keiner ran- na, egal. Ich habe es jetzt selbst hinbekommen.
Hier nur der Vollstängikeit halber…

Hier noch einmal die "Array-Schleife" die ich zeitlich gesteuert ablaufen lasse…

for (int gwZifferZlAs = 0; gwZifferZlAs < gwZifferZl; gwZifferZlAs++)

const unsigned int ZeitTonLED = 70;
const unsigned int ZeitPauseLED = 35;

int FreiZeichen = 500;
int Waehlen = 0;

unsigned long StartMillis=0;
int Zeitstempel = ZeitTonLED;
boolean TonLEDStatus = true;
boolean PauseLEDStatus = false;



if (Waehlen == 1) // Taster setzt Waehlen auf 1
{
  digitalWrite(9, TonLEDStatus);
  unsigned long LfdMillis = millis();
 
  if ((unsigned long)(LfdMillis - StartMillis) >= Zeitstempel) 
  {
      
    if (TonLEDStatus) 
    {
      
    Serial.println ("Pause"); 
     
      Zeitstempel = ZeitPauseLED;
     if (gwZifferZlAs == gwZifferZl)
      {
        Waehlen = 0;
        gwZifferZlAs = 0;
       digitalWrite(9, LOW);
      }   
    } 
    else 
    {
      Serial.print ("gewaehlte Ziffer - ");
        Serial.println (gwZifferA[gwZifferZlAs]);
      gwZifferZlAs++;
     
      Zeitstempel = ZeitTonLED;
    }   
    TonLEDStatus = !(TonLEDStatus);
   
    StartMillis = LfdMillis;
  }

Gruß und Spaß
Andreas

Ich verstehe zwar immer noch nicht, was Du machen möchtest, aber wenn's funktioniert ist das ja auch nicht mehr notwendig :wink: