Kühlschranksteuerung

ich habe einen Weinkühlschrank bekommen, bei dem Leider die Elektronik kaputt ist!
jetzt habe ich mir gedacht, ist doch kein Problem, ich nehme einen Arduino UNO ein USB Netzteil und einen 4 Fach Relaisblock.
doch irgendwie bekomme ich die Steuerung für die Temperatur nicht hin. (bei der Programmierung von Arduinos probiere und kopiere ich hauptsächlich)

Der Kühlschrank hat den Verdichter für die Kühlung, ein Licht und einen Lüfter innen sowie 2 Fühler (einem im Kühlschrank und einen am Verdampfer)(es sind NTC Fühler, die würde ich mit einem 10 K Ohm Widerstand wie ein Potentiometer einbinden) ein Potentiometer zum einstellen der Solltemperatur und einen Taster für das Licht.

Um die Relais zu schonen will ich für den Kompressor 2 Relais gleichzeitig verwenden.

  1. Der Kühlschrank soll beim drücken des Tasters die Kühlung, den innere Lüfter und das Licht einschalten. (falls er auf einer Party mal öfters geöffnet wird und gut aussieht)
    bei erneutem drücken wieder ausschalten, und nach einer gewissen Zeit wieder von alleine ausschalten
  2. Der innere Lüfter soll dauernd Laufen, wenn der Verdampfer unter 0 Grad hat. (somit kann er nie Vereisen)
  3. mit dem Poti will ich die Temperatur im Kühlschrank einstellen. (Kühlung und Lüfter sollen dabei Laufen)

hier einmal der Sketch, bei der Temperatursteuerung über das Poti und dem Raumfühler scheitere ich gerade noch:

const int Luefter = 2;   
const int Licht =  3;
const int Komp = 4;
const int Komp2 = 5;
const int TASTER = 13;
const int Verdampfer = A0;
const int Raum = A1;
const int Poti = A2;
boolean aktButton, altButton, aktiv;
unsigned long startTime;
const unsigned long interval = 3 * 1000;  // das sind 5 Sekunden zum Testen; kann max ca. 49 Tage sein
                                          // 6 Stunden wären: 6 * 60 * 60 * 1000
int Wert0;
int Wert1;
int Wert2;
                                          
void setup() {
  Serial.begin(9600);
  pinMode(Komp, OUTPUT);
  pinMode(Komp2, OUTPUT);
  pinMode(Licht, OUTPUT);
  pinMode(Luefter, OUTPUT);   
  pinMode(TASTER, INPUT_PULLUP);  // geändert auf INPUT_PULLUP
  pinMode(Verdampfer, INPUT_PULLUP);
  pinMode(Raum, INPUT_PULLUP);
  pinMode(Poti, INPUT_PULLUP);
}

void loop() {
  altButton = aktButton;
  aktButton = digitalRead(TASTER);

 {if (digitalRead(Komp) == HIGH) // Kompressor auf 2 Relais
    digitalWrite(Komp2, HIGH);
 }
 {if (digitalRead(Komp) == LOW)
    digitalWrite(Komp2, LOW);
 }
  
  if (altButton && !aktButton)   // wenn der Taster gedrückt wurde...
  {
    aktiv = !aktiv;
    delay(30);  // einfaches Entprellen
    startTime = millis();    // Starten des "Timers"
  }
  
  if (!altButton && aktButton)   // wenn der Taster losgelassen wurde...
  { // was passieren soll, wenn der Taster losgelassen wird könnte hier stehen
    delay(30);  // einfaches Entprellen
  }
   
  if (aktiv == true)
  {  if (millis() - startTime < interval)  // wenn die Zeit noch nicht abgelaufen ist...
     {  digitalWrite(Komp, LOW);
        digitalWrite(Licht, LOW);
        digitalWrite(Luefter, LOW);
     }
     else  // wenn die Zeit bereits abgelaufen ist
     {  aktiv = false;
     }
  }
  else     // wenn aktiv == false
  {  digitalWrite(Komp, HIGH);
     digitalWrite(Licht, HIGH);
     digitalWrite(Luefter, HIGH);
  }

  {if (analogRead(Verdampfer) >500)  //0-1023 einschaltwert
    {digitalWrite(Luefter, LOW);}
    if (analogRead(Verdampfer) <400)  //0-1023 ausschaltwert
    {digitalWrite(Luefter, HIGH);}
    }

    {if (analogRead(Raum) > (Poti+100))  //0-1023 einschaltwert
    {digitalWrite(Luefter, LOW);
     digitalWrite(Komp, LOW);}
    if (analogRead(Raum) < (Poti))  //0-1023 ausschaltwert
    {digitalWrite(Luefter, HIGH);
     digitalWrite(Komp, HIGH);}
    }

   
}

