réglage de vitesse

Bonjour, mon projet a pour but de faire varier la vitesse d'un moteur en fonction de la température.
en m'inspirant de ce programme : https://www.instructables.com/id/Using-a-temperature-sensor-to-control-the-speed-of/
j'ai réaliser ce programme :

float temp; 
int tempPin = A0;
int tempMin = 25;   
int tempMax = 35;   
int GateSpeed = 0;

#define Gate 10

void setup () {
 
 pinMode(Gate, OUTPUT);

 digitalWrite(Gate, LOW);
 pinMode(tempPin, INPUT);
 Serial.begin(9600);
 
}

void loop() {


 temp = analogRead(tempPin);
 temp = (temp *5.0*100.0)/1024.0; 
 Serial.println(temp);
 delay(1000);        
 if(temp < tempMin) {  
      GateSpeed = 0;      
      digitalWrite(Gate, LOW);
}


 if(temp > tempMin) {
   GateSpeed = 100;
   digitalWrite(Gate, HIGH);
 }

 if(tempMax > tempMin) {
   GateSpeed = 255;
   digitalWrite(Gate, HIGH);
 }

}

Je fais varier la vitesse de mon moteur à l'aide d'un Mosfet (nommé Gate sur le programme)

Le programme fonctionne mais j'aimerai rajouter une sorte de température moyenne, c'est-à-dire quelque chose qui ressemble à ''tempMoy'' qui serai de 30°C alors je pourrais définir la tempMin =25°C et la tempMax=35°C

D'alleurs je n'ai pas très bien compris le mode de vitesse. Je sais qu'il y a HIGH et LOW et quelque chose compris entre 32 et 255 pour le moteur, c'est pourquoi je ne sais pas comment définir la vitesse de mon tempMoy si je devrais la créer. Dommage qu'il n'existe pas de vitesse '' Medium'' :confused:

C'est aussi cette parti que je comprends pas très bien le sens :

if((temp >= tempMin) && (temp <= tempMax))  //if temperature is higher than the minimmum range
  { 
      fanSpeed = map(temp, tempMin, tempMax, 32, 255); // the actual speed of fan
      analogWrite(fan, fanSpeed);  // spin the fan at the fanSpeed speed
  } 
}

Je ne comprend pas trop comment définir mon GateSpeed. J'en déduis son utilité afin de pouvoir utiliser plus d'option que HIGH et LOW pour faire varier la vitesse. Mais comment je la déclare?

donc pour résumer, j'aimerai créer :
if tempMin > temp (vitesse peu vite)
if tempMax >tempMin (vitesse max)

Sachant que tempMin vaut 25 et tempMax 35, cette partie n'a aucun sens car le test est toujours vrai :

 if(tempMax > tempMin) {
   GateSpeed = 255;
   digitalWrite(Gate, HIGH);
 }

Ce que tu veux faire n'est pas clair :

donc pour résumer, j'aimerai créer :
if tempMin > temp (vitesse peu vite)
if tempMax >tempMin (vitesse max)

tempMin et tempMax doivent définir une gamme de température à l'intérieur de laquelle on agit sur le ventilateur. Tu vois par exemple ici

 if(temp < tempMin) {  
      GateSpeed = 0;      
      digitalWrite(Gate, LOW);
}

Si la température mesurée est inférieure à la valeur minimum de cette gamme, on éteint le ventilateur. Donc tes conditions ne sont pas valides.

Enfin, tu définis une vitesse de ventilateur mais tu ne l'utilises pas. C'est ce qui est fait dans la seconde partie de code que tu cites : on calcule une vitesse, linéairement à partir de la température mesurée (fonction map), telle que si la température est au min la vitesse vaut 32 et si elle est au max la vitesse veut 255 (le max). Ensuite, le analogWrite sert à commander la vitesse du ventilo grâce au PWM.

Je ne comprend pas trop comment définir mon GateSpeed

C'est fait par la fonction map. Si tu veux le faire autrement, explique ce que tu veux faire...

j'ai retapé mon code :

float temp; 
int tempPin = A0;
int tempMin = 25;   
int tempMax = 35;   
int GateSpeed = 0;

#define Gate 10

void setup () {
  
  pinMode(Gate, OUTPUT);

  digitalWrite(Gate, LOW);
  pinMode(tempPin, INPUT);
  Serial.begin(9600);
  
}

