Servo und waterflow

Hallo zusammen,

ich habe ein kleines Problem und versuche es zu schildern:
Wir haben einen Raum, wo mehrere Arduinos im Einsatz sind.
Und jetzt zum Problem:
Das Arduino ist dafür zuständig, dass es das eingefloßene Wasser zählt und bei bestimmter Menge des Wassers wird Servo eingeschalten.
Das Problem liegt darin, dass das Servo sich sofort einschaltet, wenn man die anderen Arduinos oder Knöpfe betätigt.

Der Code:

#include <Servo.h>

Servo myservo;
int pos = 0;

byte sensorInterrupt = 0;  // 0 = digital pin 2
byte sensorPin       = 2;
byte taster          = 7;

// The hall-effect flow sensor outputs approximately 4.5 pulses per second per
// litre/minute of flow.
float calibrationFactor = 4.5;

volatile byte pulseCount;  

float flowRate;
unsigned int flowMilliLitres;
unsigned long totalMilliLitres;

unsigned long oldTime;
int tasterstatus      = 0;
int waterflowstatus =0;
int summestatus = 0;

void setup()
{
  // Initialize a serial connection for reporting values to the host
 Serial.begin(9600);
 myservo.attach(9); 
 myservo.write(0);
 myservo.detach();
 // Set up the status LED line as an output  
 pinMode(sensorPin, INPUT);
 digitalWrite(sensorPin, HIGH);
 pinMode(taster, INPUT);
 pulseCount        = 0;
 flowRate          = 0.0;
 flowMilliLitres   = 0;
 totalMilliLitres  = 0;
 oldTime           = 0;

 // The Hall-effect sensor is connected to pin 2 which uses interrupt 0.
 // Configured to trigger on a FALLING state change (transition from HIGH
 // state to LOW state)
 attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
}

/**
* Main program loop
*/
void loop()
{
  waterflowstatus = !digitalRead(sensorPin);
  if((millis() - oldTime) > 1000)    // Only process counters once per second
 { 
   // Disable the interrupt while calculating flow rate and sending the value to
   // the host
   detachInterrupt(sensorInterrupt);
   
       
   // Because this loop may not complete in exactly 1 second intervals we calculate
   // the number of milliseconds that have passed since the last execution and use
   // that to scale the output. We also apply the calibrationFactor to scale the output
   // based on the number of pulses per second per units of measure (litres/minute in
   // this case) coming from the sensor.
   flowRate = ((1000.0 / (millis() - oldTime)) * pulseCount) / calibrationFactor;
   
   // Note the time this processing pass was executed. Note that because we've
   // disabled interrupts the millis() function won't actually be incrementing right
   // at this point, but it will still return the value it was set to just before
   // interrupts went away.
   oldTime = millis();
   
   // Divide the flow rate in litres/minute by 60 to determine how many litres have
   // passed through the sensor in this 1 second interval, then multiply by 1000 to
   // convert to millilitres.
   flowMilliLitres = (flowRate / 60) * 1000;
   Serial.print("summestatus: ");
   Serial.println(summestatus);
  
   Serial.print("sensorPin: ");
   Serial.println(digitalRead(sensorPin));
   if(summestatus  == digitalRead(sensorPin)){
   // Add the millilitres passed in this second to the cumulative total
   totalMilliLitres += flowMilliLitres;
   }
   unsigned int frac;
   
   // Print the flow rate for this second in litres / minute
   Serial.print("Waterflowstatus: ");
   Serial.print(waterflowstatus);
   Serial.print("Flow rate: ");
   Serial.print(int(flowRate));  // Print the integer part of the variable
   Serial.print(".");             // Print the decimal point
   // Determine the fractional part. The 10 multiplier gives us 1 decimal place.
   frac = (flowRate - int(flowRate)) * 10;
   Serial.print(frac, DEC) ;      // Print the fractional part of the variable
   Serial.print("L/min");
   // Print the number of litres flowed in this second
   Serial.print("  Current Liquid Flowing: ");             // Output separator
   Serial.print(flowMilliLitres);
   Serial.print("mL/Sec");

   // Print the cumulative total of litres flowed since starting
   Serial.print("  Output Liquid Quantity: ");             // Output separator
   Serial.print(totalMilliLitres);
   Serial.println("mL"); 
   servoOpen();
   servoClose();
   // Reset the pulse counter so we can start incrementing again
   pulseCount = 0;
   
   // Enable the interrupt again now that we've finished sending output
   attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
 }
}

/*
Insterrupt Service Routine
*/
void pulseCounter()
{
 // Increment the pulse counter
 pulseCount++;
}

