Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Hygromètre à miroir refroidi DIY Arduino – Surveillance précise température et humidité

Composants et fournitures

Outils et machines nécessaires

Applications et services en ligne

À propos du projet

À propos

Mesurer l'humidité peut se faire de plusieurs façons. La plus populaire utilise un capteur capacitif. Malheureusement, ces capteurs perdent rapidement en précision en fonctionnement continu en environnement très humide. Un hygromètre à miroir refroidi (chilled mirror hygrometer) n'a pas ce problème et est bien plus précis, surtout à haute humidité. Malheureusement, un hygromètre à miroir refroidi commercial coûte des milliers de dollars. Le principe de base est simple, il est donc possible d'en fabriquer un soi-même. Il n'aura pas la précision de 0,1 degré d'un appareil commercial, mais pour la plupart des usages il suffira, et sera certainement plus précis qu'un capteur capacitif.

Ce projet est une preuve de concept, pas prêt pour la production. De nombreuses améliorations sont possibles mais il prouve que ça fonctionne.

Comment ça marche

Un hygromètre à miroir refroidi utilise un module Peltier (TEC) pour refroidir une surface réfléchissante jusqu'à l'apparition de condensation. La condensation est détectée par une source lumineuse et un capteur optique. La température de la surface du miroir est enregistrée au moment où la condensation apparaît. Cette température équivaut au point de rosée. L'humidité relative peut alors être calculée à partir du point de rosée et de la température ambiante.

Simplifications par rapport au commercial

Comment construire

Prenez le Peltier, nettoyez les deux faces, et appliquez de l'adhésif thermoconducteur sur la face chaude. Assurez une distribution uniforme. Sans adhésif thermoconducteur, vous pouvez utiliser de la pâte thermique avec quelques gouttes de super-glue près des bords. Ça marche aussi bien. Nettoyez la surface du dissipateur et pressez dissipateur et Peltier ensemble, laissez sécher la colle.

Une fois le dissipateur fixé et la colle sèche, fixez le miroir de la même façon, en nettoyant d'abord la face inférieure. Il est important que la pâte thermique soit uniformément répartie et sans bulles d'air, sinon la distribution de chaleur sur le miroir sera non uniforme.

Quand tout est sec, fixez le ventilateur. Utilisez un ventilateur assez puissant pour refroidir le dissipateur qui devient très chaud. La fixation dépend du type de dissipateur. J'ai juste collé les deux au pistolet à colle.

Hygromètre à miroir refroidi DIY Arduino – Surveillance précise température et humidité

Alimentez le ventilateur, puis le Peltier pour vérifier qu'il y a au moins deux zones sur le miroir où la condensation apparaît simultanément. N'alimentez pas le Peltier trop longtemps car cela créera un profil de condensation uniforme. Vous voulez voir à quoi ça ressemble quand la condensation devient juste visible. Si le résultat ne vous convient pas, recommencez avec un nouveau Peltier, miroir et dissipateur car il est peu probable de pouvoir retirer les pièces et restaurer la surface lisse.

Hygromètre à miroir refroidi DIY Arduino – Surveillance précise température et humidité
Hygromètre à miroir refroidi DIY Arduino – Surveillance précise température et humidité

Je n'ai pas réparti uniformément la pâte thermique, résultant en un profil de condensation irrégulier comme sur la photo ci-dessus.

Il est important de photographier ou marquer la zone où la condensation apparaît simultanément, car c'est là qu'il faut monter le capteur de température de surface du miroir et mesurer la lumière réfléchie.

Dans ce projet, j'utilise un Si7021 pour mesurer la température du miroir car il donne une sortie à faible bruit. Malheureusement, son adresse I2C est codée en dur, donc on ne peut en utiliser qu'un seul. Pour la température ambiante, j'utilise un DS18B20 mais sa précision n'est pas très élevée. Je les utilise simplement parce que je les avais sous la main.

