Hallo, ich habe folgendes Problem:
ich möchte einen automatischen Desinfektionsmittelspender bauen.
Funktionsbeschreibung: Wenn der Ultraschallsensor die Hand erkennt und der Füllstand des Behälters in Ordnung ist, soll eine Pumpe angesteuert werden. Wenn die Hand weggenommen wird oder der Füllstand nicht mehr in Ordnung ist (leer) oder der Durchflussmesser eine bestimmte Menge an Desinfektionsmittel durchgelassen hat, soll die Pumpe abgeschalten werden. Das Programm ohne den Durchflussmesser funktioniert einwandfrei. Mein Problem ist das wenn ich das Programm erweitere sodass ich den Duchflussmesser mit einprogrammiere funktioniert das ganze nicht mehr.(Die Pumpe geht zwar an aber nicht mehr aus und wenn ich in den Sensor reinpuste und simuliere das Flüssigkeit durchfließt, werden mir keine werte im Seriellen Monitor angezeigt)
Der Link des Sensors: Durchflussmesser Durchflusssensor Hall Effekt Transistor Sensor YF-S401 | eBay
als Hardware benutze ich einen Elegoo UNO R3.
Ich habe mal alles markiert was zum Sensor gehört.
schonmal danke im vorraus
Gib uns:
Links zu den verwendeten Bibliotheken.
An welche Pins hast Du die Teile angeschlossen.
Kannst Du uns ein Schaltbild geben (es genügt auch eine Bleistiftzeichnung abfotografiert)
Schonmal danke für eure Hilfe.
Rechts vom Code steht ja bei manchen Zeilen "Durchfluss". Das sind die Teile die ich aus dem Internet kopiert und in das Programm eingefügt habe.
Der Link vom Code: YF-S401 flow meter - Micro Robotics
Die Bibliothek oben "FlowMeter.h" habe ich von Github, allerdings weiß ich nicht ob das überhaupt die richtige Bibliothek ist da ich sonst keine andere gefunden habe.
Danke MicroBahner,
wenn ich das ganze mal auf den Arduino lade kommt diese Fehlermeldung, was allerdings komisch ist weil irgend etwas stimmt ja nicht mit dem programm aber es wird trotzdem übertragen.
C:\Users\david\Desktop\2.2.21\2.2.21.ino: In function 'void setup()':
C:\Users\david\Desktop\2.2.21\2.2.21.ino:18:35: warning: invalid conversion from 'int' to 'void ()()' [-fpermissive]
attachInterrupt(0, pulse, RISING);
^
In file included from sketch\2.2.21.ino.cpp:1:0:
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:151:6: note: initializing argument 2 of 'void attachInterrupt(uint8_t, void ()(), int)'
void attachInterrupt(uint8_t interruptNum, void (*userFunc)(void), int mode);
^~~~~~~~~~~~~~~
Der Sketch verwendet 4546 Bytes (14%) des Programmspeicherplatzes. Das Maximum sind 32256 Bytes.
Globale Variablen verwenden 248 Bytes (12%) des dynamischen Speichers, 1800 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.
Orginal wird die Funktion pulse() über einen Impuls am Pin 2 ein Interrupt ausgelöst und darin das Volumen eines Impulses dazuaddiert.
Du rufst im loop() bei jedem Durchgang die nicht vorhandene Funktion pulse() zusätzlich zu den Impulsen an Pin 2 auf. Darum wird ca jede Sekunde der Wert erhöht.
digitalRead(FSMPin);
Was soll das? Du speicherst den gelesenen Wert in keiner Variablen ab.
digitalReadFSMPin (Füllstandsmessung) ist noch über dem Setup als int Variable deklariert. Im Setup als Input-Variable beschrieben. Im Loop wird dann der Pin, auf dem auf dem die Signalleitung liegt ausgelesen.
Ich habe das ganze mal soweit hoffentlich ausgebessert. Noch über dem Setup steht im Internetcode ja volatile double waterFlow, jetzt habe ich noch dazu geschrieben int pulse, weil das ganze sonst immer dazu führt das mir gesagt wird das die variable pulse nicht deklariert ist.
Allerdings funktioniert das ganze immernoch nicht wie gewünscht.
Danke für die Hilfe...
Du solltest Dir ein paar Grundlagen von C/C++ aneignen. Nur mit Try&Error wird das nichts.
mangoschorle72:
jetzt habe ich noch dazu geschrieben int pulse, weil das ganze sonst immer dazu führt das mir gesagt wird das die variable pulse nicht deklariert ist.
'pulse' ist keine Variable, sondern die Funktion, die im Interrupt aufgerufen werden soll. Du machst ein paar fundamentale Fehler:
Du kannst eine Funktion nicht innerhalb einer anderen Funktion definieren. Deshlab muss die Definition von 'pulse' aus dem loop raus
Hinter das 'void pulse()' gehört kein Semikolon, sonst machst Du nur eine Funktionsdeklaration. Du willst/musst aber auch definieren, was in der Funktion passieren soll. Also:
void pulse() // hier kein Semikolon!
{
waterFlow += 1.0 / 5880.0;
}
Hallo
hast du schon den Durchfluß-Geber in einem separaten Sketch zum Laufen gebracht?
Wenn NEIN, dann die Durchfluß-Geber Hardware in einem Testsketch integrieren, testen und danach beide Sketch zusammen löten.
Ja, ich habe den Code von der Internetseite schonmal seperat benutzt und er funktioniert. Dann habe ich natürlich den Teil vor dem Setup kopiert und über meinem Setup eingefügt. Genauso bin ich mit dem setup und dem loop vorgegangen. Allerdings kommen immer wieder Fehlermeldungen beim übertragen.
Hallo ich habe den bzw. die Fehler gefunden. Nun habe ich ein letzte Frage. Im seriellen Monitor sollte die Variable waterFlow ja eigentlich nur hoch gehen wenn Flüssigkeit durch den Sensor fließt, allerdings geht diese auch nach oben wenn die Pumpe läuft
Hallo,
im Moment noch nicht da ich es erst provisorisch auf dem Schreibtisch aufbaue. Wenn ich in den Sensor reinpuste steigt der Wert aber auch wenn die Pumpe läuft, was ja eigentlich keinen Sinn ergibt, da diese keine Flüssigkeit durch den Sensor pumpt.