Mit Arduino runden

Hallo,

gibt es eine Funktion um Zahlen zu runden? In der Sprachreferenz konnte ich nichts finden. Ich habe es mit round() probiert, aber das funktioniert nicht. Es wird ohne Fehlermeldung kompiliert, nimmt sich dabei aber ca. 750 Byte des knappen Speichers.

// Zähler fuer die Impulse
volatile long zaehler = 0;
void setup()
{
// Interrupt mit Pin 2 verbinden
  attachInterrupt(0, zaehlen, CHANGE);
  Serial.begin(9600);
}
void loop()
{
              long rundungstest;
              rundungstest = round(zaehler / 30);
              Serial.println(zaehler);     
              Serial.println(rundungstest);                         
}
void zaehlen()
{
      zaehler++;

}

Wenn nun, als Beispiel, in "zaehler" der Wert 11896 steht, so erhalte ich in "rundungstest" 396. Rechnerisch sind es aber 396,5333. Sollte also aufgerundet werden. Das geschieht aber nie, es wird immer abgerundet.

Gruß Christoph

Schreib mal 30.0 statt 30, dann kriegst du das Ergebnis auch als float. Ansonsten verwirft er die Nachkommastellen schon vorm Runden.

Alternativ ersetze die Zeile "rundungstest = round(zaehler / 30);" durch rundungstest = zaehler/30; if((zaehler % 30) >= 15) rundungstest++; damit kriegst du den gleichen Effekt ohne floating-point-Arithmetik, dadurch bläht sich die Datei weniger auf. Falls du eine Erklärung brauchst, der %-Operator gibt dir den "Rest" einer Ganzzahldivision, ist der mindestens so groß wie der halbe Nenner wird aufgerundet.

Variablen vom Typ long sind ganzzahlige Zahlen ohne Kommastellen. Wenn Du eine Berechnung machst, bei der Nachkommastellen entstehen, werden diese einfach ignoriert. Die einzige Möglichkeit damit Kommastellen berücksichtigt werden sind float-Variablen. Bei denen ist das Problem, daß der Sketch größer wird und daß die Genauigkeit höchstens 6-7 Stelle ist, also ungeeignet diesen Typ als Zähler zu verwenden.

Grüße Uwe

Hallo, danke fuer die Antworten. Wieder was gelernt.

[quote author=Fat D link=topic=107618.msg808157#msg808157 date=1338180213] rundungstest = zaehler/30; if((zaehler % 30) >= 15) rundungstest++; [/quote]

Ich habe das gerade mal getestet und es löst mein Problem.

Gruß Christoph