Forum: Mikrocontroller und Digitale Elektronik Hilfe bei Sensor und Arduino


You were forwarded to this site from EmbDev.net. Back to EmbDev.net
von Matze (Gast)


Lesenswert?

Hallo zusammen,

ich habe ein Problem.
Ich habe diesen Durchflussmesser gekauft, da ich hier den Durchfluss vom 
Heizöl messen möchte.

https://www.conrad.de/de/p/badger-meter-durchflussmessturbine-1005-2f66-56547-163-2f66-betriebsspannung-bereich-5-24-v-dc-messbereich-0-1-2-1618546.html?searchType=SearchRedirect

Hier habe ich aktuell einen Arduino UNO mit folgendem Sketch:


#define Eingang 2                             // Drehzahl-Eingang: Pin2 
/ Interrupt 0

void setup() {
  pinMode(Eingang, INPUT);                    // Eingangspin auf Eingang 
stellen
  //digitalWrite(Eingang, HIGH);              // und Pullup-Widerstand 
einschalten
  Serial.begin(9600);
  attachInterrupt(0, detectMagnet, FALLING);

  Serial.println("Hall-Effekt-Sensor Test");
}


void loop() {

}


// Interrupt-Routine
// Diese Funktion wird immer dann aufgerufen, wenn ein Magnet vom 
Arduino erkannt wird
void detectMagnet() {
  Serial.println("Magnet erkannt");
}

Ist das überhaupt der richtige Weg? Hat jemand erfahrung damit?

Würde mich über Hilfe echt freuen.

Danke im Vorraus

Matze

von Adam P. (adamap)


Angehängte Dateien:

Lesenswert?

Hey Matze,

also ich hab das mal kurz getestet,
komisch find ich nur, dass der Flanken-Interrupt bei jeder Flanke kommt, 
obwohl "FALLING" eingestellt...naja, dann teilt man halt durch 2 ;-)

Laut Datenblatt hat der Sensor PPL = 22000. (Hab es mal damit berechnet)

Genauigkiet vom berechneten Durchfluss, aufgrund des Timers ist +- 4ml.
Wenn es dir ausreicht.

Gruß

Edit:
Ahso, die Zeile
1
pinMode(3, OUTPUT);

kann natürlich gelöscht werden, war nur für den Test mit Ausgabe und 
Oszi-Messung.

Und mir ist noch nen Fehler bei der Ausgabe aufgefallen.
Füge noch ein globales
1
char buf[32]
hinzu und änder den Timer-Interrupt in:#
1
ISR(TIMER1_COMPA_vect)
2
{
3
  uint32_t liter;
4
5
  liter = ((edge_count / 2) * 1000) / PPL;
6
7
  sprintf(buf, "Durchfluss (Liter): %ld.%03ld\n", liter/1000, liter%1000);
8
  Serial.print(buf);
9
  
10
  edge_count = 0;
11
}

Und es fehlt noch eine Verriegelung, bzgl. der edge_count Variable und 
den 2 Interrupts die darauf zugreifen...

Gibt aber bestimmt auch noch andere (elegantere) Lösungen um den 
Durchfluss zu ermitteln.

: Bearbeitet durch User
von Veit D. (devil-elec)


Lesenswert?

Matze schrieb:

> Ist das überhaupt der richtige Weg? Hat jemand Erfahrung damit?

In einer Interrupt Routine, was deine detectMagnet() ist, ruft man keine 
anderen Funktionen auf die selbst Interrupts benötigen. Das funktioniert 
nur zufällig. Setz dort ein bool Flag oder zähl irgendwas o.ä. und werte 
das in der mainloop aus. Sicherlich benötigst du dann noch volatile und 
atomic. Das fehlt zum Bsp. bei Adams Code.

: Bearbeitet durch User
von Wolfgang (Gast)


Lesenswert?

Adam P. schrieb:
> komisch find ich nur, dass der Flanken-Interrupt bei jeder Flanke kommt,
> obwohl "FALLING" eingestellt...naja, dann teilt man halt durch 2 ;-)

Falsch, da sucht man den Fehler und beseitigt ihn.

von Adam P. (adamap)


Lesenswert?

Veit D. schrieb:
> Das fehlt zum Bsp. bei Adams Code.

