Forum: Mikrocontroller und Digitale Elektronik Mit Arduino Board Durchflussmesser auslesen


von Joachim R. (iuvabo)


Lesenswert?

Guten Tag,
ich habe folgendes Problem:
Ich habe einen Durchflussmesser der 4-20mA Signale ausgibt, wenn X Liter 
durchgeflossen sind.
Ich möchte nun dieses Signal mit dem Arduino Board auslesen und 
verarbeiten.

Nach einiger Recherche im Netz habe ich nun vor das Signal (4-20mA) in 
eine Spannung umzuwandeln (0-5V) und diese Spannung über das Board zu 
protokollieren.

Da ich eletrotechnisch eher Laie bin, möchte ich euch nun um Hilfe 
bitten.
Ich habe dieses Tutorial gefunden, mit dem ich theoretisch die Spannung 
auswerten kann:

http://funduino.de/index.php/3-programmieren/nr-8-bewegungsmelder

Nun habe ich noch 3 Fragen:
- Wie kann ich den Strom in Spannung umwandeln?
- Funktioniert die oben verlinkte Messtechnik bei kurzen Impulsen?
- Gibt es ein alternatives/besseres Vorgehen? Ich möchte insgesamt 8 
(oder auch mehr?) Durchflussmesser ansteuern.

Ich bin euch für jede Antwort dankbar.

Viele Grüße
Joachim

von isnah (Gast)


Lesenswert?

Bist du sicher, dass das 4-20mA-Signal dazu gebraucht wird, um 
anzuzeigen, dass die Menge x geflossen ist?
Normalerweise wird dieses Analog-Signal zum Anzeigen des 
Momentan-Durchflusses benutzt.

von Georg (Gast)


Lesenswert?

isnah schrieb:
> Normalerweise wird dieses Analog-Signal zum Anzeigen des
> Momentan-Durchflusses benutzt.

Erstens das und zweitens besteht es auch ziemlich sicher nicht aus 
kurzen Pulsen. Wobei die Frage ist, was genau heisst kurz.

Georg

von Joachim R. (iuvabo)


Lesenswert?

Hallo,
danke für die Antworten.

Also es handelt sich hier um diesen Durchflussmesser:
http://www.ta.co.at/de/produkte/sensoren/volumenstromgeber-vsg.html bzw. 
das hier ist das Datenblatt dazu:
http://www.ta.co.at/de/assets/Downloads/Datenblaetter/14Volumenstromgeber/04VSG1,5-2,5/Manual_VSG1,5_V1.2-3.pdf

Wenn das Signal (ich habe gerade gesehen, dass es nur 10mA sind) dafür 
genutzt wird den Momentandurchfluss zu messen, wie würde ich dann 
vorgehen? Laut Datenblatt ist die Polung egal, die Schaltleistung ist 
mit "max. 10mA, max. 28V DC" angegeben. Heißt das, dass ich den 
Volumenstrommesser mit 28V Gleichstrom versorgen muss und maximal 10 mA 
als "Antwort"/Volumenstrom erhalte?

Danke
Joachim

von Eumel (Gast)


Lesenswert?

Joachim Rothkegel schrieb:
> Wenn das Signal (ich habe gerade gesehen, dass es nur 10mA sind) dafür
> genutzt wird den Momentandurchfluss zu messen, wie würde ich dann
> vorgehen? Laut Datenblatt ist die Polung egal, die Schaltleistung ist
> mit "max. 10mA, max. 28V DC" angegeben. Heißt das, dass ich den
> Volumenstrommesser mit 28V Gleichstrom versorgen muss und maximal 10 mA
> als "Antwort"/Volumenstrom erhalte?
>
> Danke
> Joachim

Nichts von dem. Das Teil gibt einfach pro 0,5 Liter einen Impuls aus. 
Die Spannung darf maximal 28 Volt betragen (du kannst ruhig die 5V von 
deinem Arduino nehmen) und der Strom 10 mA.

von Jürgen S. (jurs)


Lesenswert?

