Temperaturgeregelte Motorsteuerung

Hallo ich habe zur Zeit ein projekt, bei dem eine Pumpe Wasser durch einen Durchlauferhitzer schickt.
Der Durchlauferhitzer erhitzt das Wasser, wenn es eine temperatur erreicht hat, soll die Pumpe für eine kurze Zeit pumpen. Die Temperatur wird mittels Pt1000 ausgelesen. Den ADC Wert habe ich in °C umgewandelt. Allerdings klappt das mit der Steurung der Temperatur nicht so ganz. Soweit ich das erkennen kann, schaltet sich die Heizung bei der Solltemperatur aus, die Pumpe funktioniert auch, nur stoppt sie nicht mehr. Vielleicht habt ihr ein paar tipps. Wollte die Temperatur eigentlich über einen PID regler regeln, aber versteh es nicht so ganz. Falls sich da jemand auskennt, wäre ich hierfür auch dankbar.

[code]

//Dient zur Steuerung des Motors. Der Motor soll bei Betätigung des Buttons für eine gewisse Zeit laufen
const int STANDBY = 2;              // Konstanten und Variablen werden deklariert
const int AIN2 = 7;
const int AIN1 = 8;
const int MPWM = 9;
const int LED = 13;
const int BUTTON = 5;
const int HEIZUNG = 4;
const unsigned int TEMP = A0;
double WERT, STROM, TEMPERATUR;

int intervall;
int Speed = 0;
int i=0;
unsigned long prevMillis = 0;  
boolean HEIZEN = 0;   

void setup() {                              //Ein- und Ausgänge werden zugewiesen
  pinMode (STANDBY, OUTPUT);  
  pinMode (AIN2, OUTPUT);
  pinMode (AIN1, OUTPUT);
  pinMode (MPWM, OUTPUT);
  pinMode (HEIZUNG, OUTPUT);
  pinMode (BUTTON, INPUT);
  pinMode(TEMP, INPUT);
 
  Serial.begin(9600);
  


}

//clockwise operation; Motor dreht in Uhrzeigerrichtung
void cw (byte Speed){
  digitalWrite(STANDBY, HIGH);
  digitalWrite(AIN1, HIGH);
  digitalWrite(AIN2, LOW); 
  analogWrite (MPWM,Speed);
}
 
 
//counter-clockwise operation; Motor dreht gegen die Uhrzeigerrichtung
void ccw (byte Speed){
  digitalWrite(STANDBY, HIGH);
  digitalWrite(AIN1, LOW); 
  digitalWrite(AIN2, HIGH);
  analogWrite (MPWM,Speed);
}
 
//brake operation; Motor wird gebremst
void brake(){
  digitalWrite(STANDBY, HIGH); 
  digitalWrite(MPWM, LOW); 
  analogWrite (MPWM,0);
}
 
//motor stop ; Motor wird gestoppt
void MotorStop(){
  digitalWrite(AIN1, LOW); 
  digitalWrite(AIN2, LOW); 
  digitalWrite(STANDBY, HIGH); 
  digitalWrite(MPWM, HIGH); 
  analogWrite (MPWM,0);
}
 
//motor STANDBY
void MotorSTBY(){
digitalWrite(STANDBY, LOW);    // sets the Motor to STBY
}

//Temperaturmessung
void Temperatur(){
  WERT = analogRead (TEMP);                     // Auslesen des ADC-Wertes
  STROM=(((WERT*5)/(1023.00*216.00))*1000);     // Umrechnung in Ampere
  TEMPERATUR = ((STROM-4.00)/0.16);             // Umrechnung der Stromdifferenzen in Temperatur
  Serial.print (TEMPERATUR);
  Serial.println(";");
  delay(1800);
}

void Regler(){
  do{ 
    Temperatur();
    digitalWrite(HEIZUNG, HIGH);
    
  } while (TEMPERATUR <= 25.00 );
  
 // if (TEMPERATUR >= 30.00){
    digitalWrite(HEIZUNG, LOW);
    HEIZEN = 1;
    
  }