void servoOpen(){
// Serial.println("servoOpen Function");
 //Serial.println(totalMilliLitres);

   if(totalMilliLitres >= 10){
   if(pos==0){
      myservo.attach(9); 
     for (pos = 0; pos < 180; pos += 1) { // goes from 0 degrees to 180 degrees
      // in steps of 1 degree
       myservo.write(pos);              // tell servo to go to position in variable 'pos'
       Serial.print("New position");
       Serial.println(pos);
       delay(15);                       // waits 15ms for the servo to reach the position
     }
     myservo.detach(); 
     totalMilliLitres = 0;
      summestatus = !digitalRead(sensorPin);
     Serial.println(pos);
   }
 }
}
void servoClose(){
 tasterstatus = digitalRead(taster);
   
 Serial.println("servoClose Function");
 Serial.println(tasterstatus);
 
   if(tasterstatus == 1){
     if(pos == 180){
       Serial.println("test");
       myservo.attach(9); 
       for (pos = 180; pos > 0; pos -= 1) { // goes from 180 degrees to 0 degrees
         myservo.write(pos);              // tell servo to go to position in variable 'pos'
         Serial.print("Return to start");
         Serial.println(pos);
         delay(15);                       // waits 15ms for the servo to reach the position
       }
     myservo.detach();
     }
   
   totalMilliLitres = 0;
   summestatus = !digitalRead(sensorPin);
 }
}

Ich bedanke mich im Voraus.

Sorry, aber den Sketch kann ich hier mobil nicht lesen.

Setze den bitte in Code-Tags. Schaltfläche </> im Editorfenster. Das kannst du auch nachträglich machen.

Aber ich rate mal, hast du an deinen Tasterpins auch Pullup oder Pulldown Widerstände verwendet ?

Ja habe ich Pulldown

Kann jemand mir bitte helfen? Ich komme nicht weiter :frowning:

Wie sind den die Arduinos untereinander verbunden ?

Wie lang sind die Kabel zu den Tastern ?

Wie groß sind die Pulldown-Widerstände ?

Hängen alle Arduino an einer Spannungsversorgungen und wenn ja welcher?

Bakuer:
Kann jemand mir bitte helfen? Ich komme nicht weiter :frowning:

Jetzt wollen wir helfen, bekommen aber keine Antwort.

HotSystems:
Jetzt wollen wir helfen, bekommen aber keine Antwort.

Du verlangst aber viel :wink: :wink:

Grüße Uwe

uwefed:
Du verlangst aber viel :wink: :wink:

Grüße Uwe

:wink: Wieso ich, der TO hat doch Lärm gemacht. :wink:

HotSystems:
Wie sind den die Arduinos untereinander verbunden ?

Die sind untereinander nicht verbunden. 2 Arduinos in einem Raum und ein Arduino in anderem Raum sind.

HotSystems:
Wie lang sind die Kabel zu den Tastern ?

Die Kabel ist ca 4 Meter lang.

HotSystems:
Wie groß sind die Pulldown-Widerstände ?

1k

Scherheinz:
Hängen alle Arduino an einer Spannungsversorgungen und wenn ja welcher?

Nein.

Bakuer:
Das Problem liegt darin, dass das Servo sich sofort einschaltet, wenn man die anderen Arduinos oder Knöpfe betätigt.

Das verstehe ich nicht, wenn die keine Verbindung zueinander haben kann der eine Arduino auch nicht auf den anderen reagieren. Was bedeutet überhaupt "Arduino betätigt"?

Mach mal die Kabel zu den Tastern kürzer. Max. 10 cm und teste damit.

Ich befürchte du bekommst irgend welche Störungen in deinen Arduino, die wir hier nicht sehen.

HotSystems:
Mach mal die Kabel zu den Tastern kürzer. Max. 10 cm und teste damit.

Ich befürchte du bekommst irgend welche Störungen in deinen Arduino, die wir hier nicht sehen.

Ich habe es so probiert. Leider hat es nichts gebracht.
Wie gesagt, ich bin ziemlich neue in diesem Bereich und ich vermute, dass es an attachInterrupt(sensorInterrupt, pulseCounter, FALLING); liegt.

In einer Testdurchführung habe ich folgendes festgestellt.
Egal was man in diesem Raum betätigt, z.B. taster drucken, die eigentlich mit dem Arduino nix zu tun haben, bekommt Arduino ein Signal.Wie man aus dem Code auch auslesen kann, wird in einer bestimmte Zeitraum die aufgenommenen Signale gesammelt und ein Befehl an Servo gesendet, damit Servo der Tür schließt bzw. öffnet.

Dann solltest du die Kabel zum Sensor auch kürzer wählen und da evtl. auch mit Pullup oder Pulldown Widerstand probieren.

Das klingt schon sehr nach der Theorie von HotSystems.

Tritt das auch auf wenn überhaupt kein Wasser fließt?

Scherheinz:
Das klingt schon sehr nach der Theorie von HotSystems.

Na klar,
wie soll es auch ohne einen entsprechenden Sensor und ohne den Aufbau des TO hier auch anders gehen.

Ich weiß ja, dass die Eingänge des Arduino bei langen Kabeln sehr gute Empfänger für Störungen sind.

Ich probiere es morgen nochmal mit einer kürzeren Kabel.

Gibt's die Möglichkeit es so zu programmieren, dass man ohne attachInterrupt(sensorInterrupt, pulseCounter, FALLING); es auch hinkriegt.

Die Idee ist, dass das Servo sich erst dann dreht, wenn 10ml Wasser durch ist.

zur Info: Water Flow Sensor: Model: YF-S201