Vakuumpumpensteuerung mit Arduino

Salü,

ich habe mal angefangen eine Steuerung für eine Vakuumpumpe zu bauen.
Das Ganze will ich mit einem Arduino Board realisieren.
Für alle die der Meinung sind das wäre Overkill, später soll noch eine Heizlampensteuerung dazukommen und alles Mögliche was sonst noch so gebraucht wird um GFK/ CFK anständig zu bearbeiten (Temperofen, Harzmengen Rechner ...).

Kennt jemand eine vergleichbare Steuerung, die schon erfolgreich in Betrieb ist?

have fun!

Heiko
 
Hallo,

eine Temperofen Steuerung auf Arduino Basis hat bei und im Verein schon mal einer für ein anderes Mitglied gebaut.
Man kann verschiedene Zeiträume und Temperaturen für die entsprechenden Zeiträume mittels Tastern und 2 Zeilen Display einstellen.

Gesteuert wird alles über einen kleinen Arduino, einem Display Temp Fühler u.s.w.

Bei Interesse kann ich eventuell genaueres in Erfahrung bringen.

VG
Gunnar
 
soderla, ich habe ein wenig rumgespielt und damit gehts schon ganz gut.

Was funktioniert:

Druckmessung mittels I2C Sensor
Debugausgabe auf der seriellen Konsole
Pumpe (ein/aus)schalten

Was ist als nächstes geplant:
Min/Max Werte über Tasten verändern
Werte auf einem I2C LCDisplay (20x4) ausgeben



Code:
#include<Wire.h>
#define sensor 0x78 //Unique bus address

float minPressure = 850;
float maxPressure = 915;
float pressure = 0;
enum PumpStates {
  Off, On
};

enum PumpStates state = On;
int PumpPin = 7 ;



void setup()
{ 
  Wire.begin();//Wakes up I2C bus 
  Serial.begin(9600);
  pinMode(PumpPin, OUTPUT);      // Setzt den PumpPin (Pin 7) als Ausgang
}


void getdata(byte *a)
{
  //Move register pointer back to first register
  //Wire.beginTransmission(sensor);
  //Wire.write(1);
  //Wire.endTransmission();
  Wire.requestFrom(sensor,1);//Sends content of first two registers
  *a = Wire.read(); //first byte recieved stored here
  
}

void getpressure()
{
  byte aa;
  getdata(&aa);
 
  // float sensitive = 0.064;
  /*  aa = Wert 1 vom Sensor   
   *  OUT max = 128    
   *  OUT min =   0
   *  P max   =  1000 mBar
   *  P min   = -1000 mBar
   *      
   *      OUT max - OUT min
   * S = ------------------
   *      P max  - P min
   * 
   *      (aa) - P min
   * P = -----------------   +  P min
   *           S
   */
   pressure =  aa / 0.064  - 1000 ;
  
 Serial.print("byte 1: ");Serial.println(aa);

 
}

void loop()
{
  getpressure();
  
  if ((state == On) && (-pressure > maxPressure))
    state = Off;
  
  if ((state == Off) && (-pressure < minPressure))
    state = On;  
 

  
Serial.print("Pressure: ");Serial.print(pressure);Serial.println(" mBar");
Serial.print("Pump: ");Serial.println(state);

digitalWrite(PumpPin, state);

    delay(1000);
}


have fun!

Heiko
 
wie bist Du denn voran gekommen?

Momentan bleibt meine Pumpe ab und zu stecken, sprich sie schafft es nicht gegen den Unterdruck anzulaufen. Wenn ich dann etwas Unterdruck ablasse, dreht sie wieder.
Kennt jemand das Problem und hat eine Lösung dafür?

Ich habe mir überlegt in der Saugleitung ein Rückschlagventil einzubauen und kurz vor der Pumpe ein Belüftungsventil.

Der Drucksensor ist natürlich immer im Vakuum.
 

M. Roy

User
Hallo Heiko, hallo Stefan,

erst mal großen Respekt was eure Arduino Fähigkeiten angeht!

Da ich meine Vakuumpumpe gerne auch geregelt betreiben möchte bin ich von euren beider Projekten sehr angetan. Nur mit dem kleinen Problem, dass ich keinen Schimmer von Arduino habe (noch nicht;)).