Joachim Rothkegel schrieb:
> mit "max. 10mA, max. 28V DC" angegeben. Heißt das, dass ich den
> Volumenstrommesser mit 28V Gleichstrom versorgen muss und maximal 10 mA
> als "Antwort"/Volumenstrom erhalte?

Ne, das dürfte eher heißen, dass das Ding einen Schaltkontakt hat 
(Schalter offen oder geschlossen), den Du nicht höher als mit 10 mA 
belasten darfst.

Du mußt diesen Schalter mit externer Spannung und Vorwiderstand (PullUp- 
oder PullDown-Widerstand) so beschalten, dass die maximalen Vorgaben 
nicht überschritten werden, wenn dieser interne Schalter geschlossen 
wird.

Eigentlich genau wie jeden x-beliebigen anderen Schalter auch.

In dem Fall, dass die Anschlußleitungen zwischen Board und Sensor kurz 
sind (z.B. <30 cm) dürfte der interne PullUp als Beschaltung ausreichen:

Sensor Ausgang 1 an Arduino GND
Sensor Ausgang 2 an Arduino digitalen Pin, z.B. 3

Und diesen Pin dann mit pinMode INPUT_PULLUP initialisieren:
1
#define IMPULSPIN 3
2
3
void setup()
4
{
5
  pinMode(IMPULSPIN, INPUT_PULLUP);
6
}

Die internenn PullUps der Atmega-Controller liegen bei 20K bis 50K, so 
dass nur extrem geringe Ströme durch Deinen Schalter fließen würden.
I = U/R = 5V/50KOhm = 0,1 mA
Also weit unter den erlaubten 10 mA.
Aber bei langen Anschlußleitungen auch EMV störanfällig.

Falls die Leitung zum Sensor länger als ca. 30 cm ist, nimmst Du besser 
einen externen PullUp-Widerstand von z.B. 4.7 Kiloohm.
I = U/R = 5V/4.7KOhm = ca. 1 mA
Also immer noch deutlich unter der erlaubten Grenze von 10 mA.

Am IMPULSPIN kannst Du dann den Status HIGH und LOW im Wechsel auslesen, 
so wie die Impulse kommen. Und aus dem zeitlichen Abstand der Impulse 
ergibt sich die Durchflussmenge.

von Joachim R. (iuvabo)


Lesenswert?

Super, dankesehr.
Werde ich erst am Wochenende mal testen können. Ihr habt mir sehr 
weitergeholfen.

von Joachim R. (iuvabo)


Lesenswert?

Hallo,
ich habe jetzt folgenden Code:
1
#define IMPULSPIN 3
2
int val = 0;
3
int lastVal = 0;
4
unsigned long time = 0;
5
unsigned long lastTime = 0;
6
void setup()
7
{
8
  Serial.begin(9600);
9
  pinMode(IMPULSPIN, INPUT_PULLUP);
10
  pinMode(6, OUTPUT);
11
}
12
13
14
void loop()
15
{
16
time =  millis();
17
18
digitalWrite(6, LOW);
19
//delay (100);
20
lastVal = digitalRead(IMPULSPIN);  
21
if (val != lastVal){M
22
  Serial.print(time-lastTime);
23
  Serial.println(" Impuls");
24
  lastTime = time;
25
  }
26
lastVal = val;
27
}

Im Prinzip speichere ich dauerhaft den Zustand des Eingangs ab (val und 
lastVal) und gebe bei Veränderung des Zustands die Zeitdifferenz seit 
der letzten Veränderung raus (lastTime und time).

