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);
}
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.
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?
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
//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!
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 ?