Régulation en température(à 37°C) avec un module Peltier

Bonjour à tous !
Déjà merci aux personnes présentes sur ce forum pour aider ceux qui comme moi se lance dans l’arduino pour réaliser des petits projets d’électronique malgré ma profonde méconnaissance du code.

J’espère que je ne me suis pas tromper quant à la publication de ce post mais si c’est la cas n’hésiter pas à me le signaler. Également si jamais je ne suis pas clair dans ce que je raconte ou si je le fais mal n’hésiter pas à me le signaler aussi.

Alors voilà, je suis en début d’études d’ingénierie et je tente un petit projet : j’essaye de réaliser un « incubateur » soit en fait une enceinte calorifugée d’un petit volume (20cm**3 environ donc rien d’énorme). Mon projet est de maintenir la température à l’intérieur de cette boîte à 37°C à l’aide de modules Peltier dont voici la référence (https://peltiermodules.com/peltier.datasheet/TEC1-12706.pdf)

J’ai deux modules avec des dissipateurs thermiques qui sont déjà « encastrés » dans ma boîte, une face 1 qui est à l’intérieur de la boîte et une face 2 qui est à l’extérieur de la boîte. (je vais garder ces notations par la suite.)

En réalité il ne me reste ‘’juste’’ qu’à réaliser le code arduino qui contrôlerait mon asservissement.

Voici comment je voudrais procéder grossièrement : si la température est en dessous de 35°C mes Peltier sont alimentés avec une différence de potentiel de +7V ce qui (avec les branchements réalisés) réchaufferait les faces 1 et donc l’intérieur de la boîte. Si la température est au dessus de 39°C, les Peltier sont alimentés avec une différence de potentiel de -7V, ce qui cette fois refroidit les faces 1.

En théorie le code m’a l’air assez simple, mais j’ai quelques blocages.

Alors, voilà ce dont je dispose :
-J’ai 3 sondes DS18B20 avec lesquelles je mesure la température à trois endroits différents de l’intérieur de la boîte pour ensuite travailler avec la moyenne de ces trois températures (j’ai choisi trois sondes afin aussi de pouvoir vérifier un certain critère d’homogénéité dans ma boîte)

J’ai déjà un programme pris dans la bibliothèque DallasTemperature qui me permet de mesurer les températures, programme que je vous mets ici. Ce programme est fonctionnel.

// Include the libraries we need
#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2
#define TEMPERATURE_PRECISION 12
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

// arrays to hold device addresses
DeviceAddress one, two, three;

// Assign address manually. The addresses below will need to be changed
// to valid device addresses on your bus. Device address can be retrieved
// by using either oneWire.search(deviceAddress) or individually via
// sensors.getAddress(deviceAddress, index)
// DeviceAddress insideThermometer = { 0x28, 0x1D, 0x39, 0x31, 0x2, 0x0, 0x0, 0xF0 };
// DeviceAddress outsideThermometer   = { 0x28, 0x3F, 0x1C, 0x31, 0x2, 0x0, 0x0, 0x2 };

void setup()
{
  // start serial port
  Serial.begin(9600);
  Serial.println("Dallas Temperature IC Control Library Demo");

  // Start up the library
  sensors.begin();

  // locate devices on the bus
  Serial.print("Locating devices...");
  Serial.print("Found ");
  Serial.print(sensors.getDeviceCount(), DEC);
  Serial.println(" devices.");

  // report parasite power requirements
  Serial.print("Parasite power is: ");
  if (sensors.isParasitePowerMode()) {
    Serial.println("ON");
  }
  else {
    Serial.println("OFF");
  }

  // Search for devices on the bus and assign based on an index. Ideally,
  // you would do this to initially discover addresses on the bus and then
  // use those addresses and manually assign them (see above) once you know
  // the devices on your bus (and assuming they don't change).
  //
  // method 1: by index
  if (!sensors.getAddress(one, 0)) { 
    Serial.println("Unable to find address for Device 0"); }
  if (!sensors.getAddress(two, 2)) { 
    Serial.println("Unable to find address for Device 2"); }
  if (!sensors.getAddress(three, 1)) {
    Serial.println("Unable to find address for Device 1"); }

  // method 2: search()
  // search() looks for the next device. Returns 1 if a new address has been
  // returned. A zero might mean that the bus is shorted, there are no devices,
  // or you have already retrieved all of them. It might be a good idea to
  // check the CRC to make sure you didn't get garbage. The order is
  // deterministic. You will always get the same devices in the same order
  //
  // Must be called before search()
  //oneWire.reset_search();
  // assigns the first address found to insideThermometer
  //if (!oneWire.search(insideThermometer)) Serial.println("Unable to find address for insideThermometer");
  // assigns the seconds address found to outsideThermometer
  //if (!oneWire.search(outsideThermometer)) Serial.println("Unable to find address for outsideThermometer");

  // show the addresses we found on the bus
  Serial.print("Device 0 Address: ");
  printAddress(one);
  Serial.println();

  Serial.print("Device 1 Address: ");
  printAddress(two);
  Serial.println();

  Serial.print("Device 2 Address: ");
  printAddress(three);
  Serial.println();

  
  // set the resolution to 9 bit per device
  sensors.setResolution(one, TEMPERATURE_PRECISION);
  sensors.setResolution(two, TEMPERATURE_PRECISION);
  sensors.setResolution(three, TEMPERATURE_PRECISION);

  Serial.print("Device 0 Resolution: ");
  Serial.print(sensors.getResolution(one), DEC);
  Serial.println();

  Serial.print("Device 1 Resolution: ");
  Serial.print(sensors.getResolution(two), DEC);
  Serial.println();

  Serial.print("Device 1 Resolution: ");
  Serial.print(sensors.getResolution(three), DEC);
  Serial.println(); 
}

// function to print a device address
void printAddress(DeviceAddress deviceAddress)
{
  for (uint8_t i = 0; i < 8; i++)
  {
    // zero pad the address if necessary
    if (deviceAddress[i] < 16) Serial.print("0");
    Serial.print(deviceAddress[i], HEX);
  }
}

// function to print the temperature for a device
void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  if(tempC == DEVICE_DISCONNECTED_C) 
  {
    Serial.println("Error: Could not read temperature data");
    return;
  }
  Serial.print("Temp C: ");
  Serial.print(tempC);
  Serial.print(" Temp F: ");
  Serial.print(DallasTemperature::toFahrenheit(tempC));
}

// function to print a device's resolution
void printResolution(DeviceAddress deviceAddress)
{
  Serial.print("Resolution: ");
  Serial.print(sensors.getResolution(deviceAddress));
  Serial.println();
}

// main function to print information about a device
void printData(DeviceAddress deviceAddress)
{
  Serial.print("Device Address: ");
  printAddress(deviceAddress);
  Serial.print(" ");
  printTemperature(deviceAddress);
  Serial.println();
}

/*
   Main function, calls the temperatures in a loop.
*/
void loop(void)
{
  // call sensors.requestTemperatures() to issue a global temperature
  // request to all devices on the bus
  Serial.print("Requesting temperatures...");
  sensors.requestTemperatures();
  Serial.println("DONE");

  // print the device information
  printData(one);
  printData(two);
  printData(three);
  delay(1000);
}

Je me demandais par ailleurs si vous saviez comment je pourrai récupérer les valeurs afficher à la toute fin du programme (« printData(one) ») afin de réaliser ma moyenne, (donc en fait ((one+two+three)/3), opération que ne peux pas réaliser mais ce n’est pas mon plus gros problème.

-J’ai une carte arduino UNO et un grove based shield

-Et on arrive au cœur du problème, j’ai un module I2C motor driver V1.3 (Grove - I2C Motor Driver V1.3 - Seeed Wiki) que l’on m’a fourni afin que je l’utilise pour pouvoir alimenter mes modules dans des tensions supérieures à 5V et aussi pour pouvoir profiter du hâcheur intégré afin de pouvoir alimenter soit en +7V soit en -7V. J’ai de quoi alimenter ce module à la bonne tension par le réseau.

Ce module est normalement utilisé pour alimenter des moteurs, comme c’est le cas par exemple dans ce code dans la librairie « Grove_I2C_Motor_Driver.h » qui permet d'alimenter deux moteurs et de pouvoir changer le sens de rotation du moteur (en changeant le signe de la différence de potentiel je présume)

#include "Grove_I2C_Motor_Driver.h"

// default I2C address is 0x0f
#define I2C_ADDRESS 0x0f

void setup() {
  Motor.begin(I2C_ADDRESS);
}

void loop() {
  // Set speed of MOTOR1, Clockwise, speed: -100~100 
  Motor.speed(MOTOR1, 50);
  // Set speed of MOTOR2, Anticlockwise
  Motor.speed(MOTOR2, -70);
  delay(2000);
  // Change speed and direction of MOTOR1
  Motor.speed(MOTOR1, -100);
  // Change speed and direction of MOTOR2
  Motor.speed(MOTOR2, 100);
  delay(2000);
  // Stop MOTOR1 and MOTOR2
  Motor.stop(MOTOR1);
  Motor.stop(MOTOR2);
  delay(2000);
}

Je me demande ainsi comment adapter ce code (ou utiliser ce module) à ce que je souhaite faire, notamment savoir quelle est la tension en sortie de mon alimentation en fonction de la vitesse de rotation d’un supposé moteur ? (soit, comment avoir +/-7V à la sortie de mon module I2C.

Voilà je vous remercie de votre lecture et de votre temps, bonne journée à tous !

Concernant ton problème de moyenne, il suffit de convertir la procédure void printTemperature(deviceAddress) en une fonction float printTemperature(DeviceAddress deviceAddress) où la valeur retournée sera la température remontée par le capteur, puis de faire la moyenne des 3 valeurs qui auront été retournées par les printTemperature(one), printTemperature(two) et printTemperature(three) et diviser cette somme par 3 pour avoir la moyenne

Concernant la gestion des plaques pelletier, je pense qu'il vaudrait mieux y gérer un asservissement plus "souple/analogique" que des salves/plateaux "tout ou rien" en -7V / +7V via la commande moteur, via une boucle de rétroaction du style voltage = (consigne - temperature actuelle) * coefficient_de_retroaction, avec coefficient_de_rétroaction = 7V / temperature de consigne = 7V / 37 degrées = 0.189... ou une petite valeur du style
(tu remplacerais alors la commande moteur par des transistors alimentés en +-7V et commandés par des sorties PWM de l'arduino par exemple)

Salut,
... Ou alors peut-être juste une alim 7v et un simple relais inverseur piloté par une banale sortie digitale.

En ingénierie, on ne se contente pas de spécifications aussi vagues en général.
Il doit y avoir une température à tenir avec une tolérance, un temps de monté peut-être et une valeur de dépassement au-dessus et en-dessous de la consigne?
Tu parles d'incubateur. Par exemple, pour incuber des œufs de crocodiles à 2 degrés près on a soit des mâles, soit des femelles.
Les spécifications doivent aider au choix de la solution:

  • si on autorise 37°+/- 3° un asservissement avec des relais fera peut-être l'affaire
  • si on demande de tenir +/-1° il va peut-être falloir être un peut plus exigent et passer à un PID pilotant le driver de moteur
    Pour l'homogénéité de la température dans l'enceinte, personnellement, je considérerais l'utilisation d'un petit ventilateur pour éviter les points chauds

Bonjour, pour avoir déjà réalisé ce genre de projet, j'ai utiliser une résistance de dégivrage de frigo qui enroulait un tube métal de 70cm de diamètre et de 5cm de haut, avec un moteur de PC poser sur son sommet.

Bonjour, déjà merci de vos réponses à tous !

@Yannoo
D'accord, merci pour la température moyenne, je me doutais que l'erreur venait d'un problème des types d'objets que je manipulais mais je ne savais pas vraiment comment le régler, je vais essayer votre méthode.

Pour ce qui est de la gestion des plaques Peltiers que vous proposez c'est vrai que cela me semble pertinent comme idée, je vais garder cette piste pour la suite.

@frenchydude08
En réalité je souhaite tester plusieurs valeurs d'alimentation mettons entre 3 et 10V pour pouvoir comparer les différentes évolutions de la température et comme je disposais de ce module I2C qui peut me permettre de commander le taux de modulation du hacheur intégré, je me disais que l'utilisation du matériel que j'avais était pertinent, mais je vais me renseigner sur ce que vous m'avez proposé.

@fdufnews Il est vrai que j'ai été vague quant aux exigences que j'avais pour ce projet, je ne voulais pas vraiment noyer le sujet de tout mon cahier des charges relatif à l'incubateur.
La température à tenir est de 37°C (température du corps humain), il est vrai que la véritable exigence de température serait de tenir +/-1°C donc il y aurait la nécessité d'un correcteur.
Je comptais réaliser mes premieres mesures et ensuite selon mon évolution de température (qui devrait être un premier ordre selon moi), je comptais alors essayer d'envisager comment dimensionner mon correcteur pour répondre aux exigences que je me suis fixés. J'en suis, pour le moment, à la phase où j'aimerai observer mes premières courbes avec ce que j'ai pour ensuite améliorer le système là où il y aurait des lacunes dans mes exigences de précision et de rapidité.

@d_jo
Désolé, Je ne suis pas certain de saisir votre système, la résistance de dégivrage servait à chauffer légèrement votre tube de métal ? Pour quelle utilisation ?

Désolé pour la réponse un peu tardive dans la journée et encore merci à tous pour les conseils !

Je n'avais pas vu que vous vouliez faire du chaud et du froid pour regulé, je ne savais pas que le peltier pouvais faire que du chaud ou que du froid .... mais si l'incubateur est dans une piece plus froide , la dissipation thermique des parois de celui-ci peut a elle seule faire descendre la temperature, une gestion par PID pourrait etre suffisantes sur une resistance chauffante?

On l'obtient en changeant le sens du courant dans la cellule Peltier

2 Likes

La proposition de d_jo est pertinente car c'est vrai qu'il n'y a pas spécialement besoin de refroidir l'enceinte via la partie froide d'un peltier si celle-ci peut naturellement se refroidir en étant placé dans une pièce à moins de 37°, en utilisant des parois en métal par exemple
=> dans ce cas, l'utilisation d'une simple résistance chauffante + gestion PID suffira car plus besoin d'un système de refroidissement, celui-ci se faisant alors de façon naturelle via les parois en métal
(tu peux aussi utiliser un ventilateur pour forcer l'arrivée d'air frais dans l'enceinte lorsque la température dans celle-ci est trop chaude => à tester avec les parois en métal et/ou avec le ventilateur pour voir ce qui convient le mieux)

Tout va dépendre du temps de réponse demandé et de la précision demandé.
Le refroidissement par convection naturelle est un peu "escargolesque" et l'inertie thermique n'est pas facile à gérer.

Dans ce cas il ne faut pas d'isolation thermique, est-ce vraiment adapté à ce projet ?
J'en doute.

Si le module Peltier a une capacité de chauffe ou de refroidissement suffisante, c'est une bonne solution.
Il faut que l'intérieur de l'enceinte soit bien isolée, moins il y aura d'amplitude à réguler plus la régulation sera précise, mais il faut aussi un très bon radiateur sur la face externe du module Peltier.

Ne pas oublier qu'une des caractéristiques des modules Peltier est que la différence de température entre la face chaude et la face froide est limitée à une trentaine de degrés (voir la datasheet pour le chiffre exact).
Pour faire du froid on consomme du courant, manque de chance à partir d'une valeur critique le courant produira plus de calories par effet Joule que de "frigories" par effet Peltier -> plus on veut refroidir, plus en réalité on chauffe.

Conséquence : quand on refroidit, la face externe devient la face chaude et plus la température de la pièce est élevée plus la face externe du module chauffe, c'est le cas le plus défavorable. Il faut surveiller la différence de température face froide face chaude.

Il est peut-être possible si l'enceinte est placée dans une pièce qui est systématique à une température inférieure à la température de consigne de mixer chauffage permanent par résistance pour faire une partie du chemin et de compléter par un module Peltier qui n'aura qu'une faible amplitude de régulation à assurer.

Mes 5 cts.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.