Die Ausgabe scheint jedoch noch nicht richtig zu sein, es kommt manchmal 
zu einer Dauerschleife, so dass die Ausgabe nur noch das anzeigt:
1
12 Impuls
2
12 Impuls
3
11 Impuls
4
11 Impuls
5
11 Impuls
6
12 Impuls
7
12 Impuls
8
11 Impuls
9
12 Impuls
10
11 Impuls
11
11 Impuls
An anderer Stelle habe ich z.B. solche Ausgaben:
1
11 Impuls
2
14722 Impuls
3
0 Impuls
4
0 Impuls
5
0 Impuls
6
1 Impuls
7
0 Impuls
8
0 Impuls
9
8 Impuls
Das kann eigentlich auch nicht sein, weil der pro 0,5l einen Impuls gibt 
und ich nicht in wenigen Millisekunden 4 Liter durchlaufen lassen habe. 
Wo habe ich da den Fehler?

Danke

: Bearbeitet durch User
von Werner M. (Gast)


Lesenswert?

Joachim Rothkegel schrieb:
> Wo habe ich da den Fehler?

Vielleicht ist das ein mechanischer Schalter, der nicht entprellt ist 
und dir beim Schalten nicht nur einen Puls, sondern eine ganze Reihe 
innerhalb von einigen Millisekunden erzeugt.

von Peter (Gast)


Lesenswert?

isnah schrieb:
> Bist du sicher, dass das 4-20mA-Signal dazu gebraucht wird, um
> anzuzeigen, dass die Menge x geflossen ist?
> Normalerweise wird dieses Analog-Signal zum Anzeigen des
> Momentan-Durchflusses benutzt.

Alle Industriesysteme laufen auf 4-20mA ... Spannungen wären viel zu 
störanfällig und über lange Leitungen wäre der Spannungsabfall viel zu 
groß. Darum prägt man lieber einen Strom in abh. des Messwertes ein ... 
Alle Industriesysteme laufen so!

von Jürgen S. (jurs)


Lesenswert?

Joachim Rothkegel schrieb:
> Wo habe ich da den Fehler?

In der Schwachsinns-Loopfunktion.

Deine Variable val bekommt niemals einen neuen Wert zugewiesen, bleibt 
also immer 0, während die Variable lastVal ständig den neuen Zustand des 
Schalters (HIGH, LOW) zugewiesen bekommt.

Dadurch ist die if-Bedingung ständig erfüllt, solange der Schalter HIGH 
liefert und solange tourt Deine serielle Schnittstelle auf 
Höchstdrehzahl mit der Ausgabe angeblich festgestellter Impulse.

Du bist offenbar nicht nur elektrotechnisch ein absoluter Laie, sondern 
softwaretechnisch beim Programmieren genau so.

Hier mal eine Alternative zum Testen als "Anfägercode":
1
#define IMPULSPIN 3
2
#define LED 13
3
4
void setup()
5
{
6
  Serial.begin(9600);
7
  pinMode(IMPULSPIN, INPUT_PULLUP);
8
  pinMode(LED, OUTPUT);
9
  impulsEingabe(); // Nur zur Initialisierung
10
}
11
12
boolean impulsEingabe()
13
{
14
  static byte oldVal;
15
  byte val= digitalRead(IMPULSPIN);
16
  byte result=false;
17
  if (val==LOW && oldVal==HIGH) result=true;
18
  oldVal=val;
19
  return result;
20
}
21
22
23
unsigned long impulsCount;
24
25
void loop()
26
{
27
  if (impulsEingabe())
28
  {
29
    impulsCount++;
30
    digitalWrite(LED,!digitalRead(LED)); // LED ein/aus wechseln
31
    Serial.print(millis()/1000.0);       // Zeit ausgeben
32
    Serial.print("\tImpuls\t");
33
    Serial.println(impulsCount);
34
  }
35
//  delay(4);
36
}

Falls die Kontakte prellen, z.B. weil Du Wasserschwingungen durch Luft 
im Leitungssystem hast, kannst Du ein kleines delay einfügen, so dass 
kurzfristiges Kontaktprellen dadurch ausgefiltert wird. Allerdings 
begrenzt das die maximal mögliche Zählrate.

: Bearbeitet durch User
von Joachim R. (iuvabo)


Lesenswert?

Dankesehr, jap, sehr doofer Fehler mit dem nicht-aktualisieren des alten 
Wertes... Danke, nun klappt alles wie gewünscht.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.