Arduino Code für Anlage

Hallo Zusammen,

ich möchte gerne ein Überdruck und Unterdruck erzeugen mit einer minipumpe. Für die Schaltung habe ich zwei 3/2wegeventil (eklektrisch) und für die Messung von Druck ein analoger drucksensor. Auf dem Arduino habe ich relais modul angebracht, jede relais steht für ventil, motor und meldeleuchte. Meine Frage ist, ob der Code die ich erstellt habe, richtig ist? oder ob das nicht Arduino sprache ist. Habe wenig erfahrung mit Arduino.

#include "SmartDelay.h"

SmartDelay::SmartDelay(unsigned long tick) {
 smMicros = tick;
 state    = SMART_DELAY_START;
}

int SmartDelay::Now() {
 unsigned long mcs = micros();
 
// Важно помнить про переполнение целого!
 
if (mcs - smLast < smMicros)
   return false;

 smLast = mcs;
 return (state == SMART_DELAY_START);
}

unsigned long SmartDelay::Get() const {
 return smMicros;
}

unsigned long SmartDelay::Set(unsigned long tick) {
 unsigned long old = smMicros;
 smMicros = tick;
 return old;
}

unsigned long SmartDelay::Wait() {
 unsigned long old = smMicros;
 smLast = micros();
 return old;
}

unsigned long SmartDelay::Reset() {
 unsigned long old = smMicros;
 smLast = 0; // про переполнение целого помнить!
 return old;
}

unsigned long SmartDelay::Start() {
 unsigned long old = smMicros;
 state = SMART_DELAY_START;
 return old;
}

unsigned long SmartDelay::Stop() {
 unsigned long old = smMicros;
 state = SMART_DELAY_STOP;
 return old;
}

// OOP methods
void SmartDelay::run() {
 if (Now()) Process();
}
void SmartDelay::Process() {}
// end of Smart Delay class definition

Danke

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).

Du hattest dieses Thema doch bereits. Warum fängst Du einen neuen Thread dafür an?

Gruß Tommy

mache ich. Ich habe diesen themenfeld nicht mehr gefunden, dachte das es gelöscht wurde und deshalb nochmal neuen thread angefangen

Naja, wenn Du nicht mal mehr Deine eigenen Beiträge findest, ...

Gruß Tommy

Edit: Tipp: Klicke auf Deinen Nicknamen und wähle dann Show posts.

der Code ist angehängt

2018-07-07_V1.2_P-Regler.ino (5.2 KB)

Du solltest Dir Posting #1 nochmal verstehend durchlesen.

Gruß Tommy

Maria2: Meine Frage ist, ob der Code die ich erstellt habe, richtig ist? oder ob das nicht Arduino sprache ist. Habe wenig erfahrung mit Arduino.

Dann würde mich mal interessieren, woher du den Code hast oder womit du den erstellt hast ?

Mit Ehrlichkeit kommst Du hier definitiv eher weiter… Ich glaube nicht dass das Dein Code ist, oder bist Du “Link”, und hast die Fähigkeiten unterwegs verloren!?

Und mit Code Tags war so etwas hier gemeint und kein Anhang:

#include "SmartDelay.h"

SmartDelay::SmartDelay(unsigned long tick) {
  smMicros = tick;
  state    = SMART_DELAY_START;
}

int SmartDelay::Now() {
  unsigned long mcs = micros();

  // Важно помнить про переполнение целого!

  if (mcs - smLast < smMicros)
    return false;

  smLast = mcs;
  return (state == SMART_DELAY_START);
}

unsigned long SmartDelay::Get() const {
  return smMicros;
}

unsigned long SmartDelay::Set(unsigned long tick) {
  unsigned long old = smMicros;
  smMicros = tick;
  return old;
}

unsigned long SmartDelay::Wait() {
  unsigned long old = smMicros;
  smLast = micros();
  return old;
}

unsigned long SmartDelay::Reset() {
  unsigned long old = smMicros;
  smLast = 0; // про переполнение целого помнить!
  return old;
}

unsigned long SmartDelay::Start() {
  unsigned long old = smMicros;
  state = SMART_DELAY_START;
  return old;
}

unsigned long SmartDelay::Stop() {
  unsigned long old = smMicros;
  state = SMART_DELAY_STOP;
  return old;
}