Darauf habe ich hingewiesen, da mir bewusst war, dass dies noch zur 
Sprache kommt ;-)

Aber das Bsp. sollte ihm vllt. weiterhelfen - für Optimierungen ist da 
noch genug Platz nach oben.

von Adam P. (adamap)


Lesenswert?

Wolfgang schrieb:
> Adam P. schrieb:
>> komisch find ich nur, dass der Flanken-Interrupt bei jeder Flanke kommt,
>> obwohl "FALLING" eingestellt...naja, dann teilt man halt durch 2 ;-)
>
> Falsch, da sucht man den Fehler und beseitigt ihn.

Dann zeig ihn mir bitte.
An der Initialisierung liegt es ja wohl nicht.

von Wolfgang (Gast)


Lesenswert?

Matze schrieb:
> Ich habe diesen Durchflussmesser gekauft, da ich hier den Durchfluss vom
> Heizöl messen möchte.

Bist du sicher, dass der Verbrauch deiner Heizung zwischen 100 und 2500 
ml/min  liegt?

von Adam P. (adamap)


Lesenswert?

Adam P. schrieb:
> Wolfgang schrieb:
>> Adam P. schrieb:
>>> komisch find ich nur, dass der Flanken-Interrupt bei jeder Flanke kommt,
>>> obwohl "FALLING" eingestellt...naja, dann teilt man halt durch 2 ;-)
>>
>> Falsch, da sucht man den Fehler und beseitigt ihn.
>
> Dann zeig ihn mir bitte.
> An der Initialisierung liegt es ja wohl nicht.

OK - Fehler gefunden.
Es liegt nicht am Source, es lag an meinem Frequenzgenerator.
Der hatte ein negativen Offset, was zur Fehlinterpretation vom ATmega 
führte.

Somit muss die Teilung durch 2 entfernt werden.

von Matze (Gast)


Lesenswert?

Hey, erstmal vielen vielen Dank.
Ich bin begeistert, erstaunt und sehr beeindruckt wie viele gleich an 
dem Thema mit dran sind. Ich hatte mit so viel Unterstützung nicht 
gerechnet und freue mich grad sehr.

Ich habe jetzt den Sketch mal ausprobiert, leider ohne Ergebnis.
Bekomme immer Durchfluss (Liter): 0.0 obwohl min. 1,5 Liter schon vorbei 
geflossen sind.

Ich habe wie der Hersteller es geschrieben hat 1kiloohm Widerstand 
zwischen Ground und Signal gepackt, das kann es also nicht sein.
Die 5V vom Arduino und die Masse daneben und auf den Port2 vom Arduino 
habe ich das Signal gelegt.

Was kann es denn noch sein das ich keinen Wert bekomme?

Habt ihr da noch Ideen?

Grüße und vielen Dank, ehrlich!

Matze

von Sebastian W. (wangnick)


Lesenswert?

Matze schrieb:
> Ich habe wie der Hersteller es geschrieben hat 1kiloohm Widerstand
> zwischen Ground und Signal gepackt, das kann es also nicht sein.
> Die 5V vom Arduino und die Masse daneben und auf den Port2 vom Arduino
> habe ich das Signal gelegt.

Häh? Versteh ich nicht. Kannst du das mal zeichnen? Im Datenblatt ist 
ein Pull-UP-Widerstand abgebildet, kein Pull-DOWN.

Ausserdem: Hall-Sensoren prellen heftig, du wirst be jedem "Impuls" 
mehrere Flanken-Interrupts bekommen ... wenn das ein Hall-Sensor ist ...

LG, Sebastian

: Bearbeitet durch User
von Stefan F. (Gast)


Angehängte Dateien:

Lesenswert?

Zatze schrieb:
> Ich habe wie der Hersteller es geschrieben hat 1kiloohm Widerstand
> zwischen Ground und Signal gepackt

Das war falsch, im Datenblatt steht klar drin, dass der 
Arbeitswiderstand zwischen seinem Signalausgang und VCC gehört.

Mache mal eine LED an den Ausgang des Sensors, dann siehst du, ob sich 
da überhaupt etwas tut.
1
       o--------------------+------o +5V Versorgung
2
                            |
3
Sensor o--+---|<|---[===]---+
4
          |
5
          +------------------------o Arduino Input