Wenn es bei euren Programmen Updates gibt, dann gerne hier rein Posten, mich würde das sehr interessieren.

Viele Grüße
Markus
 
Was soll ich sagen, es funktioniert gut. Rückschlagventil ist gut, gibts von festo.

Für arduino gibt es massig tutorials. Einfach mal anfangen, wirst sehen Mann kommt schnell rein.

Gruß

Stefan
 
@ Markus: so kompliziert ist es auch ned. Wenn Du die Logik vom Messen/Steuern/Regeln halbwegs verstanden hast, ist mehr eine Fleißaufgabe.

Spannend wird es bei größeren Sachen, das ganze dann Speicher bzw. Prozessoptimiert zu schreiben und alle Eventualitäten abzufangen. ... Aber ich will ja kein Kernkraftwerk damit betreiben ;-).

@ Stefan, ich bin mittlerweile dazu übergegangen ein 3/2 Wege Ventil einzubauen.

Den Code werde ich morgen soweit haben das 4 Taster, ein LC Display, ein Sensor und das Pumpenrelais funktionieren.

Dieses bauen von Schaltungen hält ganz schön auf.

have fun!

Heiko
 

M. Roy

User
Hallo Heiko,

THX fuer die ermutigende Worte!

Gestern kam mein Arduino Kit und ein Nexion Touch Screen. Mit den Tutorials wird hoffentlich das gelernte aus der Programmiervorlesung wieder reaktiviert.

Möchte das dann gleich mit nem Touch Screen hin bekommen, wenn dann gleich richtig Uebernehmen 😉.

Grüße
Markus
 
soderla, schaut schonmal ned so schlecht aus.

was geht:

Vakuumsensor auslesen und "human readable Wert" berechnen.
eingestelltes Vakuum halten und die Pumpe automatisch ein und ausschalten.
Anzeige an einem 16 x 2 LC Display.

über Taster:
- 1 Taster --- Unterdruck erhöhen
- 2 Taster --- Unterdruck verringern
- 3 Taster --- Bypass, Pumpe anschalten

Beschaltung:

(Arduino Micro / Leonardo )
Taster digital PIN 4, 5, 6, 7
I2C digital PIN 2, 3 ( SCA, SCL)
I2C Display als Adr 0x20
I2C Sensor als Adr 0x78
Pumpenrelais an digitalPin 11


Code:
/*
 * Vacuumcontrol 
 * sketch for Arduino Micro / Leonardo
 * 
 * don't use it for your Atomic Powerplant or SpaceStation
 * 
 * Sensor: B&B I2C vacuumsensor ( 0x78 )
 * Display: 16x2 LC Display ( 0x20 )
 * Pushbuttons direct connected to digital Pin 5, 6, 7
 * one Pushbutton for further use ( digital Pin 4 )
 * 
 * 
 */

#include <Bounce2.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x20, 16, 2);
#define sensor 0x78

int PumpenPin = 11; // Pump connected to digital pin 11
int ValvPin = 10; // 3/2 way valve connected to digital pin 10

byte PumpenBypass = 0;
byte setDisplay = 0;
byte aa;
int WantPressure = 300;
int maxPumpPressure = 915;
int minPressure = 0 ;
int Hysteresis = 30 ;
int ActPressure = 0 ;
int ButtonDelay = 100 ;

int Button1 = 4;   // pushbutton connected to digital pin 4
int Button2 = 5;   // pushbutton connected to digital pin 5
int Button3 = 6;   // pushbutton connected to digital pin 6
int Button4 = 7;   // pushbutton connected to digital pin 7

enum PumpStates {
  Off, On
};
enum PumpStates state = On;


Bounce debouncer1 = Bounce();
Bounce debouncer2 = Bounce();
Bounce debouncer3 = Bounce();

/*
 * get data from the I2C pressure Sensor
 */
void getdata(byte *a)
{
 
  Wire.requestFrom(sensor,1); //Sends content of first registers
  *a = Wire.read(); //first byte recieved stored here
 
}

void getpressure()
{
  /*  aa = Value 1 from Sensor
   * 
   * for these values look at the sensor datasheet
   *  OUT_max = 128    
   *  OUT_min =   0
   *  P_max   =  1000 mBar
   *  P_min   = -1000 mBar
   * 
   * for the calculation look at the sensor datasheet     
   *      OUT_max - OUT_min
   * S = -------------------  = 0.064
   *      P_max  - P_min
   * 
   *              (aa) - P_min
   * Pressure = -----------------   +  P min
   *                   S
   */
   getdata(&aa);
   ActPressure =  aa / 0.064  - 1000 ;
}