Hmmm.....
In Kurzform, weil schon tief in der Nacht.

Ich bin davon überzeugt, dass du endliche Automaten bauen möchtest!
(auch wenn du das selber noch nicht weißt)

  {
    if (digitalRead(Komp) == HIGH) // Kompressor auf 2 Relais
      digitalWrite(Komp2, HIGH);
  }
  {
    if (digitalRead(Komp) == LOW)
      digitalWrite(Komp2, LOW);
  }

das kannst dir eigentlich sparen, wenn du einfach die zwei Eingänge von deinem Relaymodul auf einen Pin legst. Abgesehen davon, dass bezweifelt werden darf, dass dein Relaismodule für den Kühlschrank geeignet sind. "schonen wollen" klingt nicht vertrauenserweckend.

Deinen Punkt 1 finde ich eigenartig, damit übersteuerst du ja alles was du mit 2 und 3 machen willst,

Auch Punkt 2 und 3 haben eine Wechselwirkung auf den Lüfter.

Aber sei es drumm. Hab mal ein wenig umsortiert. Der Taster schaltet um wenn du ihn loslässt.

ungetestet:

const int Luefter = 2;
const int Licht =  3;
const int Komp = 4;
const int Komp2 = 5;
const int TASTER = 13;
const int Verdampfer = A0;
const int Raum = A1;
const int Poti = A2;
boolean aktButton, altButton, aktiv;
unsigned long startTime;
const unsigned long interval = 3 * 1000;  // das sind n Sekunden zum Testen; kann max ca. 49 Tage sein
// 6 Stunden wären: 6 * 60 * 60 * 1000
int Wert0;
int Wert1;
int Wert2;

enum Modus {NORMAL, TIMER} modus;


void setup() {
  Serial.begin(9600);
  pinMode(Komp, OUTPUT);
  pinMode(Komp2, OUTPUT);
  pinMode(Licht, OUTPUT);
  pinMode(Luefter, OUTPUT);
  pinMode(TASTER, INPUT_PULLUP);  // geändert auf INPUT_PULLUP
  pinMode(Verdampfer, INPUT_PULLUP);
  pinMode(Raum, INPUT_PULLUP);
  pinMode(Poti, INPUT_PULLUP);
}

