Go Down

Topic: Pumpensteuerung - schalten erst nach zeitablauf (Read 3520 times) previous topic - next topic

petemanzel

Ich hab´s gefunden!
https://www.arduino.cc/en/Tutorial/Calibration

Ich werde das jetzt so mal testen.

Code: [Select]

/*
  Meine Pumpensteuerung
 */

const int druckSensor = A2;
const int pumpenRelais = 8;
bool state = 0;                 
bool lastState = 0;
unsigned long previousMillis = millis();
const int interval = 3000;
const int kalibrieren = 30000;

int maxDruck = 0;
int newDruck = 0;

void problem(void) {
  digitalWrite(pumpenRelais, LOW);
}

void setup() {
 
  Serial.begin(9600);
  pinMode (pumpenRelais, OUTPUT);

  digitalWrite(pumpenRelais, LOW);

while (millis() >= kalibrieren)
  {
    newDruck = analogRead(druckSensor);
   
    Serial.println(maxDruck);

    if(newDruck > maxDruck)
    maxDruck = newDruck;
  }
  digitalWrite(pumpenRelais, HIGH);
}

void loop() {
 
 long sensorSumme=0;

 #define SAMPLES 200
 
  for (int i=0; i<SAMPLES; i++) // Signal mehrmals messen, ca. 20 Millisekunden lang
  {
    sensorSumme+=analogRead(druckSensor);
  }
  int sensorWert = sensorSumme/SAMPLES; // Mittelwert bilden
   Serial.println(sensorWert);
   Serial.println(maxDruck);

  if(sensorWert <= maxDruck - 100) state = 0; // Pumpe AN

  if(millis() - previousMillis >= interval && sensorWert >= maxDruck)
  {
    previousMillis = millis();   
    state = 1; // Pumpe AUS
  }
  if(lastState != state) {
  lastState = state;
   
      switch (state)
      {
      case 0:   // Pumpe Aus
        digitalWrite(pumpenRelais, LOW);
      break;
     
      case 1:   // Pumpe An
        digitalWrite(pumpenRelais, HIGH);
      break;
     
      default:
      problem();
      }
  }
}


Kann man da noch was verbessern?
Der Pete

Serenifly

#16
Jul 04, 2016, 06:06 pm Last Edit: Jul 04, 2016, 06:08 pm by Serenifly
Das ist nie wahr!
Code: [Select]

while (millis() >= kalibrieren)


millis() ist am Anfang 0 ist inkrementiert jede Millisekunde.

<= geht vielleicht. Das println() muss da aber weg. So schnell kannst du nicht auf die serielle Schnittstelle schreiben

michael_x

#17
Jul 04, 2016, 06:13 pm Last Edit: Jul 05, 2016, 08:51 am by michael_x Reason: Serial.print(millis); ist ein blöder Fehler gewesen, sorry
Wenn du es umdrehst:   while (millis() < kalibrieren)
dauert setup 30 sek und sammelt in dieser Zeit das Maximum von    analogRead(druckSensor)

Ich würde aber die Serial.println Ausgaben verringern, indem ich sie höchstens in die maxWert-Erkennung einbaue.

Code: [Select]
if(newDruck > maxDruck) {
      maxDruck = newDruck;
      Serial.print(millis()); Serial.print(" : "); Serial.println(maxDruck);
   }


Das kann allerhöchstens 1023 Zeilen geben ;) und du siehst auch, ob 30s kalibrieren nicht völlig überdimensioniert sind

petemanzel

Wenn du es umdrehst:   while (millis() < kalibrieren)
dauert setup 30 sek und sammelt in dieser Zeit das Maximum von    analogRead(druckSensor)

So hatte ich mir das auch gedacht!

Also: Stecker rein -> Pumpe geht an -> Ermittelt 30 Sek. lang den Maximaldruck -> übergibt den ermittelten maxDruck -> geht über zum Normalbetrieb.

Werde das also jetzt so probieren und mich dann melden und berichten!

Code: [Select]

/*
  Meine Pumpensteuerung
 */

const int druckSensor = A2;
const int pumpenRelais = 8;
bool state = 0;                 
bool lastState = 0;
unsigned long previousMillis = millis();
const int interval = 3000;
const int kalibrieren = 30000;

int maxDruck = 0;
int newDruck = 0;

void problem(void) {
  digitalWrite(pumpenRelais, LOW);
}

void setup() {
 
  Serial.begin(9600);
  pinMode (pumpenRelais, OUTPUT);

  digitalWrite(pumpenRelais, LOW);

while (millis() < kalibrieren)
  {
    newDruck = analogRead(druckSensor);
   
    if(newDruck > maxDruck) {
      maxDruck = newDruck;
      Serial.print(millis); Serial.print(" : "); Serial.println(maxDruck);
   }
  }
  digitalWrite(pumpenRelais, HIGH);
}