6
7
       o---------------------------o GND

von Matze (Gast)


Lesenswert?

Boah, echt danke vielmals, das war jetzt absolut dumm von mir, hab das 
echt falsch gelesen und gesteckt. Dummheit von mir auf ganzer Linie.

Zack, jetzt kommen Werte, allerdings nicht sonderlich plausibel grübel

18:14:33.904 -> Durchfluss (Liter): 0.296
18:14:34.886 -> Durchfluss (Liter): 3.236
18:14:35.901 -> Durchfluss (Liter): 0.0
18:14:36.869 -> Durchfluss (Liter): 0.0
18:14:37.889 -> Durchfluss (Liter): 0.0
18:14:38.866 -> Durchfluss (Liter): 0.0
18:14:39.889 -> Durchfluss (Liter): 0.0
18:14:40.904 -> Durchfluss (Liter): 0.0
18:14:41.872 -> Durchfluss (Liter): 0.502
18:14:42.893 -> Durchfluss (Liter): 1.327


So viel geht da im Leben nicht durch :)

Was könnte jetzt der Grund sein?

von Sebastian W. (wangnick)


Lesenswert?

Matze schrieb:
> Was könnte jetzt der Grund sein?

Da steht doch einiges oben schon dazu. Der Rechteck-Impuls ist womöglich 
nicht sauber, und die Software verriegelt den Zugriff auf die gemeinsam 
von Hauptprogramm und Interruptroutine genutzten Variablen nicht.

Der Zähler ist allerdings toll. Mit 22000 Pulsen pro Liter bekommst du 
einen Puls pro 45μl!

Allerdings sind die Werte wirklich SEHR seltsam. Ich meine,
18:14:33.904 -> Durchfluss (Liter): ...
18:14:34.886 -> Durchfluss (Liter): 3.236
3,236 Liter in 0,982 Sekunden ist schon eine Hausnummer. Nach meiner 
Rechnung entsprechen 3,236 Liter bei Durchfluss.ino immerhin 142384 
Impulsen.

Hast du ein Oszilloskop o.Ä. um dir das Signal des Zählers genauer 
anzuschauen?

LG, Sebastian

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Leuchtet die LED denn jetzt gleichmäßig hell, bei gleichmäßigem 
Durchfluss? Oder flackert sie unregelmäßig wie eine Kerze?

> void detectMagnet()
> {
>   Serial.println("Magnet erkannt");
>   edge_count++;
> }

Die Textausgabe muss da jetzt raus, die versaut dir das Timing. Wir 
reden hier immerhin von 22000 Interrupts pro Sekunde bei einer mittleren 
Durchflussmenge.

Ich frage mich gerade, ob das Arduino Framework schlank genug ist, diese 
Funktion so oft pro Sekunde im Kontext der ISR aufzurufen. Es wäre 
vielleicht besser einen Timer zu benutzen, der die Impulse ohne 
Softwareunterstützung zählt, also ganz alleine in Hardware.

Aber wenn du es ganz langsam fließen lässt (0,1 l/min) sollte schon 
etwas Sinnvolles herauskommen. Das wären 2200 Aufrufe pro Sekunde.

von Gerald O. (garry)


Lesenswert?

Sebastian W. schrieb:
> Ausserdem: Hall-Sensoren prellen heftig, du wirst be jedem "Impuls"
> mehrere Flanken-Interrupts bekommen ... wenn das ein Hall-Sensor ist ...
>
> LG, Sebastian

Bist Du Dir sicher dass Du das nicht mit einem Reedkontakt verwechselst?
Ein Readkontakt ist immer ein mechanischer Kontakt der deshalb zum 
prellen neigt. "Den" Hall-Sensor gibt es nicht, da kann noch beliebig 
Elektronik mit verbaut sein die das Signal anwendungsspezifisch 
optimiert so dass schon deshalb so eine pauschale Aussage nicht stimmen 
kann.

Garry

von Stefan F. (Gast)


Lesenswert?

Gerald O. schrieb:
> Bist Du Dir sicher dass Du das nicht mit einem Reedkontakt verwechselst?

Damit könnte der Sensor unmöglich zig tausende Impulse pro Sekunde 
ausgeben.

