[Conseil] Projet de ventilaion Double Flux DIY avec Arduino

Bonjour à tous!
Je suis en cours de conception d'un module de ventilation double flux à pas cher, dont j'ai écrit le tuto de fabrication sur le site du Low Tech Lab: Double_Flux_pour_habitat_leger.
Je suis nouveau sur tout ce qui est Arduino /code et ai pas beaucoup aimé l'électronique dans mes études.... donc c'est compliqué pour moi, toujours est-il que j'ai lu quelques bouquins sur le sujet. En outre, tout reste théorique, je n'ai actuellement pas fait les investissements sans être sur d'avoir un code qui marche.

Le but: faire varier la vitesse de 2 ventilateurs de PC 12V (diam. 120 mm) en fonction de l'humidité de la maison.
Plus c'est humide, plus les ventilos tournent (l'un extrait l'air, l'autre en amène). En dessous d'une certaine valeur d'humidité (ici 30 %), les ventilateurs sont à l’arrêt.
(N.B: il aurait été plus simple de partir sur des ventilos alimentés en 5v par l'arduino mais le débit d'air n'est pas suffisant si on n'est pas en 12v et je crains une limitation des broches sur l"intensité).

Après moults changements quant aux composants, je suis pour le moment parti sur:
Les ventilos en liens plus haut alimenté par une source externe 12v.
2 Diodes pour sécuriser les ventilos
Une arduino uno
Un capteur d'humidité de type DHT 22 (AM2302)
Et enfin, un MOSFET ! Rien que le nom ça fait peur.

J'ai suivi plusieurs projets très simples (mais pour moi pas tant!) qui ont été faits:

variation d'un moteur 12V avec une consigne depuis le PC

variation d'un ventilo alimenté par 9V en fonction de l'humidité et de la temp

lien vers la librairie DHT_sensor (merci adafruit!) avec un code de test basique

Du coup voila le schéma électrique actuel.

Et le code:

#include "DHT.h"
//CONNEXIONS DU DHT22
// Connexion de pin 1 (à gauche) au +5V
// Connexion de pin 2 (data) à la broche définie par DHTPIN
// Connexion de pin 4 (à droite) au GROUND
// Connexion d'un résistance 10K  entre pin 2 (data) et + 5V

#define DHTPIN 2     // definition de la broche de la connection du DHT
#define DHTTYPE DHT22   // DHT 22  (AM2302) définition du type de capteur DHT
//#define DHTTYPE DHT11   // DHT 11 
//#define DHTTYPE DHT21   // DHT 21 (AM2301)
#define fan 11 // broche du moteur

int vitesse = 0; // definition d'une variable appellée vitesse, celle de rotation du moteur du ventilateur

DHT dht(DHTPIN, DHTTYPE); // Initialize DHT sensor for normal 16mhz Arduino
 
void setup() {
  pinMode(fan, OUTPUT); // je declare fan comme etant une broche de sortie
 // Serial.begin(9600); // pas d'affichage serial pour le moment, je risque par contre de ne pas savoir s'il y a des erreurs
  dht.begin(); // initialisation du DHT
}

void loop() {
  // pas de temps de mesure, attente pour lire les capteur (normalement 250 ms, mais peut aller jusque //2s si capteurs "usés" a ce que j'ai compris
  delay(2000);
  float h = dht.readHumidity(); // definition d'une variable à virgule flottante apellée h, l'humidite
  // et qui lit sur le capteur l'humidité allant de 0 à 100.
  vitesse=(map(round(h), 0, 100, 0, 255));  //vitesse est la valeur proportionnelle à l'humidité, mais //s'étale de 0 à 255
  delay(1000);
 
  if(h<30){
  analogWrite(11,0); // si l'humidite est inferieure a 30%, le ventilo est à l'arrêt
  }
  else{
analogWrite(11,vitesse);
  }
  
}

J'ai donc quelques questions à vous soumettre:

Le MOSFET est-il bien le composant le plus adapté à mon projet? Si oui, comment savoir quel modèle prendre?
En effet, j'ai besoin d'un genre de relai qui prend en entrée la broche 11 PWM (donc valeur entre 0 et 255) afin de donner une tension proportionnelle (ici entre 0 et 12V, la source des ventilos)

Le choix du ventilo est il le bon? il a 3 broches: +12V, GND et??
car il existe aussi en PWM. Dans ce cas pas besoin de mosfet? mais l'entrée pwm de ce ventilo est-elle en 12v? Car les broches de l'arduino sortent max 5v.
D'autre part, il peut être intéressant d'en récupérer sur vieux ordis et donc a priori pas pwm...

Ma conversion de l'humidité vers la vitesse ne pose pas de problème? les fonctions map et surtout round ne créerons pas d’erreurs, notamment de virgule?

Merci à tous d'avance.
Olivius.

PS: il est possible que des options se rajoutent par la suite comme affichage LCD de la température, humidité, et débit d'air; ou encore estimation du rendement de double flux (il faudrait 4 capteur de temp), ou encore alimentation autonome batterie/solaire.

(N.B: il aurait été plus simple de partir sur des ventilos alimentés en 5v par l'arduino mais le débit d'air n'est pas suffisant si on n'est pas en 12v et je crains une limitation des broches sur l"intensité).

ça c'est déjà une très bonne et saine précaution :slight_smile:

Pour le transistor, il y a un bon tuto à lire

Pour le map

  vitesse=(map(round(h), 0, 100, 0, 255));  //vitesse est la valeur proportionnelle à l'humidité, mais //s'étale de 0 à 255
  delay(1000);
  • le round est inutile, la fonction fera le boulot pour vous
  • si votre valeur d'entrée de map n'est pas entre 0 et 100, la valeur de sortie ne sera pas entre 0 et 255. (souvent par acquis de conscience on fait un constrain() pour limiter la valeur). Ici normalement si tout s'est bien passé vous avez lu une humidité entre 0 et 100 en effet, mais en cas d'erreur...
  • il serait bon avant de faire le map() de voir si la valeur reçue est correcteif (isnan(h)) {...}- je ne sais pas à quoi sert le second delay()

pour éviter d'arrêter et redémarrer les ventilateurs quand l'humidité est juste autour de 30%, on implémente généralement un "hystérésis" (on déclenche à 32% et on laisse tourner jusqu'à tomber en dessous de 30% par exemple et on arrête, de façon à ne pas bousiller son matériel par arrêts départs intempestifs toutes les quelques secondes)

Vous n'avez qu'un seul point de lecture, sera-t-il représentatif de l'humidité de toute la maison ? ne devriez vous pas non plus tenir compte de la t° extérieure (en hiver c'est pas terrible de faire partir tout l'air chauffé pour le remplacer par de l'air glacial...)

Merci pour la réponse!
J'ai lu ce qui m’intéressait du guide sur les transistors.

Je suis parti sur un IRFZ44N. (caractéristiques détaillées)
Vds:55V, Vgs:20V, Imax: 50A, Vgsthreshold: 2V. Rdson:17 mOhm.

J'ai modifié le code en supprimant le 2e delay, enlever le round et en contraignant l'humidité entre 0 et 100, j'ai modifié loop pour éviter les redémarrages intempestifs au seuil (passé à 40%):

#include "DHT.h"
//CONNEXIONS DU DHT22
// Connexion de pin 1 (à gauche) au +5V
// Connexion de pin 2 (data) à la broche définie par DHTPIN
// Connexion de pin 4 (à droite) au GROUND
// Connexion d'un resistance 10K  entre pin 2 (data) et + 5V

#define DHTPIN 2     // definotion de la broche de la connection du DHT
#define DHTTYPE DHT22   // DHT 22  (AM2302) définition du type de capteur DHT
//#define DHTTYPE DHT11   // DHT 11 
//#define DHTTYPE DHT21   // DHT 21 (AM2301)
#define fan 11 // broche du moteur

int vitesse = 0; // definition d'une variable appellée vitesse, celle de rotatation du moteur du ventilateur

DHT dht(DHTPIN, DHTTYPE); // Initialize DHT sensor for normal 16mhz Arduino
 
void setup() {
  pinMode(fan, OUTPUT); // je declare fan comme etant une broche de sortie
 // Serial.begin(9600); // pas d'affichage serial pour le moment, je risque par contre de ne pas savoir s'il y a des erreurs
  dht.begin(); // initialisation du DHT
}

void loop() {
  // pas de temps de mesure, attente pour lire les capteur (normalement 250 ms, mais peut aller jusque 2s si capteurs "usés" a ce que j'ai compris
  delay(2000);
  float h = constrain(dht.readHumidity(),0,100); // definition d'une variable à virgule flottante apellée h, l'humidite
  // et qui lit sur le capteur l'humidité allant de 0 à 100.
  vitesse=(map(round(h), 0, 100, 0, 255));  //vitesse est la valeur proportionnelle à l'humidité, mais s'étale de 0 à 255
 
  if(h<40){
  analogWrite(11,0); // si l’humidité est inférieure a 40%, le ventilo est à l'arrêt
  }
  else{
    if(h>42){
analogWrite(11,vitesse);
    }
  }
}

C'est exact, il n'y a pour le moment qu'un point de lecture. Je pars de l'hypothèse que sur des habitations ventilées/brassées, l'humidité est équirépartie. Ou sinon le capteur est à mettre en salle d'eau, c'est-à-dire le max d'humidité, dans ce cas la ventilation fonctionne tant que cette pièce est humide.

Le principe de la double flux est que l'air frais ne rentre pas dans l'habitat à la température extérieure, car elle est réchauffée par échange avec l'air sortant (on peut atteindre 17°c si l'air sortant est à 19°, efficacité max 90%). C'est partant du constat que vous avez mentionné que la double flux a été créée!

Le principe de la double flux est que l'air frais ne rentre pas dans l'habitat à la température extérieure, car elle est réchauffée par échange avec l'air sortant (on peut atteindre 17°c si l'air sortant est à 19°, efficacité max 90%). C'est partant du constat que vous avez mentionné que la double flux a été créée!