void loop() {
  altButton = aktButton;
  aktButton = digitalRead(TASTER);

  {
    if (digitalRead(Komp) == HIGH) // Kompressor auf 2 Relais
      digitalWrite(Komp2, HIGH);
  }
  {
    if (digitalRead(Komp) == LOW)
      digitalWrite(Komp2, LOW);
  }

  switch (modus)
  {
    case NORMAL :
      // 1a. Der Kühlschrank soll beim drücken des Tasters die Kühlung, den innere Lüfter und das Licht einschalten. (falls er auf einer Party mal öfters geöffnet wird und gut aussieht)
      if (altButton == LOW && aktButton == HIGH)   // wenn der Taster losgelassen wurde...
      { // was passieren soll, wenn der Taster losgelassen wird könnte hier stehen
        delay(30);  // einfaches Entprellen
        startTime = millis();    // Starten des "Timers"
        modus = TIMER;
        Serial.println(F("Timer gestartet"));
        digitalWrite(Komp, LOW);
        digitalWrite(Licht, LOW);
        digitalWrite(Luefter, LOW);
      }

      // 2. Der innere Lüfter soll dauernd Laufen, wenn der Verdampfer unter 0 Grad hat. (somit kann er nie Vereisen)
      {
        if (analogRead(Verdampfer) > 500) //0-1023 einschaltwert
        {
          digitalWrite(Luefter, LOW);
        }
        if (analogRead(Verdampfer) < 400) //0-1023 ausschaltwert
        {
          digitalWrite(Luefter, HIGH);
        }
      }

      // 3. mit dem Poti will ich die Temperatur im Kühlschrank einstellen. (Kühlung und Lüfter sollen dabei Laufen)
      { if (analogRead(Raum) > (Poti + 100)) //0-1023 einschaltwert
        { digitalWrite(Luefter, LOW);
          digitalWrite(Komp, LOW);
        }
        if (analogRead(Raum) < (Poti))  //0-1023 ausschaltwert
        { digitalWrite(Luefter, HIGH);
          digitalWrite(Komp, HIGH);
        }
      }
      break;

    case TIMER :
      // 1b. bei erneutem drücken wieder ausschalten,
      if (altButton == LOW && aktButton == HIGH)   // wenn der Taster losgelassen wurde...
      { // was passieren soll, wenn der Taster losgelassen wird könnte hier stehen
        delay(30);  // einfaches Entprellen
        modus = NORMAL;
        Serial.println(F("Timer manuell gestopp"));
        digitalWrite(Komp, HIGH);
        digitalWrite(Licht, HIGH);
        digitalWrite(Luefter, HIGH);
      }
      // 1c. und nach einer gewissen Zeit wieder von alleine ausschalten
      if (millis() - startTime > interval)
      {
        modus = NORMAL;
        Serial.println(F("Timer durch Zeitablauf beendet"));
        digitalWrite(Komp, HIGH);
        digitalWrite(Licht, HIGH);
        digitalWrite(Luefter, HIGH);
      }
      break;
  }

}

@hoefi
Nimm ein SSR, ist besser als Relais, der Kompressor hat doch ziemlich großen Anlaufstrom, dazu noch, die meisten Relaismodule sind nicht für 230V geeignet, egal was auf dem Modul drauf steht

Wenn ein SSR dann ein SSR mit 25A besser 40A und ein Snubber-glied.

Funktioniert nicht. Das schwächere geht zuerst drauf und dann das andere.

Grüße Uwe

Danke für die vielen Antworten, Danke für die Sortierung, jetzt hat sie auch einen Aufbau, der überschaubar ist.
aber die Problematik ist leider noch nicht besser :wink:

Diese Beschreibung ist einfach zu ungenau als das man damit wirklich etwas programmieren könnte.

Eine gute Beschreibung benennt jedes Bauteil eindeutig und wiederholt die Bauteilnamen an ausnahmslos an jeder Stelle anstatt von "es" "dem" oder sonst irgendwelchen verschieden interpretierbaren Stellvertreterwörtern zu reden.

Wenn sich der Kühlschrank im Betriebsmodus "Kühlung aus" befindet und dann der Ein/Ausschalter gedrückt wird:

  • Kompressor einschalten
  • inneren Lüfter einschalten
  • Licht einschalten

Wenn sich der Kühlschrank im Betriebsmodus "Kühlung läuft" befindet und dann der Ein/Ausschalter gedrückt wird:

  • Kompressor ausschalten
  • inneren Lüfter ausschalten
  • Licht ausschalten

Was wird "von alleine ausgeschaltet? Das Licht? Der innere Lüfter?

Wenn Verdampfer-Temperatursensor eine Temperatur von 0°C oder Minusgrade misst
inneren Lüfter auch dann einschalten wenn der Kühlschrank sich im Betriebsmodus "Kühlung aus " befindet???

