Pages: [1]   Go Down
Author Topic: Integerwerte trotz float definition  (Read 390 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 1
Posts: 135
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
Durchfluss = Impulse * 30 /450

Hier der ganze Programmcode:
Code:
#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
« Last Edit: August 06, 2013, 11:43:40 am by maeckes » Logged

Germany S-H
Offline Offline
Faraday Member
**
Karma: 146
Posts: 3039
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Wien
Offline Offline
Edison Member
*
Karma: 28
Posts: 1894
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Pages: [1]   Go Up
Jump to: