Outils pour utilisateurs


Modification d'un réfrigerateur pour une régulation fine de la température

L'idée

Avec un frigo récupéré, on installe un petit régulateur de température à base d'arduino pour maintenir une température précise.

Principe

L'arduino analyse la température en temps réel via la sonde et commute le relais lorsque la température est trop élevée. Lorsque la température cible est atteinte, l'arduino commande la fermeture du relais. Les interrupteurs seront une solution simple pour choisir la température cible.

Une solution envisageable est d'utiliser une ampoule de 60W pour l'opération inverse. (ce qui pourra être utile en hiver).

Composants

  • un arduino nano v3 (attention ! 4,78V Max)
  • un ou deux relais 220V (vérifier la puissance supportée)
  • 1 interrupteur SPDT
  • une sonde de température DS18B20
  • des résistances
  • Un step-up pour obtenir 5V si utilisation de Nano (pas nécessaire sous UNO)

Utilisation

Le relais est placé sur le câble d'alimentation du réfrigérateur (ce dernier est placé en froid maximum). L'interrupteur sélectionne une température cible de 5 ou 20°C La sonde est placée dans le réfrigérateur voire scotchée au fermenteur.

Le code

#include <OneWire.h>
#include <DallasTemperature.h>

int SwitchPin = 13;
int RelayPin = 12;

int TargetTemp;
int TempRead;
int SwitchState;
int RelayState;

#define ONE_WIRE_BUS 2

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

void setup()
{
// start serial port (DEBUG purposes)
Serial.begin(9600);
sensors.begin();

pinMode(SwitchPin, INPUT);
pinMode(RelayPin, OUTPUT);
digitalWrite(RelayPin, HIGH);
}

void loop() 
{
Serial.println("Cycle : 600000 : 10 minutes");
// On lit la config souhaitée sur le switch
ReadSetupTarget();

// On lit la temp
GetTempFromSensor();

// On active le relais au besoin
ActivateRelayIfNecessary();

// On attend 5 minutes
delay(600000);
  
}

// Fonction de lecture de la température
int GetTempFromSensor()
{
  sensors.requestTemperatures();
  Serial.println("requestTemperatures : OK!");
  TempRead = sensors.getTempCByIndex(0);
   Serial.println(sensors.getTempCByIndex(0));
  return TempRead;
}

// Fonction de lecture de l'état du switch (target)
int ReadSetupTarget()
{
  SwitchState = digitalRead(SwitchPin);
  if (SwitchState == HIGH)
  {
    TargetTemp = 5;
     Serial.println("Le switch indique une temperature cible de 5C");
     Serial.println(SwitchState);
     return TargetTemp;
     
  }
  else
    TargetTemp = 20;
    Serial.println("Le switch indique une temperature cible de 20C");
    return TargetTemp;
}

//Fonction d'activation du relais 
int ActivateRelayIfNecessary()
{
  
  if (TempRead > TargetTemp)
  {
    digitalWrite(RelayPin, LOW);
    Serial.println("La temperature est superieure a la temperature cible on active le relais");
    return RelayState;
  }
  else
    digitalWrite(RelayPin, HIGH);
    Serial.println("La temperature est correcte, le relais est place en off");
}