Go Down

Topic: Integerwerte trotz float definition (Read 438 times) previous topic - next topic

maeckes

Aug 06, 2013, 06:41 pm Last Edit: Aug 06, 2013, 06:43 pm by maeckes Reason: 1
Hi!

Ich habe ein kleines Problem bei einem Sketch.
Und zwar zähle ich die Impulse per Interrupt.
Bei jeder steigenden Flanke wird eine Variable inkrementiert.
Mit der Funktion Millis wird nach 2 Sekunden geschaut, wie viele Impulse in den 2 Sekunden gezählt wurden, damit wird ein Wert (Durchfluss) berechnet und die Impulse werden auf 0 gesetzt -> für die nächsten 2 Sekunden Messung.

Trotzdem erhalte ich als Ergebnis der Durchflussberechnung keine Kommawerte, sondern abgerundete Werte.

Da der Durchflusssensor 450 Impulse / Liter ausgibt und 2 Sekunden lang die Impulse gezählt werden, ist die Berechnung wie folgt:
Quote
Durchfluss in l/min = (Impulse / 2 Sekunden) * (60 Sekunden / 1Minute) * (1 Liter / 450 Impulse)

kurz:
Code: [Select]
Durchfluss = Impulse * 30 /450

Hier der ganze Programmcode:
Code: [Select]

#include <math.h>              
#include <Wire.h>                
#include <LiquidCrystal_I2C.h>  

LiquidCrystal_I2C lcd(0x27,20,4);  

long int Impuls=0.0;  //Zählt die Anzahl der steigenden Flanken zur Messung der Durchflussmenge
float Durchfluss;     //Variable Durchfluss
long vorherigeMillisekunden = 0;     //Millisekunden
long Intervall = 2000;               //Zeit zwischen Durchflussmessung


void setup()    
{  
   attachInterrupt(0, Impulszaehler, RISING);  
   lcd.init();            
   lcd.backlight();      
   Wire.begin();          
   Serial.begin(9600);  
 
}

void loop(){
   unsigned long derzeitigeMillisekunden = millis();
   
   if(derzeitigeMillisekunden - vorherigeMillisekunden >= Intervall) {   //Wenn der Millisekundenzähler - vorherige Millisekunden > Intervall
       vorherigeMillisekunden = derzeitigeMillisekunden;                 //vorherige Millisekunden = derzeitige Millisekunden setzen
       Durchfluss = Impuls * 30 / 450;          //Anzahl der Impulse in 2 Sekunden * 60 Sekunden / 450Impulse/liter
       Serial.println(Durchfluss);
Serial.println(Impuls);
Serial.println("------");

       Impuls=0;                                                         //Impuls auf 0 setzen
   }
     
     lcd.setCursor(0,2);                 //Cursor auf 0,2
     lcd.print("Durchfluss:");           //"Durchfluss" schreiben
     lcd.setCursor(12,2);                //Cursor auf 12,2
     lcd.print (Durchfluss);             //Durchflussmenge anzeigen in l/min
     lcd.setCursor(15,2);                //Cursor auf 15,2
     lcd.print("l/min");                 //"l/min" hinter Wert schreiben
   
     delay(1000);
 }
 
 

 
void Impulszaehler(){      //Hilfsfunktion Impulszählen bei steigender Flanke
 Impuls++;                //Variable Impuls inkrementieren    
}


Bei der Konfiguration steht im seriellen Fenster:
Quote

0.00
7
------

Eigentlich müsste man bei 7 Impulsen ja die Zahl 0,6666 erhalten und nicht 0.

Wenn ich statt "Impuls" in der Durchflussrechnung die Zahl 100 schreibe, müsste ja auf jeden Fall 6.66 raus kommen.
Angezeigt wird 6:
Quote

6.00
7
------


Woran kann das liegen?

Gruß
Morris

jurs


Durchfluss = Impulse * 30 /450


Wenn Du auf der rechten Seite des Gleichheitszeichens nur im Integer rechnest, dann ist und bleibt das Ergebnis Integer.

Wenn Du eine Gleitkommarechnung möchtest, müßte mindestens eine der Zahlen eine Gleitkommazahl sein, z.B,
Durchfluss = Impulse * 30 /450.0;
oder
Durchfluss = Impulse * 30.0 /450;
oder
Durchfluss = (float)Impulse * 30 /450

Eisebaer

hi,

wenn Du nur mit ganzen zahlen arbeitest, kommen auch nur ganze zahlen raus (seltsam? find ich auch).
dividier mal durch 450,0. oder nimm 30,0.

gruß stefan
nimm abblockkondensatoren!  100nF.  glaub mir, nimm abblockkondensatoren!

Go Up