Pour monter le Si7021 (ou tout capteur PCB) sur le miroir : déposez une grosse goutte de pâte thermique non conductrice électriquement sur le capteur. Le PCB doit aussi être recouvert de pâte thermique pour éviter la condensation sur l'électronique. Placez 4 gros tas de colle chaude sur chaque coin du PCB. Agissez vite. Pressez le capteur contre le miroir à l'endroit où la condensation apparaissait uniformément. Assurez-vous de placer le capteur horizontalement et pressez fermement. La colle chaude durcit vite au contact du miroir. Si vous devez repositionner, grattez au cutter, décollez la colle et réessayez. S'il y a condensation sur le PCB, isolez-le avec de la colle chaude ou du plastique en spray.

Hygromètre à miroir refroidi DIY Arduino – Surveillance précise température et humidité

Le ventilateur est piloté par un module MOSFET IRF520.

Le capteur de lumière utilisé est un OPT101, sensible, faible bruit, facile à utiliser.

Pour la source lumineuse, vous pouvez utiliser une diode laser faible puissance ou une LED classique. J'ai testé les deux, les deux fonctionnent. Le laser a l'avantage d'une meilleure réponse mais est plus dur à aligner. La LED a une réponse plus plate car plus de lumière est diffusée, mais plus facile à aligner. Si vous utilisez une LED, assurez-vous qu'elle émet un faisceau focalisé.

La sortie lumineuse de la LED ou du laser est probablement trop forte, et utiliser le PWM pour la réduire n'est pas une option car cela créerait des interférences dans le capteur de lumière. Placez simplement une résistance en série avec la LED ou le laser pour réduire la sortie.

Pour monter la LED/laser et l'OPT101, j'ai utilisé du fil de cuivre torsadé en fil de verrouillage pour plus de rigidité. Les deux extrémités fixées à la colle chaude. C'est bien pour une preuve de concept mais trop fragile pour sortir du labo (ou du sous-sol). Un support imprimé en 3D serait mieux, d'autant qu'un boîtier 3D anti-lumière est indispensable pour éviter les interférences.

Hygromètre à miroir refroidi DIY Arduino – Surveillance précise température et humidité

Pour piloter le Peltier, on utilise un driver moteur BTS7960. La façon la plus efficace de piloter un Peltier est de varier le courant, pas le PWM. Mais les contrôleurs Peltier ne sont pas aussi disponibles que le BTS7960, et pour cette preuve de concept, la consommation n'est pas un facteur.

Hygromètre à miroir refroidi DIY Arduino – Surveillance précise température et humidité

Une fois assemblé, téléversez le code sur l'Arduino et ajustez la plage de sensibilité de l'OPT101 avec un potentiomètre. Une résistance plus haute = tension de sortie plus haute pour même lumière. Référez-vous au datasheet OPT101, Figure 3 - Responsivité tension vs irradiance. Pour débugger, soufflez sur le miroir pour créer de la condensation, ou placez un objet devant le capteur. Si vous avez un climatiseur, allumez/éteignez-le et attendez. Vous verrez le changement d'humidité.

Sur le graphique ci-dessous : température (bleu), lecture optique (rouge), point de rosée mesuré (vert). On voit le point de rosée monter quand j'éteins le climatiseur.

Hygromètre à miroir refroidi DIY Arduino – Surveillance précise température et humidité

Sécurité

Bien que le code fourni ne le supporte pas, le matériel peut chauffer le miroir en plus de le refroidir, en inversant simplement la polarité du Peltier. Le chauffage du miroir peut servir à évacuer rapidement la condensation et améliorer le temps de réponse. De plus, l'évaporation flash élimine les petits contaminants. Cependant, cela pose un risque de sécurité car la surface du miroir n'a pas de dissipateur. Si le code bloque en mode chauffage, au mieux il fera fondre la colle tenant le thermomètre, au pire il déclenchera un incendie par court-circuit sur fils fondus.

Précision

