Forum: Mikrocontroller und Digitale Elektronik Arduino & Durchflusssensor


von Julian U. (julian_u)


Lesenswert?

Hallo zusammen,

als Hobby-Elektroniker habe ich mir ein neues Bastel-Projekt überlegt. 
Klingt zwar amüsant, aber ich habe in einer Bar eine elektronische 
Cocktailbar gesehen, die ich gerne im Kleinformat für meinen Partykeller 
nachbauen würde. Prinzipiell wird durch eine Pumpe die entsprechende 
Flüssigkeit angesaugt und mit einem Durchflusssensor das Volumen 
gemessen.
Für einen ersten Test habe ich eine kleine Pumpe, die mir 1,2 Liter pro 
Minute liefert. Der Durchflusssensor liefert mir ein 5V Rechteckimpuls. 
Ingesamt liefert er bei einem Liter genau 2500 Impulse. Je nach Volumen 
kann man das entsprechend runterrechnen.
Der Link und das Datenblatt ist hier:
http://www.conrad.de/ce/de/product/150391/Durchflussmesser-Flow-Meter-FCH-m-POM-LC-001-35-lmin-BIO-TECH-eK-FCH-m-POM-LC-mit-Duese-1-mm-001-10-lmin

Nun muss ich in meinen Programmcode ein kleines Delay für die serielle 
Verbindung einbauen, die ich später benötigen werde. Nach folgender 
Rechnung:
1.2l/min * 2500 Impulse = 3000 Impulse/min
 => 1 Impuls pro 20 ms

Um jeden Impuls zu erfassen muss mein Programmcode schneller als 20ms 
laufen, oder? Eine weitere Frage wäre, was wäre denn wenn mein Arduino 
nicht synchron arbeitet wie der empfangene Impuls. Ich bin da leicht 
skeptisch, wie ich das am besten lösen kann.

Vielleicht kann mir jemand paar Tipps geben, wie das Problem am besten 
zu lösen ist. Ich bin über jeden Hinweis dankbar. Vielleicht sind meine 
Überlegungen auch völlig falsch :D

Liebe Grüße

Julian

von Karl H. (kbuchegg)


Lesenswert?

In dem Moment, in dem die die Wörter 'Zeitverzögerung' und 'Delay' in 
einem Satz gemeinsam in den Mund nimmst, ist bereits allen klar, dass 
das nichts wird.

Delay ist selten die Lösung, oft aber das Problem.
Die Lösung deines Problems (wie 90% aller anderer Probleme, in denen 
eine zeitliche Steuerung notwendig ist) führt über Timer

FAQ: Timer

Man setzt sich eine ISR auf, die alle 20ms aufgerufen wird. Weiters 
setzt du einen Zähler (einfach eine Variable) auf den Wert, dessen 
Vielfaches von 20ms abgezählt werden soll und gleichzeitig wird die 
Pumpe eingeschaltet. In der ISR wird dieser Zähler um 1 erniedrigt und 
wenn 0 erreicht wurde, wird in der ISR die Pumpe wieder abgeschaltet.

Fazit: Du bist das ganze Timingproblem ein für allemal los und kannst in 
der Hauptschleife nach Herzenslust fuhrwerken wie du lustig bist. Ist 
die vorberechnete Zeit abgelaufen, dann stoppt der Timer ganz von 
alleine und ohne weiteres Zutu in der Hauptschleife die Pumpe.

Ganz einfach, wenn man mit seinem µC umgehen gelernt hat.

> Vielleicht kann mir jemand paar Tipps geben, wie das Problem am besten zu lösen 
ist.

Wenn du das ernsthaft programmieren willst, dann ohne das Arduino 
Geraffel. Es bringt dir herzlich wenig, verhindert aber, dass du 
ordentlich die Programmierung eines µC lernst.
Ansonsten musst du dir eben ein Tutorial suchen, wie man auf einem 
Arduino mit einem Timer in Interrupts arbeitet. Das Prinzip bleibt nach 
wie vor dasselbe.

