Durchfluss Sensor auswerten

Hallo,

ich würde gerne mit einem Arduino Uno und dem LCD Schild einen Durchflusssensor auswerten.
Diesen Code habe ich gefunden, die Puls und Herz interessieren mich eigentlich nicht.
Mich interessieren die Liter und Leiter/min.

kann mir da jemand helfen?

LG
Timon

#include "LiquidCrystal.h"
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

// which pin to use for reading the sensor? can use any pin!
#define FLOWSENSORPIN 2

// count how many pulses!
volatile uint16_t pulses = 0;
// track the state of the pulse pin
volatile uint8_t lastflowpinstate;
// you can try to keep time of how long it is between pulses
volatile uint32_t lastflowratetimer = 0;
// and use that to calculate a flow rate
volatile float flowrate;
// Interrupt is called once a millisecond, looks for any pulses from the sensor!
SIGNAL(TIMER0_COMPA_vect) {
  uint8_t x = digitalRead(FLOWSENSORPIN);
  
  if (x == lastflowpinstate) {
    lastflowratetimer++;
    return; // nothing changed!
  }
  
  if (x == HIGH) {
    //low to high transition!
    pulses++;
  }
  lastflowpinstate = x;
  flowrate = 1000.0;
  flowrate /= lastflowratetimer; // in hertz
  lastflowratetimer = 0;
}

void useInterrupt(boolean v) {
  if (v) {
    // Timer0 is already used for millis() - we'll just interrupt somewhere
    // in the middle and call the "Compare A" function above
    OCR0A = 0xAF;
    TIMSK0 |= _BV(OCIE0A);
  } else {
    // do not call the interrupt function COMPA anymore
    TIMSK0 &= ~_BV(OCIE0A);
  }
}

void setup() {
   Serial.begin(9600);
   Serial.print("Flow sensor test!");
   lcd.begin(16, 2);
   
   pinMode(FLOWSENSORPIN, INPUT);
   digitalWrite(FLOWSENSORPIN, HIGH);
   lastflowpinstate = digitalRead(FLOWSENSORPIN);
   useInterrupt(true);
}

void loop() // run over and over again
{
  lcd.setCursor(0, 0);
  lcd.print("Pulses:"); lcd.print(pulses, DEC);
  lcd.print(" Hz:");
  lcd.print(flowrate);
  //lcd.print(flowrate);
  Serial.print("Freq: "); Serial.println(flowrate);
  Serial.print("Pulses: "); Serial.println(pulses, DEC);
  
  // if a plastic sensor use the following calculation
  // Sensor Frequency (Hz) = 7.5 * Q (Liters/min)
  // Liters = Q * time elapsed (seconds) / 60 (seconds/minute)
  // Liters = (Frequency (Pulses/second) / 7.5) * time elapsed (seconds) / 60
  // Liters = Pulses / (7.5 * 60)
  float liters = pulses;
  liters /= 7.5;
  liters /= 60.0;

/*
// if a brass sensor use the following calculation
float liters = pulses;
liters /= 8.1;
liters -= 6;
liters /= 60.0;
*/
  Serial.print(liters); Serial.println(" Liters");
  lcd.setCursor(0, 1);
  lcd.print(liters); lcd.print(" Liters ");
 
  delay(100);
}

Die Liter pro minute werden ja am Ende des Sketches angezeigt.

 // if a plastic sensor use the following calculation
  // Sensor Frequency (Hz) = 7.5 * Q (Liters/min)
  // Liters = Q * time elapsed (seconds) / 60 (seconds/minute)
  // Liters = (Frequency (Pulses/second) / 7.5) * time elapsed (seconds) / 60
  // Liters = Pulses / (7.5 * 60)
  float liters = pulses;
  liters /= 7.5;
  liters /= 60.0;

Welchen Sensor hast Du?
Grüße Uwe

Hab diesen hier:

er zeit mir in der zweiten Spalte die Literzahl, auch weiß ich nicht wo ich die Impullszahl eingebe.
er arbeitet ja mit 2500Impulsen Pro Liter oder 10000Impulse pro Liter wenn ich die kleine Düse einsetze.

kann mir keiner Helfen?

Nochmal kurz zum Einstieg: Du willst also wissen, wieviele Liter seit "Reset" durchgeflossen sind und die Menge pro Minute, korrekt?
Und reicht Dir die Anzeige der Minutenmenge (also Update jede Minute mit dem in der letzten Minute durchgelaufenen Menge) oder willst Du permanente Anzeige der aktuellen Menge?