Comme le point de rosée mesuré est une valeur absolue, la calibration n'est pas aussi critique qu'avec un hygromètre capacitif ou résistif. Cependant, il y aura au moins une différence de température entre la zone du capteur de surface du miroir et la zone de détection optique. Pour vérifier la précision, vous pouvez calibrer avec un hygromètre à miroir refroidi commercial étalonné.

Quant à la contamination du miroir, c'est seulement partiellement un problème. La lecture de lumière réfléchie n'est pas absolue mais relative au début d'un cycle de refroidissement. Au début, le miroir est sans condensation. La quantité de lumière réfléchie est mesurée et sert de référence pour détecter la condensation. Si le miroir est contaminé et réfléchit moins de lumière, cela ne devrait pas affecter la détection. Cependant, certains contaminants abaissent ou augmentent la température de condensation, donc pour une meilleure précision, nettoyez le miroir de temps en temps.

Les capteurs de température miroir et ambiant n'ont pas besoin d'une précision étalonnée élevée, mais la résolution doit être haute. Exemple : si la température réelle est 24,0 °C mais mesure 24,5 °C, c'est acceptable tant que les deux thermomètres mesurent 24,5 °C (normalisable) et que le chiffre ne fluctue que d'un dixième. Beaucoup de thermomètres ont un bruit de 0,2 ou 0,3 °C. Mieux vaudrait utiliser un capteur TSYS01 pour les deux mesures, offrant la même précision qu'une PRT (0,1 °C).

Il est impératif que le capteur de température fasse bon contact avec la surface du miroir. L'usage de pâte thermique non conductrice électriquement est obligatoire.

Ne refroidissez pas le miroir plus vite que le temps de réponse du thermomètre, sinon le point de rosée mesuré sera inexact.

Le capteur de température doit être placé sur une zone du miroir où la condensation de la zone de détection optique apparaît simultanément.

Monter un capteur de température sur la surface du miroir modifie la distribution de chaleur, réduisant la précision. Il serait tentant d'utiliser un thermomètre infrarouge mais le miroir refléchit une partie du rayonnement thermique, faussant la mesure par l'environnement.

Hygromètre à miroir refroidi DIY Arduino – Surveillance précise température et humidité

Techniquement, une lecture d'humidité dépend aussi de la pression barométrique mais l'effet est très faible en ambiance normale. Tout changement de pression causé par des portes claquant, vent extérieur créant une pression différentielle dans un bâtiment causera probablement plus de problèmes que ça n'en vaut la peine.

L'air chaud du dissipateur du Peltier ne doit pas être aspiré vers le miroir.

Une chute de température lente donnera des lectures plus précises, mais augmentera le temps de réponse. Le temps de réponse peut être amélioré en oscillant la température près du point de rosée.

Code

Hygromètre à miroir refroidi (C/C++)

#include <math.h>
#include <avr/wdt.h> // Détection crash watchdog
// Bibliothèques personnalisées
#include "Si7021.h" // Capteur humidité avec chauffage
#include <OneWire.h> // DS18B20
#include <DallasTemperature.h> // DS18B20
// Bibliothèque Timer: https://github.com/brunocalou/Timer
#include "timer.h"
#include "timerManager.h"

// Définition broches matérielles Arduino
#define coolingPWM 6
#define heatingPWM 5
#define coolingEnable 13
#define heatingEnable 12
#define tecFan 7
#define opticalSensor 0 // Analogique
#define oneWireBus A3 // DS18B20

// État du TEC
#define COOLING 0
#define HEATING 1
#define OFF 2

// Timers
Timer timerMainLoop;
Timer timerTecCooling;
Timer timerSampleNoise;

// Capteur température (humidité non utilisée)
Si7021 si7021;
// DS18B20
OneWire oneWire(oneWireBus);
DallasTemperature sensors(&oneWire);