Ganz abgesehen davon, dass 20ms für einen µC schon eine 
Dreiviertel-Ewigkeit darstellt, wenn man das vernünftig programmiert und 
nicht immer gleich an 'Delay' bei Zeitsteuerungen denkt. Wie gesagt: 
Delay ist selten die Lösung - oft aber das Problem.

: Bearbeitet durch User
von Jürgen (Gast)


Lesenswert?

Wozu der Timer mit der 20ms Timer-ISR, wenn er doch per ISR die Impulse 
direkt zählen kann? Kann dem irgendwie nicht folgen.

Pumpe ein, Impulse per Interrupt zählen, Pumpe aus -> fertig.
Da brauchts keinen Timer.

von Karl H. (kbuchegg)


Lesenswert?

Jürgen schrieb:
> Wozu der Timer mit der 20ms Timer-ISR, wenn er doch per ISR die Impulse
> direkt zählen kann? Kann dem irgendwie nicht folgen.

Du hast recht.
Ich war jetzt in Gedanken bei der Umkehrung: Er muss eine gewisse Anzahl 
an Pulsen generieren.

Aber du hast recht, der Fall liegt ja gar nicht vor.

> Pumpe ein, Impulse per Interrupt zählen, Pumpe aus -> fertig.
> Da brauchts keinen Timer.

Wo du recht hast, hast du Recht. Danke fürs zurechtrücken.

von Jürgen S. (jurs)


Lesenswert?

Karl Heinz schrieb:
> Wenn du das ernsthaft programmieren willst, dann ohne das Arduino
> Geraffel. Es bringt dir herzlich wenig, verhindert aber, dass du
> ordentlich die Programmierung eines µC lernst.

Das in Deiner Diktion "Arduino Geraffel" verhindert aber nicht, dass 
Hobbybastler damit eine Cocktailmaschine bauen und programmieren:
http://www.youtube.com/watch?v=hJIkJ9x0-JQ

Aber der Typ, der die gebaut hat, wollte wahrscheinlich auch nur eine 
ordentliche Cocktailmaschine bauen und sein Ziel war es gar nicht 
"ordentlich die Programmierung eines µC" zu lernen. Weiß man's wirklich 
so genau?

von Karl H. (kbuchegg)


Lesenswert?

Jürgen S. schrieb:

> Das in Deiner Diktion "Arduino Geraffel" verhindert aber nicht, dass
> Hobbybastler damit eine Cocktailmaschine bauen und programmieren:
> http://www.youtube.com/watch?v=hJIkJ9x0-JQ

Der Unterschied: er konnte das.
Und das ist auch nicht vom Himmel gefallen, sondern er musste das 
Lernen. Du kannst es drehen und wenden wie du willst, ums lernen kommst 
du nicht herum.
Ich kanns auch mit dem Arduino-Geraffel programmieren. Ich kanns aber 
auch ohne. Und weil ich es auch ohne kann, hab ich eine gewisse 
Vorstellung davon, wie dieses Arduinio Geraffel eigentlich intern 
arbeitet. Was mir wiederrum dabei hilft, diese vorgefertigten Dinge 
vernünftig und effizent einzusetzen, wenn es denn sein muss. Aber 
eigentlich gibt es oft gar keine Notwendigkeit dafür. Zumindest dann 
nicht, wenn wir uns auf der Ebene von Portbits setzen, löschen oder 
Impulse zählen bewegen. Dafür habe ich allerdings die volle Kontrolle 
und bin nicht darauf angewiesen, mit vorgefertigten Komponenten zu 
arbeiten, die nicht unbedingt fehlerfrei sind und die undokumentierte 
Nebenwirkungen in andere Systeme haben. Der prinzipielle Programmaufbau 
ist sowieso da wie dort derselbe.

Ob ich jetzt selber schreibe
1
int main()
2
{
3
   alle Initialisierungen
4
5
   sei();
6
7
   while( 1 ) {
8
9
      Aktionen in der Hauptschleife
10
11
   }
12
}

oder ob mir das Arduino Framework das hier vorgibt
1
int main()
2
{
3
  setup();
4
5
  while( 1 ) {
6
    loop();
7
  }
8
}
und ich die Funktionen setup() bzw. loop() schreibe, ist Jacke wie Hose. 
Einziger Unterschied: eine klassische Flankenabfrage, wie man sie 
beispielsweise zum Zählen von Pulsen einsetzen kann ....
1
   alt = Port & Bitnummer;
