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
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
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
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.
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.
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.
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?
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.
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
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
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 |
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?
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
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.
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
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.
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.
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
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
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
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.
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.