/*
 *
 */


void setup()
{ 
  
  lcd.init(); 
  lcd.backlight();

  lcd.setCursor(0, 0);
  lcd.print("Vakuumsteuerung ");
  lcd.setCursor(0, 1);
  lcd.print("Vers 1.01, init");
    
  Serial.begin(9600);
  pinMode(PumpenPin, OUTPUT);// sets the digital pin 13 as output
  pinMode(Button1, INPUT_PULLUP);     // sets the digital pin 4 as input
  pinMode(Button2, INPUT_PULLUP);     // sets the digital pin 5 as input
  pinMode(Button3, INPUT_PULLUP);     // sets the digital pin 6 as input
  pinMode(Button4, INPUT_PULLUP);     // sets the digital pin 7 as input
 
  debouncer1.attach(Button4);
  debouncer1.interval(10);  // interval in ms

  debouncer2.attach(Button3);
  debouncer2.interval(10);   // interval in ms

  debouncer3.attach(Button2);
  debouncer3.interval(10);   // interval in ms

 delay(1000);
 lcd.clear();
  
}

void loop()
{
 // Update the Bounce instances :
  debouncer1.update();
  debouncer2.update();
  debouncer3.update();

  // Get the updated value :
  int value1 = debouncer1.read();
  int value2 = debouncer2.read();
  int value3 = debouncer3.read();

  if (value1 == 0)
  {
    if (WantPressure < maxPumpPressure) {
         WantPressure = WantPressure + 10;
     }
   delay(ButtonDelay);
  }
  if (value2 == 0)
  {
    if (WantPressure > 0 ) {
         WantPressure = WantPressure - 10;
          }
   delay(ButtonDelay);
  }

  if (value3 == 0)
  {    
   PumpenBypass=1;
   } else {
   PumpenBypass=0;
    }


//// begin write to Display 

    lcd.setCursor(0, 0);
    lcd.print("Soll: ");

    lcd.setCursor(0, 1);
    lcd.print("Ist: ");
 
  lcd.setCursor(14, 0);
       lcd.print(state);

  lcd.setCursor(5, 0);     
       lcd.print("   ");   // clear Display at Row 0 Colum 5 
  lcd.setCursor(5, 0);     
       lcd.print(WantPressure);
       
  lcd.setCursor(5, 1);     // clear Display at Row 1 Colum 5 
       lcd.print("   ");     
  lcd.setCursor(5, 1);     
       lcd.print(-ActPressure);
//// end write to Display 

       
//// Begin Hysteresis for Pump

  getpressure();

  minPressure=WantPressure-Hysteresis;
  
  if ((state == On) && (-ActPressure > maxPumpPressure)  || (state == On) && ( -ActPressure >  ( WantPressure + 10 ) ))
    state = Off;
  
  if ((state == Off) && (-ActPressure < minPressure) || (state == Off) && ( PumpenBypass == 1 ))
    state = On;
//// End Hysteresis for Pump

 digitalWrite(PumpenPin, state); 

 //////begin only for debug needed /////
 // Serial.print("Wanted Pressure: ");Serial.println(WantPressure);
 // Serial.print("Act Pressure: ");Serial.println(-ActPressure);
 // Serial.print("max Pump Pressure: ");Serial.println(maxPumpPressure);
 // Serial.print("min Pressure: ");Serial.println(minPressure);
 ///////end only for debug needed ////

}
 
die bounce Funktion soll die Taster entprellen, das funktioniert naja... ich denke morgen werde ich Taster Hardwareseitig entprellen.

Der Bypass ist gedacht, das Du per Tastendruck die Pumpe einschalten kannst egal welche Vacuum ansteht.

Was mir vorhin beim spielen aufgefallen ist, eine Taste um die Pumpe abzuschalten wäre noch ganz nett.

Das werde ich mit einem software topgle switch, realisieren. Taste drücken Pumpe an, nochmal drücken Pumpe aus...
 
Habs noch ein wenig verschönert und erweitert, das Prellproblem habe doch Softwareseitig gelöst.

