Ventilateur d'ordinateur

Bonjour je soihait faire un ventilateur d'ordinateur dont la vitesse varira en fonction de la température.
J'ai déjà trouvé comment faire varier la vitesse grâce au microcontrolleur L293D.
Mais c'est au niveaux du code que je bloque, je souhaite que le moteur commence avec un Pwm de 50 à 28°C et qui augmente tout les 0.1°C jusqu'à 36°C de manière exponentielle.
J'ai cherché ici et la comment faire sans succès. Pouvez-vous m'aider s'il vous plaît ?
Voici mon code actuel :

int Moteur_sens1 = 4; // Pin 4 Arduino vers broche A+ du L293D
int Moteur_sens2 = 5; // Pin 5 Arduino vers broche A- du L293D
int moteur1_PWM = 10; // Pin 10 Arduino PWM vers EN1 du L293D
int PWM = 0; // Variable PWM image de la vitesse
int tempPin = 0;

void setup() {
  Serial.begin(9600); // Ouverture du port série et debit de communication fixé à 9600 bauds
  pinMode(moteur1_PWM, OUTPUT); // Pin 10 Arduino en sortie PWM
  pinMode(Moteur_sens1, OUTPUT); // Pin 4 Arduino en sortie digitale
  pinMode(Moteur_sens2, OUTPUT); // Pin 5 Arduino en sortie digitale

  delay( 1000 ); // Attendre 1 secode avant le lancement de la fonction accélération
}
void loop() {
  int tempReading = analogRead(tempPin);
  // This is OK
  double tempK = log(10000.0 * ((1024.0 / tempReading - 1)));
  tempK = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * tempK * tempK )) * tempK );       //  Temp Kelvin
  float tempC = tempK - 273.15;            // Convert Kelvin to Celcius
  float tempF = (tempC * 9.0) / 5.0 + 32.0; // Convert Celcius to Fahrenheit
  Serial.print("Temp ");
  Serial.print(tempC);
  Serial.println("°C  ");
  int C = round(tempC);
  void Moteur(C);
  delay(1000);
}

void Moteur(C) {
//Ici je veux mettre le code qui contrôlera le moteur en fonction de la température .
}

Tu veux dire que le pwm passera de 50 lorsque la température sera de 28° ou moins à 255 au delà de 36° ?

Dans ce cas, tu testes la valeur de la température. Si c'est moins que 28 tu mets le pwm à 50. Si c'est plus que 36 tu mets le pwm à 255.

Si c'est entre les deux, il faut calculer la valeur. Si on suppose une fonction exponentielle
Pwm = A exp( B*(T-28))
Lorsque T vaut 28 alors l'exponentielle vaut 1 donc A vaut 50.
Lorsque T vaut 36 on a 255 = 50 exp(8*B)
Donc B = log(255/50)/8 = 0,203655

Tu crées une fonction qui calcule le pwm et tu l'affectes à la pin du ventilateur avec digitalWrite

C'est pas tout a ça l'idée et le ventilateur démarre a 28° avec un Pwm de 50 mais en dessous de 28° le ventilateur sera éteint. Ensuite tout les 0.1° il augmente de plus en plus jusqu'à avoir un Pwm a 255 quand on atteint 36°.
Merci de prendre du temps pour me répondre.

La formule proposée fait l'affaire, il suffit de l'intégrer dans quelque chose d'un peu plus complexe.

  • En-dessous de 28°C: PWM = 0
  • Au-dessus de 36°C: PWM = 255
  • Entre les deux: application la formule proposée par @lesept

Il y a aussi le problème d'avoir un capteur de température ayant une précision de 0,1°C et un bruit de mesure très inférieur. Sinon le ventilateur ne va pas arrêter d'accélérer, ralentir, accélérer, ralentir, .....

Merci beaucoup pour votre réponse en tout cas mon capteur et suffisamment précis et je rajouterais un delais avant d'arrêter le ventilateur bien que la thermorésistante soit éloigné du ventilateur.

C'est le point clé : en maths, ça a une signification bien précise que j'ai retranscrite dans ma réponse. Si ce n'est pas le cas, juste un tournure de phrase en gros, alors tu cherches une augmentation linéaire.
Dans ce cas, c'est la fonction map que tu dois utiliser :

Comme tu veux "attraper" les dixièmes de degrés, et que map fonctionne avec des entiers, il faut multiplier la température par 10.

Dans la loop :

int C = round(tempC * 10);
Moteur(C);

Puis :

void Moteur(int C) {
  int pwm;
  if (C < 280) pwm = 0;
  elseif (C > 360) pwm = 255;
  else pwm = map(C, 280, 360, 50, 255);
  digitalWrite(moteur1_PWM, pwm);
}

Ca devrait le faire...

Il faut dans ce cas mettre un peu d'hystérésis dans la gestion du PWM. Un exemple ici qui s'applique justement au contrôle d'un ventilateur :

A adapter bien sûr...

Probablement que tu as de bonnes raisons de vouloir une variation exponentielle, mais je ne comprends pas la raison, je suis intéressé de la connaître. Peux-tu développer s'il te plaît.

As-tu une idée de ce que représente 0,1 °C ?
Ouvres une porte, une fenêtre ou marches devant l'ordinateur et tu auras une variation de plus de 0,1 °C
Cela s'appelle aussi le bruit de mesure.
Je ne parle pas de la difficulté de la mise au point !

À ta place, je choisirais de commencer avec des pas de 1 ou 2 °C.

Puis quand tout fonctionnera, il ne te sera pas difficile de passer à des pas plus petit.
Et comme il faut toujours vérifier ses hypothèses, tu pourras vérifier si un pas de 0,1 °C est utile ou pas.
Il n'y a pas que le capteur qui compte, c'est l'ensemble qu'il faut considérer.

De toute façon avec un convertisseur AN avec une résolution de 10 bits, une pwm sur 8bits et la sensibilité du ventilateur, rien ne dit que l’ensemble complet du système sera précis à 0,1°C. Sans oublier qu’en plus de la précision et de la fiabilité de la mesure, il faut prendre en compte sa répétabilité.

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