2
3
   while( 1 ) {
4
5
     neu = Port & Bitnummer;
6
     if( neu != alt && neu )      // steigende Flanke feststellen
7
     {
8
       alt = neu;
9
10
       mach was bei steigender Flanke
11
12
     }
13
   }

ist ungefähr 150 mal so schnell, wie ein digitalRead im Arduino System.

: Bearbeitet durch User
von Jürgen S. (jurs)


Lesenswert?

Karl Heinz schrieb:
> Einziger Unterschied: eine klassische Flankenabfrage, wie man sie
> beispielsweise zum Zählen von Pulsen einsetzen kann ....
> ...
> ist ungefähr 150 mal so schnell, wie ein digitalRead im Arduino System.

Faktor 150 bei direkter Programmierung vs. digitalRead() ist ein 
Gerücht, ganz so viel ist es am Ende doch nicht.

Im übrigen hindert einen mit der Arduino-Software niemand daran, exakt 
dieselben Datenrichtichtungsregister, Port- und Pinadressen direkt und 
schnell zu verwenden, wie Du es auch machst.

Die teils langsamen Arduino-Komfortfunktionen wie digitalRead(), 
digitalWrite() und wie sie alle heißen, sind OPTIONAL.

Wer einen einfachen Einstieg finden möchte, kann diese Befehle 
verwenden. Das mache ich auch gerne, weil ich es bequem finde. Aber man 
braucht die lahmen Arduino-Komfortbefehle nicht zu verwenden, wenn man 
nicht möchte.

Mit der Arduino Core-Library verhält es sich wie mit jeder anderen 
Library: Wenn die Befehle in einer Library vorhanden sind, kann man sie 
benutzen. Aber es zwingt einen niemand, das auch zu tun.

Bei einer Cocktailmaschine, die in 30 Sekunden fünf Zutaten zu einem 
Cocktail mixt, sehe ich jedenfalls nichts, weshalb man dabei auf die 
"langsamen" Arduino-Komfortfunktionen digitalRead() oder digitalWrite() 
verzichten müßte, nur um eine Pumpe einige wenige Millionstel Sekunden 
schneller ein- oder ausschalten zu können.

von chris_ (Gast)


Lesenswert?

>Die teils langsamen Arduino-Komfortfunktionen wie digitalRead(),
>digitalWrite() und wie sie alle heißen, sind OPTIONAL.

Und sind wie bei allen abstrahierenden Frameworks voll beabsichtigt.
Ich habe mal ein Progamm von einem Arduino Uno ( Atmega328 ) auf einem 
Arduino Due ( ARM ) ohne jegliche Änderung verwendet. Nur durch die 
Abstraktion der Ports und des Framworks ist das möglich. Ich war sogar 
erstaunt, dass das ohne Problem ging, da ich auch zeitkritische Teile 
mit delay() verwendet hatte.

von Jörg (Gast)


Lesenswert?

Hallo Karl Heinz,

beim Durchlesen dieses Threads möchte ich Deine Anmerkungen nicht 
unkommentiert lassen:

1. Wie jurs bereits anmerkte möchte der Threaderöffner eine 
Cocktailmaschine bauen. Hiezu benötigt er Hilfe. Er hat sich für die 
(mittlerweile weltmarktführende) Arduino Plattform entschieden. Aus 
welchen Gründen auch immer hat er sich dazu entschieden es mit diesem 
Mikrocontroller zu stemmen.
Eine Wertung seiner Wahl steht nicht zur Diskussion.

2. Um eine Automatisierung zu bauen benötigt er eine Steuerung. Egal ob 
Logo oder S7-417H oder halt Arduino. Die jeweilige IDE ermöglicht dies 
und erfordert nicht immer Kenntnisse über Fuses oder interne Timer oder 
andere µC interne Dinge. Ganze Prozessautomatisierungsanlagen werden 
heutzutage mit dieser Programmiertiefe programmiert.

