Transistor, ventilateur 12V et arduino

Bonjour
Je viens vers la communauté car j'ai besoin d'aide avec mon système.
Je créer un thermostat, j'en suis aux "dernières finitions". J'ai un problème avec mon ventilateur 12V, ne pouvant pas l'alimenter direct avec l'arduino, la tension étant trop basse. Je souhaite donc l'alimenter avec une source externe et piloter tout ça avec un mosfet, n'ayant qu'un relais (il est utiliser pour la resistance chauffante).
Le problème étant que le ventilateur tourne comme s'il n'y avait pas de mosfet et qu'il était branché.
J'ai suivi le branchement de cette vidéo, en remplacant la pile 9v par mon alim 12v et le moteur par le ventilateur. Il devrait être correct, après maintes vérifications.

Malgré mon code, le ventilateur tourne tout le temps, en vérifiant au multimètre, la tension d'entrée est bien de 12.00V et varie parfois très sensiblement (0.01V max) et la tension de sortie aux bornes du ventilo est de 11.90/11.91V.
J'ai essayé de changé de mosfet, même modéle, l'autre fait pareil mais la tension de sorties est cette fois d'à peine 10V... J'ai aussi des "BC547"...
Parfois même, le ventilo grésille sans tourner, la tension est bien de 11.90V, parfois elle chute brutalement et temporairement, je ne suis pas sur qu'elle atteigne le zéro mais ça peut-être le temps de latence de mon multimètre, n'étant pas de très bonne qualité. Mais ce problème là à l'aire d'être réglé, il ne grésille plus mais tourne tout le temps. (d'ailleurs, il ne s'arrête même pas quand l'arduino n'est plus branché...)