float humidity = 0;
float ambientTemp = 0;
float opticalDewpoint = 0;
// Valeurs initiales plus hautes pour échelle Serial Plotter correcte
float mirrorTemp = 30;
float optical = 30;
float dewPoint = 15; // initial doit être < mirrorTemp
float relativeHumidity = 30;
int tecState = OFF;
bool cooling = false;
int intervalTecCooling = 200; // ms
float opticalThreshold = 0.5f; // Seuil détection condensation (doit être > bruit)
int pwmIncrement = 1;
int startPwm = 100;
int maxPwm = 255;
int intervalMainLoop = 200;
int tecPwm = 0;
int noiseSampleIndex = 0;
int noiseSampleAmount = 10;
float noiseSampleHighest = 0;
float noiseSampleLowest = 10000;
bool noiseSampling = false;

float calculateHumidity(float TD, float T) {
  // Le point de rosée ne peut pas être plus haut que la température
  if (TD > T) TD = T;
  // Approximation August-Roche-Magnus
  float rh = 100 * (exp((17.625 * TD) / (243.04 + TD)) / exp((17.625 * T) / (243.04 + T)));
  return rh;
}

// Régler TEC : chauffage, refroidissement, ou arrêt
void SetTEC(int state, int amount) {
  tecState = state;
  // Note : pour chauffage ET refroidissement, les broches heating ET cooling doivent être HIGH. Demandez au concepteur PCB pourquoi.
  // Driver : BTS7960. PWM pour piloter TEC n'est pas efficace, mieux vaut source de courant variable.
  switch (state) {
    case COOLING:
      digitalWrite(heatingEnable, HIGH);
      analogWrite(heatingPWM, 0);
      digitalWrite(coolingEnable, HIGH);
      analogWrite(coolingPWM, amount);
      break;
    case HEATING:
      digitalWrite(coolingEnable, HIGH);
      analogWrite(coolingPWM, 0);
      digitalWrite(heatingEnable, HIGH);
      analogWrite(heatingPWM, amount);
      break;
    case OFF:
      digitalWrite(coolingEnable, LOW);
      analogWrite(coolingPWM, 0);
      digitalWrite(heatingEnable, LOW);
      analogWrite(heatingPWM, 0);
      break;
    default:
      digitalWrite(coolingEnable, LOW);
      analogWrite(coolingPWM, 0);
      digitalWrite(heatingEnable, LOW);
      analogWrite(heatingPWM, 0);
  }
}

void setup() {
  // Watchdog pour sécurité : évite TEC bloqué en chauffage
  wdt_enable(WDTO_2S); // WDTO_500MS / WDTO_1S
  Serial.begin(9600); // ou 57600
  pinMode(coolingPWM, OUTPUT);
  pinMode(heatingPWM, OUTPUT);
  pinMode(coolingEnable, OUTPUT);
  pinMode(heatingEnable, OUTPUT);
  pinMode(tecFan, OUTPUT);
  pinMode(opticalSensor, INPUT);

  // Timers
  timerMainLoop.setInterval(intervalMainLoop);
  timerMainLoop.setCallback(mainLoop);
  timerMainLoop.start();
  timerTecCooling.setInterval(intervalTecCooling);
  timerTecCooling.setCallback(tecCoolingCallback);
  timerSampleNoise.setInterval(intervalTecCooling);
  timerSampleNoise.setCallback(sampleNoiseCallback);

  // Si7021
  uint64_t serialNumber = 0ULL;
  si7021.begin();
  serialNumber = si7021.getSerialNumber();

  // DS18B20
  sensors.begin();

  // Désactiver logs debug capteur pour graphique correct
  /*
  Serial.print("Si7021 serial number: ");
  Serial.print((uint32_t)(serialNumber >> 32), HEX);
  Serial.println((uint32_t)(serialNumber), HEX);
  Serial.print("Si7021 firmware version: ");
  Serial.println(si7021.getFirmwareVersion(), HEX);
  */

  startNoiseSampling();
}