Wenn ich das Poti verstelle (egal in welche Richtung) dann sollen der Kompressor und der innere Lüfter eingeschaltet werden???

Da du ja sowieso alles neu mit einem Microcontroller elektrisch anschießen musst würde ich als Temperatursensoren onewire-Sensoren Typ DS18B20 nehmen.

Zum Schalten des Kompressors, des Lichts und des Lüfters jeweils so ein SSR
Solid State Relais

Danke für die Antworten, wo ich allerdings noch immer scheitere ist die Temperatureistellung über das Poti, könnte mir hierbei jemand weiterhelfen.

Also dass ich den Wert der Potentiometers mit dem Wert des NTC Fühlers Vergleiche und dann dementsprechend einen Kühlbefehl erhalte.

Danke im voraus!!

Woran scheitert es?

Die Temperatursensoren DS18B20 liefern direkt die Temperatur als Dezimalzahl 8,625 °C ohne Umrechnungspopanz.

Wie soll man da auch nur eine Zeile Programmcode erstellen wenn völlig unklar ist
wie du den NTC-Widerstand (der welchen Typ hat? Datenblatt posten) an den Microcontroller angeschlossen hast?

Es mag sein dass du den NTC schon zur Verfügung hast. Das elektrisch korrekte Anschließen eines analogen NTC-Fühlers so dass man damit vernünftig messen kann ist elektrotechnisch viel anspruchsvoller als bei einem Sensor der ein digitales Signal liefert.

Der DS18B20 kostet schlappe 2 Euro und liefert ein digitales Signal
Anschliessen eines DS18B20 ein Widerstand parallel zu Vdd und Data-pin sowie GND und gut is. Das Anschliessen an einen Arduino oder ESP funktioniert genauso wie bei einem Raspi.

einen NTC anschliessen ist zwar auch relativ einfach

Aber da kommen dann noch keine Grad Celsius am Microcontroller-Eingang an
Die Gradzahl muss man sich dann abhängig vom verwendeten NTC-Sensor berechnen.

vgs

Aus dem Sollwert Poti erst recht nicht. Und das war eigentlich @hoefi s Frage.

Nicht ohne Grund haben übliche Kühlschrank-Potis nur Zahlen (z.B. von 1 - 8 und Aus) auf dem Rad. Die haben nichts mit irgendwelchen Temperatur-Werten in Celsius zu tun.

Wenn das bei @hoefi s Weinkühler auch so ist, muss er eben erstmal den Wunsch-Wert des NTC je nach Poti-Einstellung ausprobieren/festlegen. Und dann einen Zweipunktregler mit reichlich Hysterese aufbauen.
Es soll ja erstmal nur funktionieren. Ob er dann einen PI-Regler realisiert und/oder den Temperaturverlauf der letzten Jahre (in Zehntelgrad Auflösung) aufzeichnet, kommt später.
:slight_smile:

Wie soll übrigens der Lüfter gesteuert werden und was hast du mit der Verdampfer-Temperatur vor?

Standard Kühlschränke werden über die Temperatur am Verdampferausgang geregelt.
2 Punkt Regelung, meist mit einer SEHR großen Hysterese, um 12 bis zu 20 Kelvin.
Das hat natürlich seine Gründe.
z.B. Kosten, und Wiedereinschaltverzögerung

Eine Regelung über die Innenraum Temperatur ist eher selten.
Ein solcher Sensor ist wohl meist nur für die Anzeige, also für menschliche Augen.

Größere Kühlgeräte (Klimaanlagen/Kühlhäuser) haben gerne eine Regelung über einen Innenraumsensor, und eine Kältemittelüberhitzungsregelung(automatisches Expansionsventil)

Daß er wegen des Lüfters nie vereisen kann, ist ein Trugschluß. Er vereist. Im besten Fall taut er in den Zeiten wo der Kompressor abgeschaltet ist wieder ab und das Kondenswasser tropft herunter.