Mir ist gerade etwas aufgefallen: Es sind aber Impulse pro Minute, nicht 
pro Sekunde. 22000 pulse/min sind 367 pulse/s. Das ist immer noch zu 
schnell für einen Reedkontakt aber sicher nicht zu schnell für den 
Mikrocontroller/Arduino.

von Manfred (Gast)


Lesenswert?

Gerald O. schrieb:
> Bist Du Dir sicher dass Du das nicht mit einem Reedkontakt verwechselst?

Ich habe in den zwei Datenblättern keine eindeutige Aussage zur 
Signalform gesehen. Irgendwo steht openCollector mit max. 20mA, es ist 
ein Flügelradzähler ... da muß mal jemand ein Scope dranhalten.

von Sebastian W. (wangnick)


Angehängte Dateien:

Lesenswert?

Gerald O. schrieb:
> Bist Du Dir sicher dass Du das nicht mit einem Reedkontakt verwechselst?
> Ein Readkontakt ist immer ein mechanischer Kontakt der deshalb zum
> prellen neigt. "Den" Hall-Sensor gibt es nicht, da kann noch beliebig
> Elektronik mit verbaut sein die das Signal anwendungsspezifisch
> optimiert so dass schon deshalb so eine pauschale Aussage nicht stimmen
> kann.

Stimmt, hab ich verwechselt; bei meinen Wasserzähler ist es ein 
Reed-Kontakt.

Stefan ⛄ F. schrieb:
> Mir ist gerade etwas aufgefallen: Es sind aber Impulse pro Minute, nicht
> pro Sekunde. 22000 pulse/min sind 367 pulse/s. Das ist immer noch zu
> schnell für einen Reedkontakt aber sicher nicht zu schnell für den
> Mikrocontroller/Arduino.

PPL scheint für Pulse Pro Liter zu stehen. Anbei ein Ausschnitt aus dem 
englischen Datenblatt, das ein wenig präziser zu sein scheint.

LG, Sebastian

von Rainer V. (a_zip)


Lesenswert?

Sebastian W. schrieb:
> Ausserdem: Hall-Sensoren prellen heftig, du wirst be jedem "Impuls"
> mehrere Flanken-Interrupts bekommen ... wenn das ein Hall-Sensor ist ...

Im Leben nicht! Aber sie können recht oft "getriggert" werden (z.B. 
durch ein richtig schnell laufendes Zahnrad...) Sollte im Datenblatt 
stehen. Sicher hast du da im Programm noch Timingprobleme. Viel Spass 
bei der Suche.
Gruß Rainer

von Sebastian W. (wangnick)


Lesenswert?

Stefan ⛄ F. schrieb:
> Mir ist gerade etwas aufgefallen: Es sind aber Impulse pro Minute, nicht
> pro Sekunde. 22000 pulse/min sind 367 pulse/s. Das ist immer noch zu
> schnell für einen Reedkontakt aber sicher nicht zu schnell für den
> Mikrocontroller/Arduino.

Der maximale Durchfluss ist 2,5 Liter pro Minute. Ein Liter erzeugt 
22000 Impulse. Bei maximalem Durchfluss werden also 55000 Impulse pro 
Minute erzeugt, also knapp 1000 Impulse pro Sekunde.

Vielleicht zählt jede Flanke als Impuls, ich denke aber eher das zwei 
Flanken einen Impuls ergeben. Der Mindestabstand zweier Flanken wäre 
dann (ein Tastverhältnis von 50% vorausgesetzt) ~500 Mikrosekunden.

Das sollte Durchfluss.ino oben aber packen.

Matze, korrigier mal Durchfluss.ino oben wie folgt:
   volatile uint32_t edge_count;

LG, Sebastian

von Manfred (Gast)


Lesenswert?

Sebastian W. schrieb:
> Der maximale Durchfluss ist 2,5 Liter pro Minute. Ein Liter erzeugt
> 22000 Impulse. Bei maximalem Durchfluss werden also 55000 Impulse pro
> Minute erzeugt, also knapp 1000 Impulse pro Sekunde.

Das ist zwar nett, aber total unrealistisch: Ein klassischer Ölbrenner 
mit 18kW verbraucht ca. 2 Liter pro Stunde. Bei 2,5 Liter pro Minute 
käme ich auf ca. 1,3 Megawatt Heizleistung, zentrale Heizanlage für eine 
ganze Siedlung mit 100 Häusern?