void loop() {
  
  
  Regler();
  if (HEIZEN == 1){
   do {
    cw(127);                    // Motorsteuerung
    intervall = 5000;
    prevMillis = millis();
      if (millis() - prevMillis >= intervall) {
          MotorStop();
          i = 1;
       }
  } while (i == 1);

  }
}

[/code]

Guten Morgen,

spontan fallen mir zwei Dinge auf (mal abgesehen davon das dein Code unvollständig ist, wo werden die Variablen deklariert und wo ist dein setup()?). Zum einen in deiner Funktion Regler. Die setzt am Ende die Variable HEIZEN immer auf 1, womit deine if Abfrage in loop() immer wahr wäre, wenn sie denn richtig geschrieben wäre. Es müsste HEIZEN==1 sein. == ist ein Vergleich, = ist eine Zuweisung. Sehe grade das du bei der Schleife in loop() den gleichen Fehler gemacht hast und deine Variable i vor der do while Schleife nicht auf was anderes als 1 intialisierst (die Schleife kann also höchstens beim ersten mal funktionieren). Der letzte Fehler sorgt übrigens für deine Endlosschleife.

Zusätzlich hast du ganz oft Variablenzuweisungen oder Anweisungen in Schleifen, die dort gar nicht geändert werden. In Regler() das Heizung einschalten oder das intervall=5000 in loop(). Ich vermute des weiteren, das du eigentlich was anders möchtest als du geschrieben hast. Momentan (nach Korrektur der Fehler) heizt du bis die Temperatur > 25°C ist und dann schaltest du den Motor für 5s ein. Und dann wieder von vorne. Willst du wirklich stoßweise das Wasser bekommen und ist dein Temperatursensor wirklich so im Durchlauferhitzer eingebaut, dass er die Wassertemperatur im Durchlauferhitzer misst (oder ist es eher ein Boiler). Wenn der Sensor nicht im geheizten Bereich sitzt kann es nicht sinnvoll funktionieren.

Sinnvoller wäre es vermutlich bei konstant laufender Pumpe die Leistung des Durchlauferhitzers zu regeln oder bei konstanter Leistung des Durchlauferhitzers den Durchfluss der Pumpe zu regulieren um eine konstante Wassertemeperatur zu erhalten.

Gruß
Daniel

Danke für die erste schnelle Hilfe. Habe das = durch == ersetzt. und den vollständigen Code oben eingesetzt. Das die Pumpe stoßweiße das Wasser abgibt ist gewollt. Bei dem HEIZEN hast du wohl recht, dann kann ich die if Anweisung ja löschen. Es soll auf 25°C aufgeheizt werden und dann 5 Sekunden Wasser gepumpt werden.

digitalWrite(MPWM, LOW);
analogWrite (MPWM,0);