3. Du bist Moderator dieses Forums. Dies erfordert Kompetenzen über dem 
technischen Können hinaus. Ein Moderator sollte sich niemals bewertend 
oder gar abwertend gegenüber einer Technologie, einer Idee oder einer 
persönlichen Vorliebe eines Fragenden äußern.
Ein Moderator soll Hilfestellungen geben und für ein gutes, freundliches 
Miteinander sorgen.
"...ist bereits allen klar, dass das nichts wird." ist eine Aussage, 
welche eher zum Cyblord passen würde als zu jemandem der hier die o.g. 
Funktion erfült.

Ich möchte Dich ausdrücklich bitten, die Art Deiner Führung dieses 
Forums zu überdenken.

Viele Grüße

Jörg

von hk_book (Gast)


Lesenswert?

Hier scheint es ja nur noch um das Programmieren zu gehen; vielleicht 
noch einen Hinweis auf einen (nicht unbedeutenden) Nebeneffekt: ist der 
Durchflussmesser (gilt auch für eventuelle Schläuche) denn geeignet für 
Lebensmittel?

Lt. Datenblatt für Wasser, Benzin, Heizöl und nicht agressive 
Flüssigkeiten. Gerade Fruchtsäfte können sehr schnell vergammeln 
(schimmeln), wenn sie unter Raumtemperaturen stehebleiben und ein 
Turbinendurchflussmesser hat viele Ecken und Winkel, wo etwas kleben 
bleiben kann. Eventuell mal über Kühlung und Spülzyklen nachdenken, 
falls das nicht nur ein Gimmick werden soll.

von Cyblord -. (cyblord)


Lesenswert?

Jürgen S. schrieb:

> Das in Deiner Diktion "Arduino Geraffel" verhindert aber nicht, dass
> Hobbybastler damit eine Cocktailmaschine bauen und programmieren:
> http://www.youtube.com/watch?v=hJIkJ9x0-JQ

Ja Jürgen weißt, also ich will ja gerne ein Space-Shuttle bauen und 
erhoffe mir hier Hilfe. Von entsprechender Technik, Mechanik, 
Metallurgie, Luft- und Raumfahrttechnik, Raketentechnik usw. hab ich 
aber leider keinen Schimmer.

Aber schau mal, andere haben das auch geschafft, also bitte wo ist das 
Problem?. Schau hier: http://www.nasa.gov.

Was lernen wir daraus? Es ist völlig egal was andere schon gemacht haben 
und jedem hier ist völlig klar, dass man sowas mit Arduino machen kann, 
weil man sowas mit ALLEM machen kann das man irgendwie programmieren 
kann. Auch mit Lego-Mindstorms oder sonst was. Also warum das 
offensichtliche nochmal dauernd bestätigen?

Genauso offensichtlich ist es, dass der TE niemals eine Cocktailmaschine 
selber programmieren kann. Nicht mit Arduino und auch sonst mit nichts. 
Zumindest nicht ohne Cocktail-Shield und Cocktail-Lib mit dem Aufruf 
cocktail.startMaschine(), für den er allerdings 100 Posts im Forum 
braucht, weil er die Doku nicht liest.

gruß cyblord

: Bearbeitet durch User
von Jörg (Gast)


Lesenswert?

Schade, dass der Cyblord meinen letzten Post nicht las. Dort habe ich in 
Erwartungshaltung und vorsorglich schonmal die negativen Kommentare des 
Cyblord fast schon zitiert...

Sag' mal Cyblord, ist es Dir eigentlich nicht peinlich dass Deine 
merkwürdige Art und Weise schon im Vorfeld belächelt wird ?

@ Jürgen... einfach nicht hinhöhren...

@hk_book: Du scheinst Dich auszukennen, aber eine CIP ist hier wohl 
nicht möglich ;-) :-)))
Dennoch hast Du Recht !!!!

Mein Lösungsvorschlag hierzu:
Ich empfehle nach jeder Benutzung die Durchspülung mit Correga-Tabs 
Lösung.

von Cyblord -. (cyblord)


Lesenswert?