Also teile ich Deine 1000 mal durch 60, ergibt das 17 Hz, die sind gut 
beherrschbar.

Man muß auch mal gucken, wenn die Anlage älter ist und noch als 
Zweistrang läuft, ist eine Durchflußmessung sinnlos. Die geht nur bei 
Einstrangversorgung.

Ich habe einen Betriebsstundenzähler am Brenner und kann damit sehr gut 
abschätzen, was ich verbraucht habe.

Gemäß aktueller Betreiberrichtlinien muß eine Öltankanlage regelmäßig 
angeschaut werden. Wenn ich mich daran halte, sehe ich, wenn der Ölstand 
niedrig ist.

von Sebastian W. (wangnick)


Lesenswert?

Manfred schrieb:
> Das ist zwar nett, aber total unrealistisch: Ein klassischer Ölbrenner
> mit 18kW verbraucht ca. 2 Liter pro Stunde. Bei 2,5 Liter pro Minute
> käme ich auf ca. 1,3 Megawatt Heizleistung, zentrale Heizanlage für eine
> ganze Siedlung mit 100 Häusern?
>
> Also teile ich Deine 1000 mal durch 60, ergibt das 17 Hz, die sind gut
> beherrschbar.

Je nun, der gewählte Zähler hat nun allerdings eine 
Mindestdurchflussmenge von 0,1 l/min, also 30 Liter pro Stunde:

Wolfgang schrieb:
> Matze schrieb:
>> Ich habe diesen Durchflussmesser gekauft, da ich hier den Durchfluss vom
>> Heizöl messen möchte.
>
> Bist du sicher, dass der Verbrauch deiner Heizung zwischen 100 und 2500
> ml/min  liegt?

Manfred schrieb:
> Ich habe einen Betriebsstundenzähler am Brenner und kann damit sehr gut
> abschätzen, was ich verbraucht habe.

So mach ichs auch, plus ein Ultraschallsensor im Öltankdeckel. Man muss 
allerdings immer aufpassen wenn bei der Wartung die Düse gewechselt wird 
...

LG, Sebastian

: Bearbeitet durch User
von Manfred (Gast)


Lesenswert?

Sebastian W. schrieb:
>> Also teile ich Deine 1000 mal durch 60, ergibt das 17 Hz, die sind gut
>> beherrschbar.
> Je nun, der gewählte Zähler hat nun allerdings eine
> Mindestdurchflussmenge von 0,1 l/min, also 30 Liter pro Stunde:

Das rechnen wir noch einmal nach, da war doch irgendwas mit 60?
Ich käme da auf 6 Liter pro Stunde, damit dürfte der Sensor für die 
Anwendung unbrauchbar sein, wenn die Anlage unter 60kW liegt.

> Manfred schrieb:
>> Ich habe einen Betriebsstundenzähler am Brenner und kann damit sehr gut
>> abschätzen, was ich verbraucht habe.
> So mach ichs auch, plus ein Ultraschallsensor im Öltankdeckel. Man muss
> allerdings immer aufpassen wenn bei der Wartung die Düse gewechselt wird
> ...

Düse wechseln ist so ähnlich wie Zündkerzen, Bestandteil der 
Gelddruckmaschine Wartung. Eine Düse hält mindestens 5000 
Betriebbstunden, vermutlich sogar mehr.

Ich bürste einmal pro Jahr den Brennraum aus und wasche die Düse in 
Verdünnung aus. Die Rußzahl gucke ich mir an, bevor ich aufmache. Danach 
messe ich die Abgaswerte und fertig, dann kann Frau Schornsteinfeger 
kommen.

Ich habe meine Heizung selbst gebaut und in Betrieb genommen.
Nachdem mir ein paar Jahre später ein Heizungspfuscher die Anlage 
verdreht hat, habe ich mir Meßtechnik gekauft und befingere die selbst - 
war über die Jahre gerechnet ganz sicher kein Fehler.

von Sebastian (Gast)


Lesenswert?

Sebastian W. schrieb:
> also 30 Liter pro Stunde:

Oops. Da war die Windung wohl verklemmt :)

LG, Sebastian

Beitrag #6600319 wurde vom Autor gelöscht.
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.