void loop() {
 
 long sensorSumme=0;

 #define SAMPLES 200
 
  for (int i=0; i<SAMPLES; i++) // Signal mehrmals messen, ca. 20 Millisekunden lang
  {
    sensorSumme+=analogRead(druckSensor);
  }
  int sensorWert = sensorSumme/SAMPLES; // Mittelwert bilden
   Serial.println(sensorWert);
   Serial.println(maxDruck);

  if(sensorWert <= maxDruck - 100) state = 0; // Pumpe AN

  if(millis() - previousMillis >= interval && sensorWert >= maxDruck)
  {
    previousMillis = millis();   
    state = 1; // Pumpe AUS
  }
  if(lastState != state) {
  lastState = state;
   
      switch (state)
      {
      case 0:   // Pumpe Aus
        digitalWrite(pumpenRelais, LOW);
      break;
     
      case 1:   // Pumpe An
        digitalWrite(pumpenRelais, HIGH);
      break;
     
      default:
      problem();
      }
  }
}
Der Pete

petemanzel

Bekomme jetzt diese Fehlermeldung:

mioPressControlIntervall.ino: In function 'void setup()':
mioPressControlIntervall:33: error: call of overloaded 'print(long unsigned int (&)())' is ambiguous

Hab die serielle Ausgabe in "setup" jetzt erstmal Auskommentiert.

Setup scheint yu funktionieren.

Die Pumpe geht jetzt aber nicht an bei maxDruck -(minus) 100.
Der Pete

Serenifly

Code: [Select]

Serial.print(millis());

Die Klammern fehlen. Ohne Klammer ist es die Adresse der Funktion und die müsste man auf int casten damit man sie drucken kann. Für die reine Adresse meckert der Compiler völlig korrekt an dass eine entsprechende Funktion fehlt, die als Parameter eine Funktion hat die unsigned long zurück gibt und keine Parameter hat.

petemanzel

Danke Serenifly!

Warum geht die Pumpe jetzt aber nicht an bei unterschreiten von (maxDruck - 100)?
Der Pete

agmue

Versuche mal zum Testen:
Code: [Select]
const int interval = 0;Du verwendest Hysterese, Zeitverzögerung und Flanke, da könnte sich was behindern. Nur so eine Idee.
Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

petemanzel

Hallo agmue,

danke aber leider erfolglos!

Vielleicht hilft es wenn ich erkläre was da passieren soll.

Der Einschaltpunkt soll (maxDruck - 100).

Wenn dann die Pumpe also an ist und der Druck über 3 Sek. (interval = 3000) stabil bei maxDruck liegt, dann erst soll die Pumpe wieder aus gehen.

Der Pete

ElEspanol

Mich würde sowas auch interessieren. Was für ein Sensor verwendest du?

petemanzel

Hallo ElEspanol.

Ich verwende diesen hier:

http://www.ebay.it/itm/G1-4-inch-5V-0-1-2-MPa-Pressure-Transducer-Sensor-Oil-Fuel-Diesel-Gas-Water-Air-/172243023623?hash=item281a7bf707:g:iWkAAOSw3YNXYh4V
Der Pete

ElEspanol

von dem gingen bei mir schon 4 Stück kaputt. brächten nur noch wirre Werte.

SkobyMobil

Hallo,
warum nimmst Du nicht einfach zwei Drucksensoren- und läßt sie in einem
Fensterdiskriminator laufen?
Meiner Meinung nach würde es die Sache auch "sicherer" machen.
Nur mal so…
Gruß und Spaß
Andreas
die zweite Maus bekommt den Speck...

petemanzel

Hallo Andreas.

Ich hatte als nächstes an eine Wasserflusssensor gedacht. Mit dem könnte ich dann auch die Pumpe vor Trockenlauf schützen.

Hat niemand eine Idee wieso die Pumpe nicht wieder anspringt?

Danke!
Der Pete

qualidat

Der grundlegende Fehler ist deine Mittelwertbildung, glaub es doch endlich. Es bringt Nichts, wenn man in einer Schleife, die in 20ms "durch" ist, die Werte einsammelt und mittelt - dann hast du einen Mittelwert über die 20ms - das ist viel zu schnell und folgt damit immer noch den Sprüngen des Sensorsignales ziemlich direkt.

Mein Vorschlag sah vor, jeweils einen Teil des Mittelwertes bei jedem Haupt-Loop dazuzuholen, deshalb dieses "Schieberegister" (siehe meinen Beitrag oben). Wenn also der gesamte Loop mit einem Delay von z.B. 20ms versehen ist, werden nicht in 20ms alle Messwerte gemittelt, sondern alle 20ms kommt ein Teil dazu, DAS ist der entscheidende Unterschied.

Würde man diesen Puffer z.B. 500 Variablen groß machen, dann hättest du einen Mittelwert über eine Sekunde ...

Go Up