Division ergibt falsches ergebnis

Hallo,
ich bin dabei eine Timelapse-Steuerung für meine Kamera zu programmieren. Dabei wird im Arduino ausgerechnet in was für einem Abstand die Bilder gemacht werden sollen. Zuvor muss man allerdings einstellen in was für einem Zeitraum die Bilder gemacht werden sollen und wie viele. Nun habe ich das Problem das er mir bei der Rechnung ein falsches Ergebnis ausgibt.
Ich benutze für ein LCD Menü die LCDMenuLib von Jomelo.

/*Start*/
void FUNC_start(void)
{
  if(!LCDML.FuncInit())
  {
    ticker = 0;
    delays = zeit / bildanzahl;
    Serial.println(zeit);
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print(F("Bild:"));
    lcd.setCursor(0,1);
    lcd.print(ticker);
    lcd.setCursor(0,2);
    lcd.print(F("Von:"));
    lcd.setCursor(0,3);
    lcd.print(bildanzahl);
    
    
   if (kamera == 1) {
    while (ticker < bildanzahl){
        delay(delays);
        D5000.shutterNow();
        ticker = ticker + 1;
        lcd.setCursor(0,1);
        lcd.print(ticker);
    }
         lcd.clear();
         lcd.setCursor(0,1);
         lcd.print(F("       Fertig!      "));
         delay(1000);
         LCDML.Button_quit();
     }
       
   else if (kamera == 2) {
    while (ticker < bildanzahl){
        delay(delays);
        D5.shutterNow();
        ticker = ticker + 1;
        lcd.setCursor(0,1);
        lcd.print(ticker);
    }
         lcd.clear();
         lcd.setCursor(0,1);
         lcd.print(F("       Fertig!      "));
         delay(1000);
         LCDML.Button_quit();
     }
     
   else if (kamera == 0) {
         lcd.clear();
         lcd.setCursor(0,1);
         lcd.print(F("Fehler!"));
   }
}
}

Kann mir jemand erzählen was ich falsch mache?

Gruß Sascha

sascha_hemi:
delays = zeit / bildanzahl;
...
Kann mir jemand erzählen was ich falsch mache?

Deklaration der Variablen "delays" ==> nicht angegeben
Deklaration und Inhalt der Variablen "zeit" ==> nicht angegeben
Deklaration und Inhalt der Variablen "bildanzahl" ==> nicht angegeben

Dein Problem wird wohl irgendwas mit dem zu tun haben, was Du bei Deiner Frage nicht angegeben hast.

Oh tut mir leid... :confused: Ich habe es angegeben allerdings ganz oben in der Datei :smiley: ich wollte jetzt nicht unbedingt die ganze datei dort rein kopieren... Weil das sind ein Paar zeilen :smiley:

//Variablen
int kamera = 1;
int bildanzahl = 0;
int zeit = 0;
int ticker = 0;
int delays = 0;

Die Variablen die = 0 sind werden entweder vom User eingestellt oder eben automatisch ausgerechnet...
Ich hoffe ihr könnt mir da weiter helfen :confused:

Kamera.rar (3.45 KB)

Die Formel ist alles andere als gut! Hier kann eine Division /0 erfolgen.

delays = zeit / bildanzahl;

Ich weiß jetzt nicht genau, mit was für Zeiten du Arbeiten möchtest. Aber grundsätzlich würde ich delays vermeiden und auf millis() (Tutorial: BlinkWithoutDelay) zurückgreifen.

delay, zeit und bildanzahl sind nicht als float zahlen deklariert.
Bei der Division von Zahlen wird automatisch abgerundet (1/2 = 0). Das kannst du unteranderem dadurch verhinden, dass du mit float arbeitest (hier nicht empfohlen), oder mit einem Faktor arbeitest, oder aber rechts vom = mit +0.5 nimmst.

Sorry das ich frage... Das ist mein erstes richtiges Arduino Projekt aber was meinst du mit Division /0? :open_mouth:

Wenn Bildanzahl 0 ist, teilst du durch 0. Das ist entweder undefiniertes Verhalten oder +Unendlich

Ein Integer kann keine Kommazahlen kann das sein? :smiley:
Ja das mit dem 0 Wert da muss ich auch noch was zu Schreiben im Programm...

Division /0 meine ich folgendes Problem

delays = zeit / bildanzahl.

Der Wert für Bildanzahl kann! 0 sein, wenn er oben nicht geändert wird. Was ist delays = 1000 / 0? Nicht 0!

if(bildanzahl <= 0) return;
else delays = 1000 * zeit / bildanzahl;

So dürften die Ergebnisse deutlich genauer für dich seinen. Optimalerweise arbeitest du nun nicht mehr mit millis() oder delay(),
sonder mit micros() oder delayMicroseconds()

sascha_hemi:
int bildanzahl = 0;
int zeit = 0;

Abgesehen vom Problem "Division durch 0" bei bildanzahl=0, was mathematisch nicht definiert ist, hast Du also 16-Bit Integer-Variablen.

Wertebereich int: ?32.768 bis +32.767
Keine Zahl darf bei so definierten Variablen größer oder kleiner sein.
Ist das erfüllt?

Wenn ja, dann wäre noch zu beachten, dass Du eine Integer-Ganzzahl-Division machst, also Divisionsreste unter den Tisch fallen.

Beispiel:
int zeit = 500;
int bildanzahl = 23;
500/23 = 21

sascha_hemi:
Ein Integer kann keine Kommazahlen kann das sein? :smiley:
Ja das mit dem 0 Wert da muss ich auch noch was zu Schreiben im Programm...

Ein Integerwert ist eine Ganzzahl genauso wie Byte, Char, long ...
Wenn nicht umbedingt notwendig, sollte man auf floats verzichten, da diese vom µC deutlich schwerer zuberechnen sind.

Ich habs... Wie Jurs schon meinte...

Wertebereich int: ?32.768 bis +32.767
Keine Zahl darf bei so definierten Variablen größer oder kleiner sein.
Ist das erfüllt?

Ist nicht erfüllt... Der Größte wert ist sogar 3600000... :smiley: ich bin dumm!

Verwende unsigned long wenn du keine negativen Zahlen brauchst

Jurs seine Kristallkugel scheint ja doch ein bisschen zu funktionieren :stuck_out_tongue_closed_eyes:
Meine hat komplett gestreikt.

Wie kommst du auf die theoretischen Werte von 360.000?

http://www2.informatik.uni-halle.de/lehre/c/c622.html
int enspricht 16bit und ist dem short gleichgesetzt auf der Seite.

3600000 Milisekunden sind 60 Minuten... Jemand eine Lösung wie ich das ändern kann? :confused: ich habe bisher nur in einem anderen forum folgendes gefunden: zeit * 60 * 1000 / bildanzahl bzw. delay(10 * 60 * 1000);

sascha_hemi:
3600000 Milisekunden sind 60 Minuten... Jemand eine Lösung wie ich das ändern kann?

Steht doch in Reply #11: Du mußt "unsigned long" statt "int" als Datentyp verwenden!

Ja das war mir schon klar allerdings hatte ich wieder einen Fehler gemacht im Code deswegen dachte ich das geht doch nicht... Sorry mein Fehler... Jetzt läufts so wie ich will :slight_smile: Danke liebes Arduino.cc Forum :*