// OOP methods
void SmartDelay::run() {
  if (Now()) Process();
}
void SmartDelay::Process() {}
// end of Smart Delay class definition

Gruß SG

ich sehe gerade das es nicht das richtige ist, was ich gepostet habe. Ich öffne das mit ein anderen PC und poste es heute wieder.

Maria2: ich sehe gerade das es nicht das richtige ist, was ich gepostet habe. Ich öffne das mit ein anderen PC und poste es heute wieder.

Ja, man sollte sich vorher schon genau ansehen, was man postet.

#include "SmartDelay.h"
  

// Default_Restard Setup

void setup() {
  
// Analog-Eingänge
  
pinMode(A0,INPUT);
  pinMode(A2,INPUT);
 
 // Digital-Eingänge 0-7
 
  pinMode(4,INPUT);
  pinMode(7,INPUT);
  
  
  // dig-Ausgänge 8-13)
 
  pinMode(8,OUTPUT);
  pinMode(10,OUTPUT);
  pinMode(12,OUTPUT);  
  
}

// Globale Variablen

unsigned int SN = 1; // SchrittNummer = Nummer im Ablaufplan (beschreibt in welchem Zustand sich die Anlage befindet und was ausgeführt wird)

// Klasse: DruckAnalogSensor

class  DruckAnalogSensor{
private:
  int p1value;     // Bp1.2 Analog- Intwert- Drucksensor 
  int p2value;    // Bp1.4 Analog- Intwert- Drucksensor 
  int offcet1;
  int offcet2; 
  double messwert_hPa1=0;
  double messwert_hPa2=0; 
  double messGenauigkeit=0.68;
public:
  DruckAnalogSensor(){}  
  void analogSignalEinlesen(){
  
  // Drucksenseor 10mv/psi 
  // Spannung 0-50mV
  
  p1value = analogRead(A0); //Spannung Einlesen geht von int 0-1023 bei 0- 5 Volt
  p2value = analogRead(A2); //Spannung Einlesen
  this->intIn_hPa_Umrechen();
  }
  void intIn_hPa_Umrechen(){
    const int pMinInV = 0;      // 0 Volt entsprechen Analog int 0=> -3475 /10= -347.5 HPA
    const int pMaxinV = 1023;  // 50mV entspricht Analog int 1023 => 3475 /10= 347.5 HPA
    messwert_hPa1= (map(p1value,pMinInV,pMaxinV,-3475,3475))/10; 
    messwert_hPa2= (map(p2value,pMinInV,pMaxinV,-3475,3475))/10;    
    } 
  
  void reset(){}
  bool hPa_Erreicht(int Druckvorgabe){
    
  //Vergleich +-10 hPa
    if ((messwert_hPa1 <= Druckvorgabe+10)||(messwert_hPa1 >= Druckvorgabe-10)){
      return true;
    }
    return false;
  }
};

// Klasse: Kipp-Schalter

class Schalter{
private:
  bool stellung =0; // Schalter= 1=EIN/0=AUS
  int portNr=0;
public:
  Schalter(int portEingang):portNr(portEingang){}
  void digitalSignaleinlesen(){
    stellung = digitalRead(portNr);     
  }
  bool ein(){
    if (stellung == 1){
      return true;  
    }
    return false;
  }
  bool aus(){
    if(stellung==0){
      return true;
    }
    return false;
  }
    
};

// Klasse: Relais

class Relais {
private:
  bool freigabe;
  bool schaltstellung = 0;
  int port;
  
public:
  Relais(){}
  Relais(int portAusgang):port (portAusgang){} 
  void setzen(){schaltstellung=1;}
  void ruecksetzen(){schaltstellung=0;}
  void ausgaengeFreigabe(){}  
};

//Klasse: 3/2 Wegeventiele

class Drei_ZweiWegeventiel{
private:
Relais K;
public:
Drei_ZweiWegeventiel(int portAusgang): K(portAusgang) {}
void offen(){  K.setzen();}
void geschlossen() {K.ruecksetzen();}

};

//Klasse: Verdichter-Vakuum Pumpe

class Verdichter{
private:
  Relais K;
public:
  Verdichter(int portAusgang): K(portAusgang) {}
  void einschalten(){K.setzen();}
  void motorSchaltFreigabe(){}
};