alt:
int value2 = debouncer2.read();
neu:
int value2 = debouncer2.fell();

Das Drücken des Schalters ist wichtig, ned das er auch losgelassen wurde. Somit wird nur einmal der Wert gelesen und nicht jeweils beim drücken und loslassen einmal gezählt. Deswegen konnten auch die delays verschwinden.
Bsp:
---snip---
int ButtonDelay = 100 ;
---snap---snip---
if (value2 == 0)
{
if (WantPressure > 0 ) {
WantPressure = WantPressure - 10;
}
delay(ButtonDelay);
}
---snap---

was geht:

Vakuumsensor auslesen und "human readable Wert" berechnen.
Eingestelltes Vakuum halten und die Pumpe automatisch ein und ausschalten.
Anzeige an einem 16 x 2 LC Display.

über Taster:
- 1 Taster --- Unterdruck erhöhen
- 2 Taster --- Unterdruck verringern
- 3 Taster --- Bypass, Pumpe anschalten
- 4 Taster --- Cutoff, Pumpe abschalten

Beschaltung:

(Arduino Micro / Leonardo )
Taster digital PIN 4, 5, 6, 7
I2C digital PIN 2, 3 ( SCA, SCL)
I2C Display als Adr 0x20
I2C Sensor als Adr 0x78
Pumpenrelais an digitalPin 11


Code:
/*
 * Vacuumcontrol 
 *
* ----------------------------------------------------------------------------
* "THE BEER-WARE LICENSE" (Revision 42):
* <heiko.weber@gmx.net> wrote this file. As long as you retain this notice you
* can do whatever you want with this stuff. If we meet some day, and you think
* this stuff is worth it, you can buy me a beer in return. Heiko Weber
* ----------------------------------------------------------------------------
* https://en.wikipedia.org/wiki/Beerware
* https://de.wikipedia.org/wiki/Beerware
* 
 * 
 * sketch for Arduino Micro / Leonardo
 * 
 * don't use it for your Atomic Powerplant or SpaceStation
 * 
 * Sensor: B&B I2C vacuumsensor ( 0x78 )
 * Display: 16x2 LC Display ( 0x20 )
 * Pushbuttons direct connected to digital Pin 5, 6, 7
 * one Pushbutton for further use ( digital Pin 4 )
 *    
  * #######################################################  
   * aa = Value 1 from Sensor    
   * 
   * for these values look at the sensor datasheet
   *  OUT_max = 128    
   *  OUT_min =   0
   *  P_max   =  1000 mBar
   *  P_min   = -1000 mBar
   * 
   * for the calculation look at the sensor datasheet     
   *      OUT_max - OUT_min
   * S = -------------------  = 0.064
   *      P_max  - P_min
   * 
   *              (aa) - P_min
   * Pressure = -----------------   +  P min
   *                   S
  * #######################################################
 * 
 */

#include <Bounce2.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x20, 16, 2);
#define sensor 0x78

int PumpenPin = 11; // Pump connected to digital pin 11
int ValvePin = 10; // 3/2 way valve connected to digital pin 10

byte PumpenBypass = 0;
byte PumpStop = 0;
byte setDisplay = 0;
byte aa;
int WantPressure = 300;
int maxPumpPressure = 910;
int minPressure = 0 ;
int Hysteresis = 30 ;
int ActPressure = 0 ;
int ButtonDebounce = 2 ;  // interval in ms

int Button1 = 4;   // pushbutton connected to digital pin 4
int Button2 = 5;   // pushbutton connected to digital pin 5
int Button3 = 6;   // pushbutton connected to digital pin 6
int Button4 = 7;   // pushbutton connected to digital pin 7

enum PumpStates {
  Off, On
};
enum PumpStates state = On;

// debounce Buttons from software side
Bounce debouncer1 = Bounce();
Bounce debouncer2 = Bounce();
Bounce debouncer3 = Bounce();
Bounce debouncer4 = Bounce();

// get data from the I2C pressure Sensor
void getdata(byte *a)
{
  Wire.requestFrom(sensor,1); //Sends content of first registers
  *a = Wire.read(); //first byte recieved stored here
}