// Lecture capteur optique
float getOptical() {
  int opt = analogRead(opticalSensor);
  float optFactored = (float)opt / 30.0f;
  return optFactored;
}

// Callback timer refroidissement TEC
void tecCoolingCallback() {
  digitalWrite(tecFan, HIGH);
  // Augmenter lentement la puissance TEC
  tecPwm += pwmIncrement;
  if (tecPwm > maxPwm) tecPwm = maxPwm;
  SetTEC(COOLING, tecPwm);
  // Condensation détectée ?
  if (optical <= (noiseSampleLowest - opticalThreshold)) {
    // Enregistrer point de rosée
    dewPoint = mirrorTemp;
    opticalDewpoint = optical;
    stopTec();
  }
}

void startNoiseSampling() {
  noiseSampling = true;
  noiseSampleHighest = 0;
  noiseSampleLowest = 10000;
  timerSampleNoise.start();
}

void sampleNoiseReset() {
  timerSampleNoise.stop();
  noiseSampleIndex = 0;
  noiseSampling = false;
}

void sampleNoiseCallback() {
  if (noiseSampleIndex > noiseSampleAmount) {
    sampleNoiseReset();
    startTecCooling();
  } else {
    if (optical > noiseSampleHighest) noiseSampleHighest = optical;
    if (optical < noiseSampleLowest) noiseSampleLowest = optical;
  }
  noiseSampleIndex++;
}

void startTecCooling() {
  cooling = true;
  digitalWrite(tecFan, HIGH);
  tecPwm = startPwm;
  timerTecCooling.start();
}

void stopTec() {
  cooling = false;
  digitalWrite(tecFan, LOW);
  timerTecCooling.stop();
  SetTEC(OFF, 0);
}

// Timer non-bloquant boucle principale
void mainLoop() {
  // DS18B20 température ambiante
  sensors.setResolution(10); // avant chaque mesure, résolution plus haute = plus lent
  sensors.requestTemperatures();
  ambientTemp = sensors.getTempCByIndex(0);

  // Si7021 température miroir
  mirrorTemp = si7021.measureTemperature();

  // Lecture optique
  optical = getOptical();

  relativeHumidity = calculateHumidity(dewPoint, ambientTemp);

  /*
  // Format lisible
  Serial.print("dewPoint: "); Serial.println(dewPoint, 2);
  Serial.print("mirrorTemp: "); Serial.println(mirrorTemp, 2);
  Serial.print("ambientTemp: "); Serial.println(ambientTemp, 2);
  Serial.print("relativeHumidity: "); Serial.println(relativeHumidity, 2);
  */

  // Pour Serial Plotter
  Serial.print(mirrorTemp, 2); Serial.print(" ");
  Serial.print(optical, 2); Serial.print(" ");
  Serial.println(dewPoint, 2);
  // Serial.print(" "); Serial.println(relativeHumidity, 2);

  // Attendre disparition condensation
  if (!cooling && !noiseSampling && (optical >= noiseSampleLowest)) {
    startNoiseSampling();
  }
}

void loop() {
  // Watchdog
  wdt_reset();
  // Mise à jour timers
  TimerManager::instance().update();
}

Schémas

Hygromètre à miroir refroidi DIY Arduino – Surveillance précise température et humidité

Processus de fabrication

  1. La science et l'art du miroir moderne
  2. Construire un Spybot Arduino piloté par Bluetooth
  3. FlickMote : Télécommande IR à gestes pour maison connectée
  4. TV-B-Gone DIY Arduino : Télécommande universelle pour toutes les TV
  5. Miroir infini kaléidoscope DIY – Construire un affichage LED époustouflant
  6. Construire une horloge maître LED personnalisée avec alarme – Visible à 12 mètres
  7. Find Me : Localisateur d'objets intelligent avec Arduino et Bluetooth
  8. Solutions d'alimentation optimisées pour projets Arduino
  9. Morpion sur matrice LED MAX7219 avec boîtier en carton