Mein Vorschlag: Kauf die den orginalen Termostat und baue den ein.
Grüße Uwe

Na das ist ja jetzt eine schöne programmiertechnische Herausforderung bei der ich mich gerne engagiere. Ich habe keine Erfahrung damit, wie gut man die eventuelle Vereisung verhindern / hinauszögern kann. Aaaber wenn man jetzt für den Innenraum einen kombinierten Luftfeuchtigskeits- und Temperaturfühler nimmt dann wird ja auch die Luftfeuchtigkeit erfasst und dann kann man das beim Regeln mit berücksichtigen.
Wenn die Temperatur und Luftfeuchtigkeit direkt am Verdampfer sich den Null Grad nähert dann Kühlung für eine gewisse Zeit ausschalten.

Und: Wenn der Innenraum bei ca +8°C ist und der Ventilator den Verdampfer gleichmäßig anpustet dann dürfte das Vereisen sehr viel langsamer passieren oder auch gar nicht weil doch dann der ganze Verdampfer mit +8°-Luft "Wärme" zugeführt bekommt.

Ich habe mal in einer Käsekühltheke eine Menge DS18B20 Sensoren verteilt und mir dann die Temperaturverteilug angeschaut. Eben weil die Kühltheke nach dem Verkauf noch stundenlang weiterlief. Ohne Ventilator war da ordentlich Vereisung. Mit Ventilator war die Vereisung sehr viel weniger.

@hoefi : Hast du die NTC mal gemessen was für einen Widerstandswert die haben?
Davon hängt ab wie groß der Spannungsteilerwiderstand gewählt werden muss.

Kannst du mal Bilder posten wie der Winkühlschrank aussieht?
Kühlschrank als ganzes, Der Verdampfer und wo am Verdampfer das Kabel des vorhandenen NTC-Sensors langläuft, Den Kabelvrlauf des zweiten Sensors
Wo befindet sich der innere Ventilator? Und wohin pustet der Ventilator?

vgs

So jetzt habe ich mir den Sketch aus post # 3den noiasca überarbeit hat
angeschaut.

Dazu habe ich eine Frage
im Kommentar

// 3. mit dem Poti will ich die Temperatur im Kühlschrank einstellen. 
// (Kühlung und Lüfter sollen dabei Laufen)

Beim Einstellen der Solltemperatur sollen Kühlung und Lüfter laufen.
Was möchtest du da für ein Programmverhalten haben?
Sobald man am Poti dreht egal in welche Richtung dann sollen Lüfter und Ventilator eingeschaltet werden?

Was macht das für einen Unterschied zu Kühlung und Ventilator sind ausgeschaltet?
Das Drehen am Poti stellt einen anderen Sollwert ein. Der Kühlschrank ist aber kein Labornetzteil bei dem der Istwert innerhalb von weniger als einer Sekunde auf dem neuen Sollwert steht. Und wenn man von +2°C auf +8°C die Soll-Temperatur höher einstellt dann ist eine laufende Kühlung kontraproduktiv weil die laufende Kühlung ja das Erreichen der neuen Solltemperatur verzögert. Außerdem kommen sich dann die Anforderung
Poti gedreht Kühler/Lüfter ein in die Quere mit Temperaturregelung sagt "3°C ist schon viel zu kalt Kühlung und Ventilator aus!"

Was ist denn deine Überlegung warum du den Kühlung und Ventilator einschalten willst?

Ventilator ohne Kühlung würde noch einen Sinn machen wegen gleichmäßigerer Temperaturverteilung.
vgs