La ref du ventilo : DSB0912M, 12v 0.19A, C'est un ventilateur récupéré d'un vieil ordinateur, il à 3 bornes, rouge, noir et bleue (là aussi je suis un peu perdu dans l'utilité du cable bleu, apparemment c'est pour changer la vitesse ou je ne sais quoi)
La ref du mosfet : (c'est celui intégré au starter kit) IRF520, N02K en dessous à gauche et AF à droite.
Celle de la diode est bien 1N4007, comme la vidéo.
Pour finir, voici le code.
Merci de votre aide :pray:

#include <LiquidCrystal.h>

int capteur_interieur = 0;

int capteur_exterieur = 1;


LiquidCrystal lcd(12, 11, 5, 4, 3, 2);


int vert = 9;      //température correcte
int rouge = 8;     //système en chauffe
int bleu = 7;      //refroidissement

int chauffage = 10;
int ventilateur = 6;


void animpoint() {          //animation de la séquence d'initalisation (le point de "Initialisation." <-- )

  lcd.setCursor(14, 0);
  lcd.print( "." );
  delay(700);
  lcd.setCursor(14, 0);
  lcd.print( " " );
  delay(700);
}

void setup() {

  pinMode(vert, OUTPUT);
  pinMode(rouge, OUTPUT);                //définition des sorties led
  pinMode(bleu, OUTPUT);
  
  pinMode(chauffage, OUTPUT);                //définition des sorties du système de contrôle de la température (le chauffage quoi...)
  pinMode(ventilateur, OUTPUT);

  digitalWrite (vert, HIGH);                //début du test avec touus les organes qui se mettent en route
  digitalWrite (rouge, HIGH);
  digitalWrite (bleu, HIGH);

  digitalWrite (chauffage, HIGH);
  digitalWrite (ventilateur, HIGH);

  lcd.begin(16, 2);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print( "INITIALISATION" );
  lcd.setCursor(0, 2);

  
  for (int a = 0; a < 3; a++) {               //animation des 3 points, répétée 3 fois. (environ 4200 ms)
    animpoint();
  }

  digitalWrite (vert, LOW);
  digitalWrite (rouge, LOW);
  digitalWrite (bleu, LOW);

  digitalWrite (chauffage, LOW);
  digitalWrite (ventilateur, LOW);                // fin du test

}

int lastTemp_int = -100;
int lastTemp_ext = -100;                   //céation et définition de la dernière température enregistrée à -100 pour être sûr que le système se mette en route (voir plus bas)

void loop() {

  float temp_int = lectureTemp_int();

  if ( abs(temp_int - lastTemp_int) < 0.20 )               //Ici. Si la dernière température est différente de moins de 0.2°C, ne pas rafraichir. (pas trop souvent)
    return;                                               // donc si la température n'a varié que sensiblement, ne pas executer la suite.
  lastTemp_int = temp_int;


  lcd.setCursor(0, 0);                                   //début de l'affichage de la température sur l'écran LCD
  lcd.print( "Int. :" );
  lcd.print( temp_int );
  lcd.write(223);                                       // affiche le signe degré en ASCII (je crois 😧)
  lcd.print( "C" );

  lcd.print( "      " );

  delay(600);


  float temp_ext = lectureTemp_ext();                    //même principe pour la température extérieure

  if ( abs(temp_ext - lastTemp_ext) < 0.20 )
    return;
  lastTemp_ext = temp_ext;


  lcd.setCursor(0, 1);
  lcd.print( "Ext. :" );
  lcd.print( temp_ext );
  lcd.write(223);  // affiche le signe degré
  lcd.print( "C" );

  lcd.print( "      " );

  delay(600);


  if (temp_int < 18) {                                         //conditions d'allumage du système. (si la température est en dessous de 18°C...)
    digitalWrite(rouge, HIGH);
    digitalWrite(chauffage, HIGH); //allumer le chauffage
  }

  if (temp_int > 21) {                                         //condition, si la température dépasse 21°C...
    digitalWrite(rouge, LOW);
    digitalWrite(chauffage, LOW); //éteindre le chauffage
  }

  if (temp_int > 25) {
    digitalWrite(bleu, HIGH);
    digitalWrite(ventilateur, HIGH); //ventilation allumée
  }

  if (temp_int < 25) {
    digitalWrite(bleu, LOW);
    digitalWrite(ventilateur, LOW); //ventilation éteinte
  }

  if (temp_int > 19 && temp_int < 25) {
    digitalWrite(vert, HIGH);
  }
    else {
    digitalWrite(vert, LOW);
  }
}

float lectureTemp_int() {
                                                                            //calcul pour convertir le signal de analogRead en °C
  int valeur_int = analogRead(capteur_interieur);

  float tension_int = valeur_int * 4.90;
  tension_int /= 1024.0;

  float temperature_int = ((tension_int * 1000) - 500) / 10;
  return (temperature_int);
}
//______________________________________________//
//                                              //

float lectureTemp_ext() {

  int valeur_ext = 133; //analogRead(capteur_exterieur);

  float tension_ext = valeur_ext * 4.95;
  tension_ext /= 1024.0;

  float temperature_ext = ((tension_ext * 1000) - 500) / 10;

  return (temperature_ext);

}

quelle alimentation 12V avez vous retenue ? Quel MOSFET ?

postez un schéma de votre montage tel qu'il est

j'ai modifié mon message pour completer. L'alim vient d'un kit d'alimentation multi achetée chez leclerc, avec des embouts interchangeable. La tension est aussi modifiable. la ref : MW3N06GS le logo de la marque c'est un M et un W.
Le mosfet est donc celui contenu dans le starter kit d'arduino, IRF520
Je poste un montage d'ici peu

Voilà le schéma


Voici le lien tinkercad :
https://www.tinkercad.com/things/iBTWQ4pouVe-copy-of-projet-serre/editel?sharecode=qzyeYgZmRtcQXznWGYTNp1yG9TOBBkQGIyvg1H1lRbM

votre IRF520 ressemble à cela


ou il est "tout nu" ?

pour le tester le mieux serait de ne rien avoir d'autre de branché et de faire un petit test qui fait tourner le ventilateur plus ou moins vite

PS/ ce n'est pas le meilleur transistor pour laisser passer du jus lorsqu'on le pilote sous 5V

non non, mis à part le moteur, le dessin est entièrement fidèle à mon montage. Le mosfet est nu oui.

Ok, je vais essayer.

Ah mince... Mais mise à part celui là et le petit BC547, j'ai rien d'autre... et sur du 5V ça ne va pas suffire pour l'alimenter ou du moins il ne tournera pas assez vite pour mon besoin

Si j'en crois le schéma, il manque une liaison de masse entre le GND Arduino et le -Alim12V

Ah yes merci. Effectivement cela marche mieux, mais au lieu de s'éteindre lorsque le code lui demande, la tension descend à 9.30V. Mais il y a bien un changement entre les deux états, c'est déjà ça... Si vous avez une idée... :sweat_smile:
J'ai essayer d'intervertir avec l'autre mosfet, il n'y a carrément plus de changement ^^ enfin si, de 30milivolts.

Je n'avais plus regardé le schéma tout à l'heure mais pour moi, il manque 2 choses.

  1. une résistance de 100k entre la gate et la masse. Pour tirer la gate à la masse.
  2. une résistance de 220 Ohms en série entre la sortie D6 et la gate du mosFET. Pour limiter le courant dans la sortie de l'arduino.

Autrement, il faudrait revoir les conditions d'allumage/extinction du chauffage et de la ventilation
Il y a plusieurs tests qui se contredisent l'un l'autre.
Il ne faut pas oublier que tous les if sont testés les uns après les autres.
Par exemple, si la température est égale à 22°C, les 2 conditions ci-dessous seront vrais

if (temp_int > 21) {
.....
if (temp_int < 25) {
.....

or ces 2 tests déclenchent des actions antagonistes puisque l'un allume le ventilateur et l'autre l'éteint.
Et il y a un problème identique avec ces tests si la température est inférieure à 18°C

if (temp_int < 18) {
.....
if (temp_int < 25) {
.....

Ok, j'essaie ça de suite, merci.

Vous ne confondez pas le chauffage et la ventilation ? J'ai relu cette partie et pour moi c'est bon... pour if (temp_int > 21) c'est l'extinction du chauffage et if (temp_int < 25) c'est l'allumage du ventilo... Pareil pour 18 et 25, si temp < 18, chauffage HIGH, si temp > 21, chauffage LOW et si temp >25, ventilateur HIGH etc... vu que c'est à la suite, le chauffage et le ventilo ne sont jamais allumés ensemble

Oui j'ai lu un peu vite et je me suis mélangé

Ça y est ! J'ai terminé ! J'ai dû boucler ça un peu en vitesse hier soir, mais j'ai réussi... Ce n'est qu'une version prototype mais je modifierais tout ça le we pro. Je posterais un sujet réservé pour expliquer toutes mes démarches, si ça peut aider des personnes par la suite... Merci @J-M-L et @fdufnews pour votre aide précieuse.
Mon problème a été résolu en changeant de mosfet, je me doutais bien que c'était ça qui coinçait… J'ai farfouillé dans mon bordel d'éléctronique de récup, et j'ai finalement trouvé un mosfet qui correspondait à mon utilisation. J'ai bien dû griller les deux autres contenus dans le starter kit en les branchant un peu n'importe comment au début...
La réf du nouveau mosfet : IRBF7440
Celui ci ne laisse pas du tout passer de courant lorsqu'il est fermé.
A bientôt !

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