Jörg schrieb:
> Schade, dass der Cyblord meinen letzten Post nicht las.
Warum soll ich Posts von dir lesen? hast du schonmal was sinnvolles 
geschrieben? Also.

> Dort habe ich in
> Erwartungshaltung und vorsorglich schonmal die negativen Kommentare des
> Cyblord fast schon zitiert...

Ja weil dein Unterbewusstsein dir wohl bereits sagt dass es eben auch SO 
IST. Außerdem gehst du ja sogar KHB an. Nur weil er sagt wie es ist. Was 
soll man davon halten?
Natürlich muss niemand wertfrei an sowas rangehen. Natürlich kann und 
soll man hier (auch als mod) seine Meinung schreiben. Ich finde das 
Arduino-Framework furchtbar. KHB auch, aber er ist nunmal extrem 
freundlich und diplomatisch darum sagt er dies nicht so deutlich.

> Sag' mal Cyblord, ist es Dir eigentlich nicht peinlich dass Deine
> merkwürdige Art und Weise schon im Vorfeld belächelt wird ?
Belächelt von wem? Von dir und ein paar anderen Spackos? Wen juckt das? 
Ich weiß dass ich recht habe. Frag in 2 Jahren, der TE wird keine 
Cocktailmaschine haben und keine programmieren können. Realität halt.

> @ Jürgen... einfach nicht hinhöhren...
Genau, Augen zu und durch. Bloß keine Kurskorrekturen. Alle doof außer 
Arduino-Jörg.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

> 1. Wie jurs bereits anmerkte möchte der Threaderöffner eine
> Cocktailmaschine bauen. Hiezu benötigt er Hilfe. Er hat sich für die
> (mittlerweile weltmarktführende) Arduino Plattform entschieden. Aus
> welchen Gründen auch immer hat er sich dazu entschieden es mit diesem
> Mikrocontroller zu stemmen.
> Eine Wertung seiner Wahl steht nicht zur Diskussion.


OK. Dann ganz konkret auf die Anfrage des TO

> Um jeden Impuls zu erfassen muss mein Programmcode schneller als
> 20ms laufen, oder?

Wenn du das so ausgerechnet hast, dann wird es wohl schon stimmen

> Eine weitere Frage wäre, was wäre denn wenn mein Arduino nicht
> synchron arbeitet wie der empfangene Impuls. Ich bin da leicht
> skeptisch, wie ich das am besten lösen kann.
> Vielleicht kann mir jemand paar Tipps geben

Der Tipp lautet: Dein µC ist viel schneller als du denkst. Nur weil du 
vom PC mit seinen GHz gewohnt bist, dass alles eine gewisse Zeit dauert, 
ist das nicht bei allen Computern so. Auf dem PC frisst das 
Betriebssystem, die grafische Ausgabe, die Netzwerkbehandlung, 
Sicherheitsmechanismen, Virenscanner, etc. etc. einen nicht 
unbedeutenden Teil der Rechenleistung auf. Aber all das hast du auf 
deinem µC nicht. Dein Programm läuft auf der nackten Hardware und die 
macht rund 15 Millionen Befehle in der Sekunde. Mehr als genug Zeit bei 
halbwegs vernünftiger Programmierung, so dass du nicht in Zeitnot 
kommst. Die Betonung liegt auf vernünftig. Man kann natürlich auch so 
einen µC durch ungeschickte Programmierung mehr als ausbremsen und dann 
wird das nichts. Das man sein Handwerk, die Programmierung, zumindest so 
einigermassen beherrschen soll, wenn man so ein Projekt angeht, sollte 
sich eigentlich von selber verstehen.
Sei es wie es sei: 20ms sind für einen mit 16Mhz getakteten AVR eine 
kleine Ewigkeit, in der er immerhin rund 300-tausend Befehle abarbeiten 
kann. Wenn du dich da nicht allzu ungeschickt anstellst, dann läufst du 
nicht Gefahr 'asynchron' mit dem Pumpen Puls zu werden. Aus Sicht des 
Arduino spielt sich dieser Puls in Zeitlupe ab.

: Bearbeitet durch User
von Julian U. (julian_u)