Wir reden hier von einem Kühlschrank mit Solltemperatur 4°C??.
Brauchst Du nicht. Ich kann Dir garantieren daß am Verdampfer 100% der Taupunkt unterschritten wird. Du braucht kühlere Luft um den Rest des Eiskastens zu kühlen. Die Verdampfungstemperatur bzw Verdampfungsdruck wird durch die Füllung auf negative Werte Temperaturwerte eingestellt.
Ich habe Erfahrung mit Kühlschränken für die Aufbewahrung von Blutkonserven. Da muß die Temperatur auf 4°C +/-2°C gehalten werden.
Da gibt es zur Vermeidung von Vereisung einerseits eine elektrische Heizung des Verdampfers bzw ein Ausschalten der Kühlmaschine alle 12/24h für 15 Min.
Dazu zu sagen ist auch daß ein schlecht arbeitender Kühlkreis (zB durch fehlen von Kühlmittel) sehr viel schneller vereist als ein korrekt funktionierender.

Grüße Uwe

Meinst du mit "Eiskasten" ein Tiefkühlfach?

Wie auch immer ich habe jetzt auf Wokwi eine Simulation gebastelt auf der man
die Werte wichtiger Variablen auf einem LCD ablesen kann.
Die Ausgabe ist in eine eigene function gepackt.
Außerdem habe ich dem Code meine drei debug-macros hinzugefügt.
Damit wird das Debuggen wesentlich einfacher.

@hoefi
Der Code auf WOKWI hat folgende Struktur

macros zum debuggen
DEIN CODE
Hilfs-function DatenAufLCDAusgeben();

Du kannst erst einmal
macros zum debuggen
und
Hilfs-function DatenAufLCDAusgeben();
ignorieren

Dein Code hat noch nicht funktioniert weil du bei diesen If-bedingungen das analogRead() vergessen hattest

if (analogRead(Raum) > (Poti + 100)) 
if (analogRead(Raum) < (Poti))

Das muss heissen

      if (analogRead(Raum) > (analogRead(Poti) + 100)) {//0-1023 einschaltwert

if (analogRead(Raum) > (analogRead(Poti) + 100)) {//0-1023 einschaltwert

      if (analogRead(Raum) < (analogRead(Poti) ) ) { //0-1023 ausschaltwert

if (analogRead(Raum) < (analogRead(Poti) ) ) { //0-1023 ausschaltwert

Es hat ziemlich lange gedauert bis ich das gemerkt habe.
Das das so lange gedauert hat liegt an den schlecht gewählten Variablennamen
Wenn da gestanden hätte

if (analogRead(Raum) < (PotiPin))

if (analogRead(Raum) < (PotiPin))

dann wäre das sofort ins Auge gesprungen
oh Moment mal nicht die IO-pin-Nr sondern den Zahlenwert des AD-Wandlers
nehmen

Die Weiterentwicklung und Wartung eines Programms wird viel einfacher und effizienter wenn man die Variablennamen SELSBT-erklärend macht.

So hier der Link zur WOKWI-Simulation

Was an Wokwi noch nicht so doll ist, ist das man nicht an alle Komponenten erklärende Namen dran schreiben kann.
Der Schiebepoti ist das Poti zum Einstellen der Solltemperatur
Wenn man die NTC-Sensoren anklickt kann man die Temperatur verändern
vgs

laut Oschpele - das Südtiroler Dialekt-Wörterbuch
und Südtirolerisch für Anfänger – Alpenjoy.de
Eiskostn ... Kühlschrank

Nein, nicht Tiefkühlfach.

Grüße Uwe

1 Like

jo als südtirolr verstoscht du schwäbisch gans guad und i als schwob vrstand südtirolrisch au ganz guad wenns net zu broid isch. I han viel frühr DSR3 ghört. Au e kule Mundart. Abr wenn oinr bloß cpepe kennt no kommt do net mit. No a Scherzfrog:

was isch a Elefele? Schprischs mol aus no dämmert's vileicht

Hob wianig Erfohrung mit gschriebnen Dialekt. Drum verstea i Di schwar. Wenn I Di hearn tat verstand i mear.

Hab wenig Erfahrung mit geschriebener Mundart. Darum fällt es mir schwer Dich zu entziffern. Gehört verstehe ich mehr.

Grüße Uwe