// Verwendete Funktionen
 
void vakuumregelung(){}
 void  druckregelung(){}

// Bauteile Initalisieren
  
  DruckAnalogSensor Bp1;        // DruckAnalogSensor = Druck in Kammer
  Schalter S1(8);                   // Schalter= Anlage EIN/AUS
  Schalter S2(10);                 // Schalter= Aus = Druck und danach Vakuum; An = Vakuum und danach Druck;
  Drei_ZweiWegeventiel V1(8);   // Magnetventiel = Druckseite     1=geschaltet; 0=gesperrt 
  Drei_ZweiWegeventiel V2(10);  // Magnetventiel = Vakuumseite    1=geschaltet; 0=gesperrt 
  Verdichter M1(12);                // Verdichter-Vakuum Pumpe=       EIN/AUS
  SmartDelay T1;                    // Timer Druck
  SmartDelay T2;                    // Timer Vakuum

//Cyclus
   
void loop() {
  // Eingabe
  
  S1.digitalSignaleinlesen();
  S2.digitalSignaleinlesen();
  Bp1.analogSignalEinlesen();
  
  // Verarbeitung
  // Anlage Ein Auschalten und Reset
  
  if (SN == 1){

// Anlage AUS    
    
    //Weiterschaltung
    
if  (S1.ein()==true){ SN = 2; }
    else if (S1.aus()==true){ SN = 1; }
    else;
  }
  
  if (SN == 2){
// Reset Gundposition;
//Weiterschaltung
   
 if   (S1.ein()==true /*&& Grundposition Ereicht*/ ){ ++SN; }
    else if(S1.aus()==true){ SN = 1; }
     
  }
  
  
  if (SN == 3){
// Motor Einschalten/vorlauf noch kein Timer einerichtet
//    M1.einschalten();
//Weiterschaltung
   
 if  (S1.ein()==true )     { ++SN;  }
    else if(S1.aus()==true)  { SN = 1; }
  }

  if (SN == 4){

// Timer Initialisieren aufteilung nach S2 ob zuerst 20 min Druck wenn S2 =0 sonst zuerst 20min Vakuum 

wenn S2=1
   T1.Reset();
   T1.Set(1200000000);           // Setze Timer Druck auf 20 min
   T2.Reset();
   T2.Set(1200000000);           // Setze Timer Vakuum auf 20 min
   

   if (S2.aus())    {SN=100;}
   else if (S2.ein()){SN=200;}
   else if(S1.aus()==true)  { SN = 1; }   
  }

  if (SN == 100){

// Bevor Timer statet einmalig Druck ereichen +- offcet
  
V1.offen();                //Druck wird aufgebaut
  V2.geschlossen();
  
//Weiterschaltung
   
 if(Bp1.hPa_Erreicht(260)){ SN = 101; }
    else if (S2.aus()){SN = 4;}
    else if(S1.aus()==true)  { SN = 1; }  
  }

  if (SN == 101){

// Timer DruckStarten danch Druck Regeln solange Timer aktive 
  
T1.Start();
  
//Weiterschaltung
  
  if (S2.aus()){SN = 4;}
  else if(S1.aus()==true)  { SN = 1; }
  else { SN = 102; }   
  }

  if(SN == 102){

// Druckregelung
    if(Bp1.hPa_Erreicht(330)){
      vakuumregelung();    
    }
    else{
      druckregelung();
      }
      

    //Weiterschaltung
  
     if (S2.aus()){SN = 4;}
      else if(S1.aus()==true)  { SN = 1; }
  }
    
  
  
  // Ausgabe

  
  
   
  
}

Der Code für SmartDelay.h kommt aus folgende Quelle, die wird in diesem Code eingebunden (#included):

Code, bei denen die Kommentare nicht zum Inhalt passen, ist ziemlich verwirrend. z.B.:

 // Digital-Eingänge 0-7

  pinMode(4,INPUT);
  pinMode(7,INPUT);

// dig-Ausgänge 8-13)

  pinMode(8,OUTPUT);
  pinMode(10,OUTPUT);
  pinMode(12,OUTPUT);

Das solltest Du korrigieren.

Gruß Tommy