// Calculate the value given from the sensor to human readable ( mBar )
void getpressure()
{
  getdata(&aa);
  
  ActPressure =  aa / 0.064  - 1000 ;
 // if you don't have a sensor, give some valid ( 0 upto -1000) value here uncomment the following
 // ActPressure = -310;
}

// Setup routine place everything you want to do once at startup

void setup()
{ 
  lcd.init(); 
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("Vakuumsteuerung ");
  lcd.setCursor(0, 1);
  lcd.print("Vers 1.02, init");
  
  pinMode(PumpenPin, OUTPUT);         // sets the digital pin 11 as output
  pinMode(ValvePin, OUTPUT);          // sets the digital pin 10 as output
  pinMode(Button1, INPUT_PULLUP);     // sets the digital pin 4 as input
  pinMode(Button2, INPUT_PULLUP);     // sets the digital pin 5 as input
  pinMode(Button3, INPUT_PULLUP);     // sets the digital pin 6 as input
  pinMode(Button4, INPUT_PULLUP);     // sets the digital pin 7 as input
 
  debouncer1.attach(Button4);
  debouncer1.interval(ButtonDebounce);  // interval in ms

  debouncer2.attach(Button3);
  debouncer2.interval(ButtonDebounce);   // interval in ms

  debouncer3.attach(Button2);
  debouncer3.interval(ButtonDebounce);   // interval in ms
  
  debouncer4.attach(Button1);
  debouncer4.interval(ButtonDebounce);   // interval in ms

 delay(1000);
 lcd.clear();
}

void loop()
{
// Update the Bounce instances 
  debouncer1.update();
  debouncer2.update();
  debouncer3.update();
  debouncer4.update();

// Get the updated value when button is pressed
  int value1 = debouncer1.fell();
  int value2 = debouncer2.fell();
  int value3 = debouncer3.read();
  int value4 = debouncer4.read();
  
// do something with the button value1
  if (value1 == 0)
  {
    if (WantPressure < maxPumpPressure) {
         WantPressure = WantPressure + 10;
     }
  }
// do something with the button value2 
  if (value2 == 0)
  {
    if (WantPressure > 0 ) {
         WantPressure = WantPressure - 10;
     }
  }
// do something with the button value3
  if (value3 == 0)
  {    
   PumpenBypass=1;
   } else {
   PumpenBypass=0;
    }
// do something with the button value4
  if (value4 == 0)
  {    
   PumpStop=1;
   } else {
   PumpStop=0;
    }

//// begin write to Display 
  lcd.setCursor(0, 0);
    lcd.print("Soll: ");
  lcd.setCursor(6, 0);     
    lcd.print("   ");   // clear Display at Row 0 Colum 5 
  lcd.setCursor(6, 0);     
    lcd.print(WantPressure);
    
  lcd.setCursor(0, 1);
    lcd.print("Ist: ");
  lcd.setCursor(6, 1);     // clear Display at Row 1 Colum 5 
    lcd.print("   ");     
  lcd.setCursor(6, 1);     
    lcd.print(-ActPressure);
//// end write to Display 
       
//// Begin Hysteresis for Pump

  getpressure();

  minPressure=WantPressure-Hysteresis;
  
  if ( (state == On) && (-ActPressure > maxPumpPressure) || (state == On) && ( -ActPressure >  ( WantPressure + 10 ))  )
    state = Off;
  
  if ( (state == Off) && (-ActPressure < minPressure) || (state == Off) && ( PumpenBypass == 1 ))
    state = On;

  if ((state == On) && ( PumpStop == 1 ))  
    state = Off;

     
//// End Hysteresis for Pump

digitalWrite(PumpenPin, state);

/* whenever I got my 2/3 way valve delivered
 *  digitalWrite(ValvePin, state );
 */

/* for debugging enable serial output, just uncomment the *
//////begin only for debug needed /////
   * Serial.begin(9600);
   * Serial.print("Wanted Pressure: ");Serial.println(WantPressure);
   * Serial.print("Act Pressure: ");Serial.println(-ActPressure);
   * Serial.print("max Pump Pressure: ");Serial.println(maxPumpPressure);
   * Serial.print("min Pressure: ");Serial.println(minPressure);
 ///////end only for debug needed ////
 */
}
 

stefan1

User
Hallo Heiko,

wäre toll, wenn du ein paar Bilder hättest und für Nachbauwillige noch ne Stückliste....

