Vakuumdetektion

Vakuumdetektion

Die Schaltung soll bewirken, dass eine Vakuumpumpe ein- und ausgeschaltet werden kann, was mit einem Taster erfolgt, der als Toggleswitch beschaltet ist. Der eingeschaltete Zustand wird durch eine on board LED (rot) angezeigt. Die Vakuumpumpe wird über ein Relais geschaltet. Das Vakuum soll verwendet werden, um einen Gegenstand anzusaugen, der bis zu 100 g Masse haben kann, wenn ein 6 mm ID Schlauch verwendet wird. Wenn der Gegenstand angesaugt wird, sinkt der Druck, was durch einen Drucksensor festgestellt wird. Aus dem Verhältnis der Messwerte für den angesaugten Zustand und dem offenen System wird ein Schwellwert ermittelt und eine on board LED (grün) eingeschaltet.

  • Drucksensor MPS20N0040D-S (3 mm OD Schlauchanschuss)
  • Vakuumpumpe deltaP -80 kPa, 12 V, 5 bis 6 mm Stutzen
  • Belüftungsventil 12 V (NC)
  • Arduino Nano
  • Relaisbaustein 5 V
  • Taster
  • Breadboard
  • Schläuche (ID 3 mm OD 6mm und ID 6 mm), T Stücke für 4 mm Schlauch, Jumperkabel

Vakuumschema:

Beschaltung:

Hinweis:

Man wird sich vielleicht wundern, dass nicht die volle Messbrücke genutzt wird und kein Differenzverstärker nachgeschaltet ist, aber wohl durch einen Fabrikationsfehler der chinesischen Modelle des Drucksensors bewegen sich beide Spannungswerte der Abgriffe in die gleiche Richtung (bei Vakuum zu niedrigeren Spannungswerten), sodass wir diesen Sensor nur als Detektor betrachten können und nicht als Messvorrichtung.

Programmbeispiel:

/* www.beerlecada.com
 *  Program vacuum detection, toggle switch, relais
 *  Author: Christian Rempel
 *  Licence: one glass red wine, when you meet the author
 *  Date: 22/07/29
  */



#define TPumpe 11 // Taster Pumpe
#define Relais 12 // Pumpenrelais output
#define Pin1 A6 // analog Signal of pressure sensor Pin 1/6
#define greenLED 0 //RXD
#define redLED 1//TXT

float RefPin1 = 0;
float ActPin1 = 0;

bool onoff = true;
bool oldonoff = false;
long toggletimer;

/* Die Pumpe wird an den NO Kontakt des Relais angeschlossen
 *  das Bel¸ftungsventil, das NC sein sollte, wird an den NC Kontakt des Relais angeschlossen
 *  so wird sichergestellt, dass das System bel¸ftet wird, wenn die Pumpe abgeschaltet ist:
 *  die Last f‰llt dann ab
 *  Am Drucksensor werden Pin 1 und Pin 6 verbunden und Pin1 mit A6 verbunden
 *  Pin 2 des Drucksensors wird an 5 V angeschlossen
 *  Pin 5 des Drucksensors wird an Gnd angeschlossen
 */




void setup() {

  //Serial.begin(9600);// wenn Serial.begin aktiviert ist, kann man TXT und RXD nicht mehr verwenden
 
  pinMode(TPumpe, INPUT_PULLUP);
  pinMode(Relais, OUTPUT);
  pinMode(Pin1, INPUT);
  pinMode(greenLED, OUTPUT);
  digitalWrite(greenLED, HIGH); // green LED off
  pinMode(redLED, OUTPUT);
  digitalWrite(redLED, HIGH); // red LED off
  // Die Pumpe wird angeschaltet und das Bel¸ftungsventil geschlossen
  digitalWrite(Relais, HIGH);
  digitalWrite(redLED, LOW);
  delay(2000);
  // Druckreferenz ermitteln, wenn die Last noch nicht angesaugt und das System noch offen ist
  RefPin1 = analogRead(Pin1);

  for ( int i = 0; i < 100; i++) { // gliding avarage
    RefPin1 = 0.99 * RefPin1 + 0.01 * analogRead(Pin1);

  }
  ActPin1 = RefPin1;
  toggletimer = millis();
}
void loop() {
  digitalWrite(redLED, !onoff);
  digitalWrite(Relais, onoff);

  // toggle the pump status with the microswitch
  if (digitalRead(TPumpe) == LOW && onoff != oldonoff) {
    onoff = !onoff;
    // secure that toggling happens only once
    oldonoff = onoff;
    toggletimer = millis();

    Serial.println(onoff);
  }
  // dead time is two seconds
  if (millis() - toggletimer > 2000)
    // after two seconds toggling is allowed again
    oldonoff = !oldonoff;

  // gliding avarage
 
  ActPin1 = 0.9 * ActPin1 + 0.1 * analogRead(Pin1);

  // RefPin1 ist beim offenen (nichtangesaugten) System etwa 512
  // Bei einer Druckdifferenz von -80 kPa (angesaugt) ist ActPin1 etwa 498
  // Das ergibt ein Verhaeltnis 0.973, die Schwelle wird bei 0.985 gesetzt

  float Verhaeltnis = ActPin1 / RefPin1;
  //Serial.println((String)ActPin1 + "     " + (String)ActPin3);
  //Serial.println(Verhaeltnis,3);
  if (Verhaeltnis < 0.985) {
    digitalWrite(greenLED, LOW);
  }
  else {
    digitalWrite(greenLED, HIGH);
  }


}

Zurück