Ich verwende ebenfalls einen Durchflusssensor mit Impulsausgabe.
Ich werte die Impulse pro Zeit aus und verwende die Funktion millis() dazu.

Das bedeutet, dass ich mir dann den Durchfluss in einem Intervall (z.B. eine Sekunde) berechne und den dann ausgebe.

Wo hakt es denn genau?
Habe meinen Code selber geschrieben, der scheint mir deutlich einfacher zu sein, wie der von Dir gezeigte.

Guten Abend,

Genau ich hätte gern den Wert ab reset was an Liter durch ist und den Aktuellen verbrauch also was momentan durch läuft.

@maeckes
würdest du mir deinen Code bereitstellen?

LG
Timon

Klar! Suche ich raus, kriegst ne PN

EDIT:
Ist vielleicht alles nicht ganz sauber - mache das nur hobbymäßig. Mir ist es eher wichtig, dass es nachvollziehbar ist und vor allem läuft :stuck_out_tongue:

//Globale Variablen
long int impuls=0.0;  //zählt die anzahl der steigenden flanken zur messung der durchflussmenge
float durchfluss;     //variable durchfluss
long vorherigemillisekunden = 0;     //millisekunden - hilfsvariable zur berechnung vom volumenstrom
long intervall = 2000;               //zeit in millisekunden zwischen berechnung des volumenstroms


void setup()     
{  
    attachInterrupt(0, Impulszaehler, RISING);  //wenn an interrupt 0 (i/0 eingang 2) steigende flanke, dann hilfsfunktion "impulszaehler" ausführen
}


void Impulszaehler(){      //hilfsfunktion impulszählen bei steigender flanke
  impuls++;                //variable impuls inkrementieren    
}

float Volumenstrom(){
  unsigned long derzeitigemillisekunden = millis();
  if(derzeitigemillisekunden - vorherigemillisekunden >= intervall) {    //wenn der millisekundenzähler - vorherige millisekunden > intervall
    vorherigemillisekunden = derzeitigemillisekunden;                    //vorherige millisekunden = derzeitige millisekunden setzen
    durchfluss = (impuls*(20/9)*30.0)/1000.0;                            //durchfluss = impuls(zeit)*ml(1 impuls)*(zeit)/ml(liter)
    impuls=0;                                                            //impuls auf 0 setzen
    return durchfluss;                                                   //ausgabewert der funktion
    } 
}

"main" ist jetzt nicht dabei. Aber das ist ja quasi selbsterklärend.
Ich habe das jetzt aus einem sehr umfangreichem Programm extrahiert.

Für den gesamten Volumenstrom kannst Du in der Funktion "Impulszähler" ja einfach noch eine zweite Variable inkrementieren, die Du nie auf 0 setzt, aber mit der Formel vom Durchfluss auch in den gesamten Volumenstrom umrechnest. Wichtig ist dann aber auch, dass Du die gesamte Laufzeit des Arduinos in der Formel verwendest!

Sollten Fragen offen sein, einfach melden.

Gruß
Morris

Hallo Timon,
werde mir auch einen Durchfluss Messer erstellen.
Möchte einen Sensor benutzen mit 2500 i/L
Das ganze mit Seriales Display 1,8"

Hast D umit den 2500 i/L Sensor schon was Programiert ?
Und auch ein wenig Erfahrung ?
Bei einem durchfluss von 3 bis 28 L/H .......... stimmen die Impulse von 2500 oder ändert sich das ein wenig je nach Durchflussmenge ?

Würdest Du dein Code einstellen ?

Danke für Infos
Ratlos

Hallo Meackes

 durchfluss = (impuls*(20/9)*30.0)/1000.0;                            //durchfluss = impuls(zeit)*ml(1 impuls)*(zeit)/ml(liter)

Wenn mein Sensor 2500 i/L macht und mein Verbrauch so um die 13 L/h ist
Und ich L/h haben möchte

müste doch der Code so sein

durchfluss = (impuls*(20/9)*0.4);

oder ????

Mein Sensor
Biotech FCH-midi-POM Artikel Nr. 97478692
D=3mm Düse drin dann 2500 i/L

danke für Infos

Ratlos