Gruß Stefan
 
Servus Stefan,

Bilder von dem jetzigen wilden Aufbau, oh weh,nicht das jemand auf die Idee kommt, dann so alles zu betreiben ;-).
Vacuumpumpe_fliegend.jpeg


Es liegen an manchen Bauteilen 230 V an, da sollte man schon wissen wo hingelangt werden kann.

Die Stückliste, wobei ja vieles Geschmackssache ist, Taster oder Drehgeber, Display mit 20 x 4 oder weniger, 7 Segmentanzeige ...


1. Arduino Micro, Leonardo, Micro Pro
2. LC Display HD ( 44780 oder vergleichbares )
3. PCF 8574 ( I2C Bus, Baustein für 8 digitale IO (Ein / Ausgänge ), um das Display über den I2C Bus zu treiben
4. 4 Taster, was gefällt ( 5 Volt werden geschalten, also nichts wildes )
5. Vakuumsensor ( Art. Nr.: SHOP DRTR-I2C-RV1 Drucktransmitter Edelstahl G1/4" -1-1 bar relativ I2C )
^^ da gehen auch Andere, was gefällt ( Die Berechnung muss angepasst werden )
6. Ein einfaches Relais, für die ersten Tests habe ich ein Arduino Shield verwendet( hat den Vorteil, das keine Schaltung drumherum erfunden werden muss ). Vorsicht hier wird mit 230 V DC gearbeitet, das kann echt gefährlich werden. Im nächsten Schritt tausche ich das einfache Relais gegen ein Solid State Lastrelais aus. Ich erhoffe mir dadurch weniger Verschleiß (im Relais) beim Schalten( Stichwort: schalten im Nulldurchgang ).

7. Europlatine, Kabel, 330 Ohm Widerstände, Stecker
8. eine Pumpe, Pneumatikschläuche, Fittinge usw.


Also die nächste Modifikation wird ein Drehgeber ( Rotary Switch ) sein.

Ich hatte mir die ganze Zeit den Kopf zerbrochen, wie ich den Vacuum Startwert, veränderbar speichern kann.
Mich nervt es das ich zu beginn, auf den Tasten rumdrücken muss um den ersten Wert einzustellen. Dann dachte ich mir einen Startwert von -300 mBar als default ist toll... Falls der aber ned passt, muss ich wieder viel rumdrücken.
Schreiben im EEPROM entfällt, da er nur 100.000 Schreibzyklen aushält :-(.

Dann kam mir die Idee, wieso nicht einen Drehgeber zum Einstellen des Vorgabewertes nehmen. Das lässt sich viel besser handhaben, als dieses blöde Tasten drücken. Drehen fertig,

Wer kann denn Platinen ätzen und Layouts entwerfen, da wäre noch viel Potential zum verbessern vorhanden.

Hier mal der aktuelle Code, es sind nur kleine Dinge behoben, Drehgeber kommt später.

Code:
/*
 * Vacuumcontrol ( Build 28. Nov 2016, 16:35 )
 *
* ----------------------------------------------------------------------------
* "THE BEER-WARE LICENSE" (Revision 42):
* <heiko.weber@gmx.net> wrote this file. As long as you retain this notice you
* can do whatever you want with this stuff. If we meet some day, and you think
* this stuff is worth it, you can buy me a beer in return. Heiko Weber
* ----------------------------------------------------------------------------
* https://en.wikipedia.org/wiki/Beerware
* https://de.wikipedia.org/wiki/Beerware
* 
 * 
 * sketch for Arduino Micro / Leonardo
 * 
 * don't use it for your Atomic Powerplant or SpaceStation
 * 
 * Sensor: B&B I2C vacuumsensor ( 0x78 )
 * Display: 16x2 LC Display ( 0x20 )
 * Pushbuttons direct connected to digital Pin 5, 6, 7
 * one Pushbutton for further use ( digital Pin 4 )
 *    
  * #######################################################  
   * aa = Value 1 from Sensor    
   * 
   * for these values look at the sensor datasheet
   *  OUT_max = 128    
   *  OUT_min =   0
   *  P_max   =  1000 mBar
   *  P_min   = -1000 mBar
   * 
   * for the calculation look at the sensor datasheet     
   *      OUT_max - OUT_min
   * S = -------------------  = 0.064
   *      P_max  - P_min
   * 
   *              (aa) - P_min
   * Pressure = -----------------   +  P min
   *                   S
  * #######################################################
 * 
 */

#include <Bounce2.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x20, 16, 2);
#define sensor 0x78

int PumpenPin = 11; // Pump connected to digital pin 11
int ValvePin = 10; // 3/2 way valve connected to digital pin 10

byte PumpenBypass = 0;
byte PumpStop = 0;
byte setDisplay = 0;
byte aa;
int WantPressure = 300;
int maxPumpPressure = 910;
int minPressure = 0 ;
int Hysteresis = 30 ;
int ActPressure = 0 ;
int ButtonDebounce = 2 ;  // interval in ms
int counter = 200 ;       // clear the display every 200 loops

int Button1 = 4;   // pushbutton connected to digital pin 4
int Button2 = 5;   // pushbutton connected to digital pin 5
int Button3 = 6;   // pushbutton connected to digital pin 6
int Button4 = 7;   // pushbutton connected to digital pin 7

enum PumpStates {
  Off, On
};
enum PumpStates state = On;

// debounce Buttons from software side
Bounce debouncer1 = Bounce();
Bounce debouncer2 = Bounce();
Bounce debouncer3 = Bounce();
Bounce debouncer4 = Bounce();

// get data from the I2C pressure Sensor
void getdata(byte *a)
{
  Wire.requestFrom(sensor,1); //Sends content of first registers
  *a = Wire.read(); //first byte recieved stored here
}

// Calculate the value given from the sensor to human readable ( mBar )
void getpressure()
{
  getdata(&aa);
  
  ActPressure =  aa / 0.064  - 1000 ;
 // if you don't have a sensor, give some valid ( 0 upto -1000) value here uncomment the following
 // ActPressure = -310;
}

// Setup routine place everything you want to do once at startup

void setup()
{ 
// initialize the I2C us  
  Wire.begin();
  
  lcd.init(); 
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("Vakuumsteuerung ");
  lcd.setCursor(0, 1);
  lcd.print("Vers 1.02b, init");
  
  pinMode(PumpenPin, OUTPUT);         // sets the digital pin 11 as output
  pinMode(ValvePin, OUTPUT);          // sets the digital pin 10 as output
  pinMode(Button1, INPUT_PULLUP);     // sets the digital pin 4 as input
  pinMode(Button2, INPUT_PULLUP);     // sets the digital pin 5 as input
  pinMode(Button3, INPUT_PULLUP);     // sets the digital pin 6 as input
  pinMode(Button4, INPUT_PULLUP);     // sets the digital pin 7 as input
 
  debouncer1.attach(Button4);
  debouncer1.interval(ButtonDebounce);  // interval in ms

  debouncer2.attach(Button3);
  debouncer2.interval(ButtonDebounce);   // interval in ms

  debouncer3.attach(Button2);
  debouncer3.interval(ButtonDebounce);   // interval in ms
  
  debouncer4.attach(Button1);
  debouncer4.interval(ButtonDebounce);   // interval in ms

 delay(1000);
 lcd.clear();
}

void loop()
{
// Update the Bounce instances 
  debouncer1.update();
  debouncer2.update();
  debouncer3.update();
  debouncer4.update();

// Get the updated value when button is pressed
  int value1 = debouncer1.fell();
  int value2 = debouncer2.fell();
  int value3 = debouncer3.read();
  int value4 = debouncer4.read();
  
// do something with the button value1
  if (value1 == 0)
  {
    if (WantPressure < maxPumpPressure) {
         WantPressure = WantPressure + 10;
     }
  }
// do something with the button value2 
  if (value2 == 0)
  {
    if (WantPressure > 0 ) {
         WantPressure = WantPressure - 10;
     }
  }
// do something with the button value3
  if (value3 == 0)
  {    
   PumpenBypass=1;
  } else {
   PumpenBypass=0;
         }
// do something with the button value4
  if (value4 == 0)
  {    
   PumpStop=1;
  } else {
   PumpStop=0;
         }

//// begin write to Display 

if ( counter == 200 ){
     lcd.setCursor(0, 0);
       lcd.print("Soll: ");
     lcd.setCursor(6, 0);     
       lcd.print("   ");       // clear Display at Row 0 Colum 5 
    
     lcd.setCursor(0, 1);
       lcd.print("Ist: ");
     lcd.setCursor(6, 1);     // clear Display at Row 1 Colum 5 
       lcd.print("   ");     
       counter = 0 ;
  }

  lcd.setCursor(6, 0);     
    lcd.print(WantPressure);
  lcd.setCursor(6, 1);    
    lcd.print(-ActPressure);
    
//// end write to Display 
       
//// Begin Hysteresis for Pump

  getpressure();

  minPressure=WantPressure-Hysteresis;
  
  if ( (state == On) && (-ActPressure > maxPumpPressure) || (state == On) && ( -ActPressure >  ( WantPressure + 10 ))  )
    state = Off;
  
  if ( (state == Off) && (-ActPressure < minPressure) || (state == Off) && ( PumpenBypass == 1 ))
    state = On;

  if ((state == On) && ( PumpStop == 1 ))  
    state = Off;

//// End Hysteresis for Pump

digitalWrite(PumpenPin, state);

counter = counter + 1 ;

/* whenever I got my 2/3 way valve delivered
 *  digitalWrite(ValvePin, state );
 */

/* for debugging enable serial output, just uncomment the *
//////begin only for debug needed /////
   * Serial.begin(9600);
   * Serial.print ("Counter");Serial.println(counter);
   * Serial.print("Wanted Pressure: ");Serial.println(WantPressure);
   * Serial.print("Act Pressure: ");Serial.println(-ActPressure);
   * Serial.print("max Pump Pressure: ");Serial.println(maxPumpPressure);
   * Serial.print("min Pressure: ");Serial.println(minPressure);
 ///////end only for debug needed ////
 */
}
 

stefan1

User
soooo wild sieht das auch nicht aus, habe ich schon schlimmer gesehen. Schaltplan wäre auch nicht schlecht.....

Stefan


P.S.: Habe ich das richtig, das der Drucksensor beim blauen Klaus fast hundert Euro kostet?
 
P.S.: Habe ich das richtig, das der Drucksensor beim blauen Klaus fast hundert Euro kostet?


ja, den gibt es im Netz für ~72 €, es gehen aber auch Andere, da muss nur die Berechnung angepasst werden.
Der Sensor liefert einen Wert von 0 bis 128, damit ist das Spektrum -1000 mBar bis +1000 mBar abgedeckt.
Das musst Du dann umrechnen:

* aa = Value 1 from Sensor
*
* for these values look at the sensor datasheet
*
* OUT_max = 128
* OUT_min = 0
* P_max = 1000 mBar
* P_min = -1000 mBar
*
* for the calculation look at the sensor datasheet
*
* OUT_max - OUT_min
* S = ------------------- = 0.064
* P_max - P_min
*
* (aa) - P_min
* Pressure = ----------------- + P min
* S
Mir hat der gefallen, zwecks I2C, Gewinde und Edelstahl.

Schaltpläne, puh jetzt wird es kompliziert:

Den PCF8574 passend mit dem Display verdrahten. ( da musste am besten googeln, sind auf jedenfall 12 Drähte ;-))

*** PCF8574 Pin1-3 = I2C Adr. Pin (alle auf Ground = 0x20 ) also meistens zumindest, hängt von der Version ab.
*** Pin 4,5,6,9,10,11,12 an das Display (das hängt aber von der Arduino Library ab.) kann auch anders sein.
*** https://www.mikrocontroller.net/articles/Port-Expander_PCF8574
*** http://www.learningaboutelectronics.com/images/Arduino-HD44780-circuit-schematic.png

Den PCF8574 mit seinen I2C ( SCA / SCL ) Pins an den Arduino anstecken, Strom ned vergessen VCC (+5V) und Ground
Den Sensor auch mit I2C am Arduino verbinden, Strom ned vergessen VCC (+5V) und Ground
Evtl. jeweils ein Pullup zwischen VCC und SCA , VCC und SCL
Die Taster (eine Seite) an die Eingänge (digital Pin 4-7 ) vom Arduino klöppeln, die andere Seite an Ground
Das Relais an VCC, Ground und Pin 11

Das war es eigentlich schon, ich male das mal wenn ich Muße dazu habe.
 
Ansicht hell / dunkel umschalten
Oben Unten