ben voilà j'ai appris quelque chose ! j'avoue que je ne me suis jamais penché sur le sujet !
merci

Vous pouvez virer ça du code, ça n'apporte rien puisque vous avez un DHT22

//#define DHTTYPE DHT11   // DHT 11 
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

pour le test il faut faire le constrain qu'une fois que vous êtes sûr que la lecture était bonne

  float h = dht.readHumidity(); // definition d'une variable à virgule flottante apellée h, l'humidite lue par le capteur
  if (! isnan(h)) { // si c'est un nombre valide
    vitesse=constrain(map(h, 0, 100, 0, 255), 0 , 255);  //vitesse est la valeur proportionnelle à l'humidité, mais s'étale de 0 à 255
 ...

"Le choix du ventilo est il le bon? il a 3 broches: +12V, GND et??"

la 3 éme broche risque d' être une sortie tachymètre et non une entrée PWM
la doc du F12 de chez ARCTIC ne fait pas mention de pwm...

Le choix du ventilo est il le bon? il a 3 broches: +12V, GND et??
car il existe aussi en PWM. Dans ce cas pas besoin de mosfet? mais l'entrée pwm de ce ventilo est-elle en 12v? Car les broches de l'arduino sortent max 5v.

3è broche : tachymètre.
Le lien sur ton ventilo PWM pointe sur le même que le premier.

Je suis parti sur un IRFZ44N

Il peut convenir mais l'IRLZ44 sera plus adapté pour une commande de grille en 5V.
Sauf si tu as déjà commandé les IRFZ44N.

Ajoute une résistance de 220Ω entre D11 et grille pour limiter les pointes de courant lors des commutations.
Et une résistance de 100K entre grille et source pour garantir un état bas quand la sortie D11 est dans un état indéterminé (au démarrage).

Un ventilo 3 fils ne tournera pas en dessous de ~ 5V. Tu dois en tenir compte dans le logiciel.
Il faut essayer de mesurer sa tension minimale de démarrage.

car il existe aussi en PWM. Dans ce cas pas besoin de mosfet? mais l'entrée pwm de ce ventilo est-elle en 12v? Car les broches de l'arduino sortent max 5v.

Je crois que le signal PWM est en 5V.

Ok super merci pour les réponses!
Lien vers le F12 PWM
Les modifs ont été faites (ajout résistances, remplacement par IRLZ44N):

Schéma élec

J'ai précisé que les diodes seraient de type Schottky conformément à cette page.
" la diode est capable de basculer (passer de l’état bloquant à passant) de manière très rapide. Dès lors qu’il y a une surtension engendrée par le moteur lorsque l’on le coupe de l’alimentation, la diode va l’absorber aussitôt avant que le transistor ait le temps d’avoir des dommages"

Et le code:

#include "DHT.h"
//CONNEXIONS DU DHT22
// Connexion de pin 1 (à gauche) au +5V
// Connexion de pin 2 (data) à la broche définie par DHTPIN
// Connexion de pin 4 (à droite) au GROUND
// Connexion d'un resistance 10K  entre pin 2 (data) et + 5V

#define DHTPIN 2     // definotion de la broche de la connection du DHT
#define DHTTYPE DHT22   // DHT 22  (AM2302) définition du type de capteur DHT
#define fan 11 // broche du moteur

int vitesse = 0; // definition d'une variable appellée vitesse, celle de rotatation du moteur du ventilateur

DHT dht(DHTPIN, DHTTYPE); // Initialize DHT sensor for normal 16mhz Arduino
 
void setup() {
  pinMode(fan, OUTPUT); // je declare fan comme etant une broche de sortie
 // Serial.begin(9600); // pas d'affichage serial pour le moment, je risque par contre de ne pas savoir s'il y a des erreurs
  dht.begin(); // initialisation du DHT
}

void loop() {
  // pas de temps de mesure, attente pour lire les capteur (normalement 250 ms, mais peut aller jusque 2s si capteurs "usés" a ce que j'ai compris
  delay(2000);
  
  float h = dht.readHumidity(),0,100; // definition d'une variable à virgule flottante apellée h, l'humidite
  // et qui lit sur le capteur l'humidité allant de 0 à 100.
 if (! isnan(h)) { // si c'est un nombre valide
    vitesse=constrain(map(h, 0, 100, 0, 255), 0 , 255);  //vitesse est la valeur proportionnelle à l'humidité, mais s'étale de 0 à 255
   }
   
  if(h<40){
  analogWrite(11,0); // si l'humidite est inferieure a 40%, le ventilo est à l'arrêt
  }
  else{
    if(h>42){
analogWrite(11,vitesse);
    }
  }
}

"Un ventilo 3 fils ne tournera pas en dessous de ~ 5V. Tu dois en tenir compte dans le logiciel.
Il faut essayer de mesurer sa tension minimale de démarrage."
OK. Bon en fait 40% de 12V (seuil de démarrage du ventilo) ça fait 4.8V...C'est pas parfait si je dois monter à 5V mais je peux m'en contenter.

"car il existe aussi en PWM. Dans ce cas pas besoin de mosfet? mais l'entrée pwm de ce ventilo est-elle en 12v? Car les broches de l'arduino sortent max 5v."

"Je crois que le signal PWM est en 5V."

ça voudrait dire que, dans le cas d'un F12 PWM (qui contrairement au premier, a 4 pins), je branche les fils sur GND et 12V, normal, et je peux piloter "en direct" depuis la broche 11 de l'arduino vers la pin pwm du ventilo? la dernière pin étant j'imagine le tachymètre.

Merci encore.

L'IRLZ44N comme beaucoup de MOSFETS possède déjà sa propre diode schottky.

ça voudrait dire que, dans le cas d'un F12 PWM (qui contrairement au premier, a 4 pins), je branche les fils sur GND et 12V, normal, et je peux piloter "en direct" depuis la broche 11 de l'arduino vers la pin pwm du ventilo?

Ce serait bien de vérifier, mais les datasheets de ventilos sont maigres.

la dernière pin étant j'imagine le tachymètre.

Oui, à brancher sur une entrée digitale. Une mesure de fréquence par interruption sera certainement possible, donc D2 ou D3.

"ça voudrait dire que, dans le cas d'un F12 PWM......
......la dernière pin étant j'imagine le tachymètre."

============ non : la dernière est le pwm

car on peut brancher un ventillo 3 fil sur un connecteur 4 fils male de carte mère
et inversement .
la prise tachymétrique reste toujours le 3émé point de connections en partant de la masse .

PBZOOM tu es déjà au stade suivant. Tu as déjà le connecteur en main :confused:
Mais oui effectivement.