Das ist doch beides das gleiche... oder?`

digitalWrite(MPWM, HIGH);
analogWrite (MPWM,0);

Voll gegensätzlich... erst ein und ein paar Takte später aus...
Da ist doch zumindest das erste überflüssig, oder?

@combie

werde gleich mal drüber gucken, ist mir gar nicht aufgefallen

hab jetzt die if-Anweisung entfernt und i == 1 gesetzt, allerdings hört der Motor immer noch nicht nach 5 sek auf.

du mußt
MotorStop();
i = 1;
i auf 0 setzen
und hier
do{
Temperatur();
digitalWrite(HEIZUNG, HIGH);
wieder auf 1 setzen

@ardubu wenn ich so mache, verlässt er doch überhaupt nicht die Schleife, oder ?
Hab es ausprobiert, funktioniert aber nicht. Die Pumpe stoppt nicht.

Hallo Somox,

do
{
anweisung
}

while (Bedingung)

Die Befehle innerhalb der geschweiften
Klammer werden so lange ausgeführt wie
Bedingung = true erfüllt ist.
Die Abfrage wird geprüft, nachdem die
Anweisung ausgeführt wird.

stimmt, danke, da hatte ich einen Denkfehler. Aber funktioniert immer noch nicht. Kann es sein das irgendwas bei dem millis() Befehl falsch ist ? Also das die Zeit falsch berechnet wird ?

mir ist der Ablauf deiner Steuerung noch nicht ganz klar:

  1. heizen
  2. wenn Temp > 25°C {Heizung aus, Motor für 5 sec. an}

was dann?

versuch es mal so:

//Dient zur Steuerung des Motors. Der Motor soll bei Betätigung des Buttons für eine gewisse Zeit laufen
const int STANDBY = 2;              // Konstanten und Variablen werden deklariert
const int AIN2 = 7;
const int AIN1 = 8;
const int MPWM = 9;
const int LED = 13;
const int BUTTON = 5;
const int HEIZUNG = 4;
const int TEMP = A0;
double WERT, STROM, TEMPERATUR;

const int intervall = 5000;
byte Speed = 0;
boolean i=0;
unsigned long prevMillis = 0; 
boolean HEIZEN = 0;   

void setup() {                              //Ein- und Ausgänge werden zugewiesen
  pinMode (STANDBY, OUTPUT); 
  pinMode (AIN2, OUTPUT);
  pinMode (AIN1, OUTPUT);
  pinMode (MPWM, OUTPUT);
  pinMode (HEIZUNG, OUTPUT);
  pinMode (BUTTON, INPUT_PULLUP);//Taster an Pin 5 und GND anschließen
  pinMode(TEMP, INPUT);
 
  Serial.begin(9600);
 


}

//clockwise operation; Motor dreht in Uhrzeigerrichtung
void cw (byte Speed){
  digitalWrite(STANDBY, HIGH);
  digitalWrite(AIN1, HIGH);
  digitalWrite(AIN2, LOW);
  analogWrite (MPWM,Speed);
}
 
 
//counter-clockwise operation; Motor dreht gegen die Uhrzeigerrichtung
void ccw (byte Speed){
  digitalWrite(STANDBY, HIGH);
  digitalWrite(AIN1, LOW);
  digitalWrite(AIN2, HIGH);
  analogWrite (MPWM,Speed);
}
 
//brake operation; Motor wird gebremst
void brake(){
  digitalWrite(STANDBY, HIGH);
  analogWrite (MPWM,0);
}
 
//motor stop ; Motor wird gestoppt
void MotorStop(){
  digitalWrite(AIN1, LOW);
  digitalWrite(AIN2, LOW);
  digitalWrite(STANDBY, HIGH);
  analogWrite (MPWM,0);
}
 
//motor STANDBY
void MotorSTBY(){
digitalWrite(STANDBY, LOW);    // sets the Motor to STBY
}

//Temperaturmessung
void Temperatur(){
  WERT = analogRead (TEMP);                     // Auslesen des ADC-Wertes
  STROM=(((WERT*5)/(1023.00*216.00))*1000);     // Umrechnung in Ampere
  TEMPERATUR = ((STROM-4.00)/0.16);             // Umrechnung der Stromdifferenzen in Temperatur
  Serial.print (TEMPERATUR);
  Serial.println(";");
  delay(1800);//wofür 1,8 sec Pause?
}

void Regler(){
if ( Temperatur() <= 25)
    {digitalWrite(HEIZUNG, HIGH);
     i=1;}
   
  else
    {
    digitalWrite(HEIZUNG, LOW);
    HEIZEN = 1;
    prevMillis = millis();
  }
}

void loop() {
 
  
  Regler();
  if (HEIZEN && i){
   do {
       cw(127);                    // Motorsteuerung
          if (millis() - prevMillis >= intervall) {
          MotorStop();
          i = 0;
       }
  } while (i == 1);

  }
}