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
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.
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
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
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.
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.
Super, dankesehr. Werde ich erst am Wochenende mal testen können. Ihr habt mir sehr weitergeholfen.
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
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.
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!
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.