void loop() {


  temp = analogRead(tempPin);
  temp = (temp *5.0*100.0)/1024.0; 
  Serial.println(temp);
  delay(1000);        
  if(temp < tempMin) {  
       GateSpeed = 0;      
       digitalWrite(Gate, LOW);
     
}
 
   { 
       GateSpeed = map(temp, tempMin, tempMax, 32, 255); 
       analogWrite(Gate, GateSpeed);  
   } 


  if((temp > tempMin) && (temp < tempMax)){
    GateSpeed = 32;
    digitalWrite(Gate, HIGH);
  }

  if(tempMax > tempMin) {
    GateSpeed = 255;
    digitalWrite(Gate, HIGH);
  }

}

Je l'ai tester sur mon ventilateur et il n'a pas l'air de bien fonctionner :confused:

pour cette partie :

if(temp < tempMin) {  
      GateSpeed = 0;      
      digitalWrite(Gate, LOW);
}

Bah si la température est inférieur à celle de la température minimale, le ventilateur ne tourne pas, le LOW signifie qu'il est éteint non ?

Je pense que oui, ça dépend de ton schéma.
Pour ton code il faut que tu mettes des else

 if(temp < tempMin) {  
      GateSpeed = 0;      
      digitalWrite(Gate, LOW);
    
}



 else if((temp > tempMin) && (temp < tempMax)){
   GateSpeed = 32;
   digitalWrite(Gate, HIGH);
 }

else if(temp> tempMax) {
   GateSpeed = 255;
   digitalWrite(Gate, HIGH);
 }
else 
  { 
      GateSpeed = map(temp, tempMin, tempMax, 32, 255); 
      analogWrite(Gate, GateSpeed);  
  }

Mais je pense que ça ne marchera toujours pas car HIGH est équivalent à 1

Je pense que tu devrais te contenter du digitalWrite et ajouter un constrain pour gérer le cas d'une température supérieure au max

if(temp < tempMin) {  
      GateSpeed = 0;      
      digitalWrite(Gate, LOW);
} else   { 
      GateSpeed = map(temp, tempMin, tempMax, 32, 255);
// constrain ici ou bien 
      if (GateSpeed > 255) GateSpeed = 255;
      analogWrite(Gate, GateSpeed);  
  }

j'obtient donc un code de se type:

float temp; 
int tempPin = A0;
int tempMin = 9;   
int tempMax = 10;   
int GateSpeed = 0;

#define Gate 10

void setup () {
  
  pinMode(Gate, OUTPUT);

  digitalWrite(Gate, LOW);
  pinMode(tempPin, INPUT);
  Serial.begin(9600);
  
}

void loop() {


  temp = analogRead(tempPin);
  temp = (temp *5.0*100.0)/1024.0/2; 
  Serial.println(temp);
  delay(1000);        
 if(temp < tempMin) {  
      GateSpeed = 0;      
      digitalWrite(Gate, LOW);
} else   { 
      GateSpeed = map(temp, tempMin, tempMax, 32, 255);
// constrain ici ou bien 
      if (GateSpeed > 255) GateSpeed = 255;
      analogWrite(Gate, GateSpeed);  
  }

if(temp < tempMin) {  
      GateSpeed = 0;      
      digitalWrite(Gate, LOW);
    
}


 else if((temp > tempMin) && (temp < tempMax)){
   GateSpeed = 32;
   digitalWrite(Gate, HIGH);
 }

else if(temp> tempMax) {
   GateSpeed = 255;
   digitalWrite(Gate, HIGH);
 }

}

Pour récapituler, Le ventilateur ne tourne pas en-dessous de la température minimale. il tourne pas très vite entre la température minimale et la température maximale, il tourne à une vitesse moyenne. Le problème, c'est qu'au dessus de la température maximale, il tourne toujours à la même vitesse moyenne.

Pour mon montage, j'ai bien suivis des tutos de youtube pour le capteur de température et le Mosfet, je pense que le problème peut venir à l'emplacement de la résistance.

Voici des photos du montage:

donc il suffirai qu'au dessus de la température maximale, le ventilateur ne prenne pas compte le transistor afin qu'il puisse tourner à son maximum non ?

Côté code, tu n'as pas besoin de ce qui suit le bloc contenant le analogWrite.
Côté électronique, je ne sais pas...