Lesenswert?

Also schonmal Danke für die Antworten.
Ich denke der Tipp des Timers war ganz passend. Um Interrupts zu 
benutzen brauche ich beim Arduino entsprechend viele Pins, die sind aber 
nicht so ausreichend vorhanden, deswegen werde ich vorerst die Idee des 
Timers probieren.
Mal schauen irgendwie bekomme ich das schon hin.

Leider ist es auch hier wieder passiert, dass Nutzer einfach nur frech & 
unverschämt werden. Insbesondere meine ich damit "cyblord". Mir ist es 
ein Rätsel, warum man solche sinnfreien Antworten auf meine Thread geben 
muss. Vielleicht kannst du dich im Haushalt, Beruf etc nicht profilieren 
und musst es hier versuchen, aber ich kann dir sagen, lass es besser.
Wenn Hobby-Elektroniker, vlt bisschen untertrieben da ich angehender 
BSc-Avsolvent in Mechatronik bin, sich in ihrer Frezeit ein 
Bastel-Projekt überlegen, dann finde ich das völlig adequat hier nach 
Tipps fragen zu dürfen. Auch ich muss mich Schritt für Schritt in ein 
Arduino einarbeiten.
Deine Einstellung, dass man das eh nicht schafft, sollst du dir besser 
ganz schnell abgewöhnen, weil bringen tut auch das nichts. Ein Forum ist 
dafür da um seine Fragen zu stellen und von erfahrenen Leuten Antwort zu 
bekommen. Vielleicht scheinst du erfahren zu sein, doch deine Aussagen 
spiegeln genau das Gegenteil wider. Denk mal bitte drüber nach.
Zum Thema Arduino:
Er mag vlt nicht der beste uC sein, doch er hat bisher meine Ansprüche 
erfüllt. So habe ich in Kombination mit einem RasPi eine 
Hausautomatisierung mit Touch-Panel entwickelt, die tadellos 
funktioniert. Warum sollte man was besseres nehmen, wenn sich altes gut 
bewährt hat? Alt im Übrigen im Sinne von gebräuchlich, bevor wieder 
Kontra kommt.

Ich hoffe, dass dem ein oder anderen mal klar wird, was es bedeutet im 
Forum anständig zu kommunizieren. cyblord dir wünsche ich für die 
Zukunft alles Gute, du packst das schon mit deinen Problemen :)

Beste Grüße

Julian

PS: Thema erledigt.

von Karl H. (kbuchegg)


Lesenswert?

Julian Utsch schrieb:
> Also schonmal Danke für die Antworten.
> Ich denke der Tipp des Timers war ganz passend. Um Interrupts zu
> benutzen brauche ich beim Arduino entsprechend viele Pins, die sind aber
> nicht so ausreichend vorhanden, deswegen werde ich vorerst die Idee des
> Timers probieren.

Du brauchst auch den Timer nicht
1
uint8_t alt, neu;
2
uint16_t Pulse;
3
4
void setup()
5
{
6
  alt = digitalRead( PumpenPin );
7
}
8
9
void loop()
10
{
11
  neu = digitalRead( PumpenPin );
12
  if( neu != alt && neu == HIGH ) {
13
    Pulse++;
14
    alt = neu;
15
  }
16
17
  ....
18
}

wie gesagt: wenn du dich im Rest nicht allzu ungeschickt anstellst und 
nicht sinnlos Zeit verplemperst (im Millisekunden Bereich), dann ist das 
von der Zeit her kein Problem.


Hintergrund: Du kannst auf einem Ardunio nicht einfach so irgendeinen 
Timer zweckentfremden. Die sind im Arduino System schon eingeplant und 
haben dort fixe Aufgaben.

: Bearbeitet durch User
von Franz (Gast)


Lesenswert?

>Leider ist es auch hier wieder passiert, dass Nutzer einfach nur frech &
>unverschämt werden. Insbesondere meine ich damit "cyblord".

Das ist nich ungewöhnlich hier. Das "cyberlördchen" ist der eingebaute 
Foren-Troll. Du musst nur "Arduino" sagen, dann kommte er vor und 
quaked.

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.