Hallo,
grundsätzlich hast Du noch ein anderes Problem. Ich mach´s mal ausführlich. Derzeit misst Du ja die Frequenz, Anzahl der Impulse in einer Sekunde. Berechnet wird das jede Sekunde einmal. Damit liegt jede Sekunde ein neuer Messwert vor. Somit kannst Du auch nur jeweils nach einer Sekunde Dein Ventil abschalten. Ich weiß jetzt nicht ob Dir das reicht, aber du hast von 40ml gesprochen. Wie hoch ist denn dein Durchfluss in einer Sekunde ?
Besser wäre nur einfach die Impulse aufsummieren und normieren, und dann bei Erreichen der Sollmenge (Summe ) abzuschalten. Aber ich hatte Dir das in #6 schon mal vorgeschlagen.
ich hab da mal in meiner Bastelkiste etwas gefunden und ein Wenig angepasst. Die Frequenz des Duchflussmesser wir zum testen mittels Tone simuliert. Während des Füllvorganges wird die Summe alle 500ms aktualisiert.
läuft so auf einem UNO
Heinz
#include<util/atomic.h>
const float faktor = 1.0; // ml/Impuls
int Summe = 100; // Sollmenge in ml
const byte messpin = 2;
const byte startpin = 3;
const byte LED = 13;
bool btnstate;
bool btnold;
volatile uint16_t i_puls = 0; // counter für ISR
uint16_t puls = 0; // counter für Bearbeitung
uint16_t altpuls;
float ml = 0;
void setup() {
// put your setup code here, to run once:
pinMode(startpin, INPUT_PULLUP);
pinMode(LED, OUTPUT);
pinMode(messpin, INPUT_PULLUP);
Serial.begin(9600);
attachInterrupt(digitalPinToInterrupt(messpin), messen, FALLING);
}
void loop() {
// put your main code here, to run repeatedly:
tone(5, 35); // Frequenz zum testen
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
puls = i_puls; //umladen
}
// hier die Normierung
ml = puls * faktor;
btnstate = !digitalRead(startpin);// Invertiert einlesen
if (btnstate && !btnold && digitalRead(LED) == LOW) { //start
btnold = true;
i_puls = 0;
digitalWrite(LED, HIGH);
Serial.println("start");
}
if (btnstate)btnold = false;// reset Flanke
if (ml >= Summe) { // Menge erreicht
digitalWrite(LED, LOW);
}
if (puls != altpuls) { // Ausgabe aktualisieren
altpuls = puls;
ausgabe();
}
}
void messen() {
i_puls++;
}
void ausgabe() {
static uint32_t altzeit;
if (millis() - altzeit >= 500) {
altzeit = millis();
Serial.print( ml); Serial.println("ml durch");
}
}