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
#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);
}