Zeitverlust

Hallo Leute, ich hab mal ne Frage

also ich setze die Variable "tauchen=100"
dann folgt dieser Abschnitt

              while (tauchen>0){                
                digitalWrite(relaisPin, HIGH);
                tasterstatus=digitalRead(taster);
                      if(tasterstatus == HIGH){
                        lcd.clear();
                        lcd.setCursor(0,0);
                        lcd.print ("Pause");
                        digitalWrite(relaisPin, LOW);
                        q=1;
                        delay (5000);
                        while (q==1){
                           tasterstatus=digitalRead(taster);
                            lcd.setCursor(0,1);
                            lcd.print ("weiter mit Taste");
                            if(tasterstatus== HIGH){
                            q=0;
                            delay (1000);                          
                           }                         
                        }                           
                      }                                     
              digitalWrite(relaisPin, HIGH);
              lcd.clear();
              float h = dht.readHumidity();     //Luftfeuchte auslesen
              float t = dht.readTemperature();  //Temperatur auslesen
              lcd.setCursor(0,0);
              lcd.print ("Temp.");
              lcd.setCursor(7,0);
              lcd.print (t);
              lcd.setCursor(0,1);
              lcd.print ("Luftfeuchte");
              lcd.setCursor(12,1);
              lcd.print (h);
              delay (2000);
              tasterstatus=digitalRead(taster);
                      if(tasterstatus == HIGH){
                        lcd.clear();
                        lcd.setCursor(0,0);
                        lcd.print ("Pause");
                        digitalWrite(relaisPin, LOW);
                        q=1;
                        delay (5000);
                        while (q==1){
                            tasterstatus=digitalRead(taster);
                            lcd.setCursor(0,1);
                            lcd.print ("weiter mit Taste");
                           if(tasterstatus== HIGH){
                            q=0;
                            delay(1000);                          
                           }                         
                        }                                                   
                      }
              digitalWrite(relaisPin, HIGH);              
              lcd.clear();
              lcd.setCursor(0,0);
              lcd.print ("Noch Pruefungen");
              lcd.setCursor(0,1);
              lcd.print(number);
              delay (2000);
              tasterstatus=digitalRead(taster);
                      if(tasterstatus == HIGH){
                        lcd.clear();
                        lcd.setCursor(0,0);
                        lcd.print ("Pause");
                        digitalWrite(relaisPin, LOW);
                        q=1;
                        delay (5000);
                        while (q==1){
                           tasterstatus=digitalRead(taster);
                            lcd.setCursor(0,1);
                            lcd.print ("weiter mit Taste");
                           if(tasterstatus== HIGH){
                            q=0;
                            delay(1000);                          
                           }                         
                        }                           
                      }
              digitalWrite(relaisPin, HIGH);                      
              lcd.clear();
              lcd.setCursor(0,0);
              lcd.print ("Fertige Pruefungen");
              lcd.setCursor(0,1);
              lcd.print(fertig);
              delay (2000);
              tauchen--;
            }

jetzt brauch er doch wegen den 3*delay von 2 sek, 6 Sekunden zum durchlaufen der schleife.
mit 100 Durchläufen, entspricht dies einer einer Zeit von 600 Sekunden also 10 min.
Aber beim ausprobieren benötigt er 10 min und 32 Sekunden
wodran liegt das?

  1. Ungenauigkeit von dalay(), (kann's aber nicht beziffern);
  2. Ungenauigkeit Takt des Atmega (Resonator mit 0,5% Genauigkeit, bei 10 min sind das 3 sek)
  3. Zeit für die Abarbeitung des restlichen Sketches (kann ich auch so auf 2 Füßen beziffern)

Grüße Uwe

Der Prozessor benötigt zum Ausführen von jedem Befehl einen oder mehrere Prozessortakte.
Das summiert sich eben.

Nach Möglichkeit sollte man auf delay() verzichten.
Wenn die Zeiten genau sein sollen, muß man sogar darauf verzichten!

Schönes Beispiel wie man sowas macht, ist BlinkWithoutDelay aus den Beispielen die bei der
Arduino Entwicklungsumgebung mitgeliefert werden.

Gruß, Jürgen

Muck93:
... wodran liegt das?

Daran, dass die „Uhren“ der Arduinos nicht gerade genau gehen. Sogar zwei Geräte, die aus der selben Fertigungsstraße plumpsen und mit den selben Komponenten gebaut sind, „gehen“ unterschiedlich.

Wie sehr das der Fall ist, habe ich mal vor ein paar Monaten gemerkt, als ich ein paar zusammen bestellte Nanos „just for fun“ zusammen blinken ließ. Es dauerte keine zehn Minuten, bis ein deutlicher Unterschied im Blinken sichtbar war. Nunja, das war ein Vierer- oder Fünferpack billiger Fernost-Nanos, die aber offensichtlich vom gleichen Hersteller stammten. Für relative Zeitnahmen (wenn Du nur feststellen möchtest, ob etwas länger dauert oder nicht) sind die ganz in Ordnung, aber wenn es auf absolute Korrektheit beim Timing ankommt, würde ich niemals millis() (oder was es da auch gibt) benutzen.

HTH

Gregor

Und mal ehrlich, "Zeitverlust" ist doch eigentlich der Falsche Begriff.

Du gewinnst doch Zeit, während du wartest, in der du andere, sinnvolle Dinge machen kannst. :wink: :wink: