Wasserbad auf SSR umbauen

Hallo, ich bin gerade dabei mir ein Temperaturrgler für ein Wasserbad zu bauen. Bisher verwende ich dafür eine ganz einfache Ansteuerung mit den Zuständen an/aus.

Die Temperatur messe ich mit einem DS18B20 in wasserdichter Ausführung. Um so wenig wie möglich mit 230V arbeiten zu müssen missbrauche ich derzeit eine Funksteckdose und einen 433 MHz Sender als Relais.

Um meine Genauigkeit zu verbessern würde ich gern auf eine PID Regelung mit einem Solid State Relais umsteigen. Man findet zwar schon viel Infos, da es sich um eine so hohe Spannung handelt möchte ich mich doch nochmal gern absichern... Selbstverständlich werde ich das Relais mit einem ausreichend großen Kühlkörper ausstatten und Wasser- und berühsicher einhausen.

Das SSR ist ein XSSR-DA2420. Kann ich dieses nun direkt an meinen analogen Output hängen und die Leistung über meine P,I und D Parameter regeln oder gibt es etwas was ich noch beachten muss?

Vielen Dank schonmal für eure Hilfe,
Hans

hans_dampf:
Kann ich dieses nun direkt an meinen analogen Output hängen und die Leistung über meine P,I und D Parameter regeln oder gibt es etwas was ich noch beachten muss?

Nun ja.

Zum einen hat der Arduino keinen analogen Output.
Sondern nur digitale. Die können dann eine PWM erzeugen.

Zu deiner eigentlichen Frage: ja und nein.
ja: du kannst dieses SSR direkt mit dem Arduino ansteuern.
nein: mit analogWrite() wirst du da kein Ergebnis bekommen.

Warum? dazu musst verstehen was ein SSR ist und wie das funktioniert.
ein SSR besteht aus einem Triac plus Ansteuerschaltung. Ein Triac kann nur eingeschaltet werden. Ausschalten tut es, wenn der Strom zu Null wird.

Beim Betrieb mit Wechselstrom bedeutet das:
wenn du am Arduino Ausgang einen Puls ausgibst, dann schaltet das SSR ein bei steigender Flanke. Wenn du den Ausgang wieder zu Null setzt, bleibt das SSR ein.
Erst beim nächsten Nulldurchgang der Netzspannung schaltet das SSR wieder ab.

Um mit einem SSR Leistung zu steuern musst du also wissen, wie genau die Wechselspannung des Netzes liegt und immer phasenrichtig schalten. Dann kannst du entweder mit Phasenanschnitt arbeiten, oder mit Schwingungspaketsteuerung.

Beides geht, ist aber aufwändig.

Da ein Wasserbad (Sous vide?) aber recht träge ist, sollte das auch mit Relais funktionieren.

edit:
wenn du dich einarbeiten willst, dann findest hier im forum unter dem Stichwort "phasenanschnittsteuerung" auch Freds, die sich damit beschäftigen.

Wenn dir das zu kompliziert ist, es gibt auch fertige Module, z.B. sowas: KEMO-Leistungsregler plus dem zugehörigen Pulskonvertermodul. Das kannst du dann direkt mit analogWrite() ansteuern.

Hallo Gunther, danke für die schöne Erklärung. "Phasenanschnitt" kenne ich, nach "Schwingungspaketsteuerung" werde ich mal suchen. Was es alles gibt :slight_smile:

hans_dampf:
Das SSR ist ein XSSR-DA2420. Kann ich dieses nun direkt an meinen analogen Output hängen und die Leistung über meine P,I und D Parameter regeln oder gibt es etwas was ich noch beachten muss?

Nach meinem Verständnis kommt der I-Anteil aus dem Heizelement, weshalb ein PD-Regler reichen sollte. Berücksichtigt werden muß auch die möglicherweise ungleiche Temperaturverteilung innerhalb der Flüssigkeit. Hängt davon ab, ob natürliche Konvektion oder ein Quirl verwendet und wo gemessen wird.

Wie Gunther schon dargelegt hat, sollte ein digitaler Ausgang ohne PWM reichen. Ein in µSek werkelnder Arduino ist ja um Größenordnungen schneller als ein Heizelement für das Wasserbad.

Vielen Dank schonmal, dann hatte ich mir das wohl zu einfach vorgestellt:

Nochmal eine Gegenfrage zum Verständnis. Das SSr schält also bei Nulldurchgang ab solmit mit 50Hz. Wenn ich mit meinem digitalen Pin jetzt im Vergleich zur Netzfrequenz ausreichend langsam (z.B. 1Hz) schalte dürfte die Asynchronität doch nichtmehr sonderlich ausfallen, oder?

Wenn ich also eine Basis Einheit von 1s betrachte und innerhalb dieser 1s meine Leistung für 10% 100ms entspricht müsste es dann funktionieren?

Ja thematisch liegst du richtig, soll ein Sous-Vide-Kocher werden. Das Wasser wird umgewälzt.

hans_dampf:
Wenn ich also eine Basis Einheit von 1s betrachte und innerhalb dieser 1s meine Leistung für 10% 100ms entspricht müsste es dann funktionieren?

So würde ich mir das vorstellen, wobei eine Zeit von 10s für 100% möglicherweise realistischer ist. Das hängt aber vom Heizelemt ab. Miß mal die Zeit, bis sich das Wasser um das Heizelement signifikant erhöht, dann hast Du einen Anhaltspunkt.

hans_dampf:
Wenn ich also eine Basis Einheit von 1s betrachte und innerhalb dieser 1s meine Leistung für 10% 100ms entspricht müsste es dann funktionieren?

ja, das sollte funktionieren.
nur dass du dann halt immer eine Ungenauigkeit von 10ms hast durch die Netzfrequenz. Deine 10% können also auch 11% sein.

Das ganz läuft dann übrigens auf eine Schwingungspaketsteuerung hinaus. :wink:

agmue:
Miß mal die Zeit, bis sich das Wasser um das Heizelement signifikant erhöht, dann hast Du einen Anhaltspunkt.

Das ist nicht relevant, weil er ja damit die Leistung steuert.

Guten Abend zusammen,

Also schonmal vielen Dank für die Tipps, der Code steht und der Versuchsaufbau genauso. Um die Funktion zu testen und die Parameter einzustellen hab ich gerade einen Testlauf gestartet. Allerdings gibt es noch ein Problem:

Wenn ich in der Heizphase bin, liegen am entsprechenden Output-Pin 4,8V an, genug also um mein Relais zu schalten, das hab ich auch nochmal nachgemessen. Wenn ich jetzt allerdings die niedervolt-Seite meines Relais Verkabele, liegen in den Heizphasen nurnoch 1,5V an...

Kann mir jemand sagen was ich da verbockt haben könnte?

Grüße,
Hans

Aufgrund Deiner Beschreibung steige ich nicht durch, was Du wo mißt. Einen Schaltplan, auch per Hand gemalt und auf den Scanner gelegt, schaue ich mir aber gerne an.

Hier mal mein "Schaltplan":

Also wenn ich so zwischen den Input Pins 3 und 4 am Relais messe, dann sehe ich, dass die Spannung 0V in der nicht-Heizphase bzw 1,5V in der Heizphase beträgt.

Wenn ich die Kabel vom Relais abklemme und zwischen A und B messe, liegen 0 bzw 4,8V an, so wie ich es eigentlich auch für den anderen Fall erwartet hätte...

Vielen Dank schonmal fürs anschauen

Würde ich so auch nicht erwarten. Steuerst Du den Ausgang mit digitalWrite() an?

Ja, zur Kontrolle schalte ich auch die LED an Pin 13 an, um einfacher zu sehen wann ich Heize und wann nicht

digitalWrite(RelayPin, HIGH);
digitalWrite(13, HIGH);

ich poste den Code am besten auch mal noch dazu:

#include <PID_v1.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define RelayPin 6
#define ONE_WIRE_BUS 2 /* Digitalport Pin 2 definieren */

OneWire ourWire(ONE_WIRE_BUS); /* Ini oneWire instance */
DallasTemperature sensors(&ourWire);/* Dallas Temperature Library für Nutzung der oneWire Library vorbereiten */

//Define Variables we'll be connecting to
double Setpoint, Input, Output, T;

//Korrekturfaktor des Temperatursensors
double korr = 1.25;

//Specify the links and initial tuning parameters
PID myPID(&Input, &Output, &Setpoint, 2, 3, 0.2, DIRECT);

int WindowSize = 1000;
unsigned long windowStartTime, previousMillis;
void setup()
{
  Serial.begin(9600);
  Serial.println("Starte Temperatur abfragen ...");
  windowStartTime = millis();

  //initialize the variables we're linked to
  Setpoint = 50;

  //tell the PID to range between 0 and the full window size
  myPID.SetOutputLimits(0, WindowSize);

  //turn the PID on
  myPID.SetMode(AUTOMATIC);


  sensors.begin();/* Inizialisieren der Dallas Temperature library */

  sensors.setResolution(TEMP_12_BIT); // Genauigkeit auf 12-Bit setzen

  pinMode(13, OUTPUT); /*anzeige */
}

void loop()
{
  /* Temperatur messen, korrigieren */
  sensors.requestTemperatures(); // Temp abfragen
  T = sensors.getTempCByIndex(0) + korr;



  Input = T;
  myPID.Compute();

  /************************************************
   * turn the output pin on/off based on pid output
   ************************************************/
  unsigned long now = millis();
  if (now - windowStartTime > WindowSize)
  { //time to shift the Relay Window
    windowStartTime += WindowSize;
  }
  if (Output > now - windowStartTime)
  {
    digitalWrite(RelayPin, HIGH);
    digitalWrite(13, HIGH);
    Serial.print(now);
    Serial.print(";");
    Serial.print(Input);
    Serial.print(";");
    Serial.print(Output);
    Serial.println(";");
  }
  else {
    digitalWrite(RelayPin, LOW);
    digitalWrite(13, LOW);
  }
}

Ich finde keinen Hinweis auf einen Fehler.

In so einem Fall gehe ich dann einen Schritt zurück, schreibe einen Testsketch, ein Ausgang HIGH, einer LOW. Dann in dieser Situation Spannung und Strom messen. Auch die +5V vom Arduino. Anderen Ausgang verwenden, der Mega hat ja ein paar.

Möglicherweise hat ja aber noch jemand eine bessere Idee. :roll_eyes:

Also wenn ich so zwischen den Input Pins 3 und 4 am Relais messe, dann sehe ich, dass die Spannung 0V in der nicht-Heizphase bzw 1,5V in der Heizphase beträgt.

Hmm...
Das ist wenig und so kenne ich das nicht.
Die Dinger haben in der Regel einen Optokoppler mit Vorwiderstand im Bauch.. oder so..

Wenn die Spannung soweit einbricht, ist das SSR defekt, oder der ATMega.
Messe mal den Strom. Ich würde 10mA erwarten

Korrektur:
Du schaltest nur den internen Pullup ein und aus.
Du bestromst den Pin gar nicht richtig.

jep, da hat er recht.

Dir fehlt der Befehl
pinMode(RelayPin, OUTPUT);
in der Setup()

Ich hatte vor dem Einschlafen noch gegrübelt, was es wohl sein könnte, aber mit diesem Hinweis fängt der Tag doch gleich gut an. :smiley:

Ja stimmt so fängt der Tag gut an! Bin grad unterwegs, werde es nacher gleich ändern und dann testen, dann meld ich mich nochmal.

Vielen dank schonmal für die Fehlersuche!

Grüße!

P.s.: Das Relais hatte ich schonmal direkt mit 5v zum durchschalten bewegen können, das wird vermutlich intakt sein...

Viele SSR's haben intern einen Optokoppler und damit eine IR-LED, deren Flusspannung ca. 1,5V beträgt. Studiere das Datenblatt, vermutlich benötigst du einen Vorwiderstand, wie er bei einer LED üblich ist.

Gruß Gerald

vermutlich benötigst du einen Vorwiderstand, wie er bei einer LED üblich ist.

Ist im SSR drin.
3V bis 32V können direkt dran