DS18B20 PWM configuration

Bonjour à tous

Voici mon projet j’ai besoin de faire une ventilation forcé pour un variateur a courroie.

J’ai un capteur de température DS18B20 connecter à l’arduino une sortie PWM qui pilote un ESC contrôleur brushless de modèle réduit qui alimente une turbine EDF RC.

J’ai trouvé un code sur le net qui fonctionne, mais j’ai du mal à comprendre comment configurer ma température mini d’enclenchement ainsi que la température maxi et pour finir quand je suis à la température maxi je voudrais pouvoir limiter la vitesse maxi de la turbine.

Avez-vous un code mieux adapté à mon application.

Merci pour votre aide

#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 2

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

int MIN_TEMP = 16;
int MAX_TEMP = 28;

void setup() {

pinMode(9,OUTPUT);
Serial.begin(9600);
sensors.begin();

}

void loop() {

  float temperature = getTemperature();
  int voltage = temperatureToPWM(temperature);
  analogWrite(9,voltage);
  delay(500);
}

float getTemperature()
{
  float temperature =0;
  sensors.requestTemperatures(); // Send the command to get temperatures
  temperature = sensors.getTempCByIndex(0);
  Serial.println(temperature);
  return temperature;
}

int temperatureToPWM(float temperature)
{
  float temp=0;
  float voltage = 0;
  temp = temperature*10;
  voltage = map(temp,MIN_TEMP*10,MAX_TEMP*10,0,250);
  return voltage;
}

Ce code fait une mesure de température deux fois par seconde. A chaque mesure, il affecte un niveau entre 0 et 250 à la variable voltage qui est ensuite écrite sur la sortie 9.
La fonction qui transforme la température en tension est

  voltage = map(temp,MIN_TEMP*10,MAX_TEMP*10,0,250);

C'est une règle de trois en gros. Le fait de multiplier par 10 est un artifice pour avoir une précision au dixième de degré Celsius. Donc une température entre MIN_TEMP et MAX_TEMP donnera une tension entre 0 et 250.

Deux problèmes avec ce code :
Il ne prend pas en compte le cas des températures en dehors de la plage MIN_TEMP - MAX_TEMP. Pour les prendre en compte, c'est à dire imposer qu'une valeur inférieure à MIN_TEMP soit bloquée à MIN_TEMP (idem pour MAX), tu peux utiliser la fonction constrain

La fonction temperatureToPWM est déclarée en int et renvoie un foat : c'est bizarre, mais si ça marche...

Pour ton problème d'enclenchement, je pense que tu dois définir la température min d'enclenchement et la température max de fonctionnement. Dans la loop, tu fait un test sur la valeur de la variable temperature :

  • Si elle est inférieure à la température min d'enclenchement, tu mets voltage à 0
  • Si elle est supérieure à la température max de fonctionnement, tu mets la variable voltage à une valeur maximale.

Je pense que ça ressemble pas mal au code actuel. Tes valeurs de températures min et max sont celles qui sont définies dans l'entête :

int MIN_TEMP = 16;
int MAX_TEMP = 28;

Salut,

Il devrait y avoir un test pour ignorer les 85°C. C'est la température qui est renvoyée lorsqu'une valeur est lue alors avant que la première conversion ait fini : ça peut arriver si la sonde reboote pour une raison ou une autre (genre mauvaise alimentation).

Ensuite, est-ce vraiment nécessaire de demandé la température aussi fréquemment ?

A+

Bonjour merci encore pour votre aide

Si j’ai bien compris si je veux que le ventilateur démarre à 50° je modifie la valeur :

int MIN_TEMP = 16; par la valeur int MIN_TEMP = 50;

Si je veux que le ventilateur soit à sa vitesse maxi à 80° et plus je modifie la valeur :

int MAX_TEMP = 28; par la valeur int MAX_TEMP = 80;

Concernant la vitesse maxi du ventilateur si je souhaite la brider au maxi à 220 je modifie la valeur

voltage = map(temp,MIN_TEMP10,MAX_TEMP10,0,250);

par la valeur

voltage = map(temp,MIN_TEMP10,MAX_TEMP10,0,220);

Dernier problème je souhaite utiliser un capteur de température MLX90614 à la place du DS18B20 en prenant en compte la valeur mlx.readAmbientTempC de mon capteur.

Que dois-je modifier sur mon code ?

Le MLX90614 sera connecté sur A5=SLC et A4=SDA

Merci encore pour votre aide

Bonjour à tous

J’ai besoin de piloter un ESC PWM qui alimente un ventilateur.

J’ai trouvé un code qui fonctionne avec un capteur de température DS18B20.

Voici le code qui fonctionne avec le DS18B20

#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 2

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

int MIN_TEMP = 16;
int MAX_TEMP = 28;

void setup() {

pinMode(9,OUTPUT);
Serial.begin(9600);
sensors.begin();

}

void loop() {

  float temperature = getTemperature();
  int voltage = temperatureToPWM(temperature);
  analogWrite(9,voltage);
  delay(500);
}

float getTemperature()
{
  float temperature =0;
  sensors.requestTemperatures(); // Send the command to get temperatures
  temperature = sensors.getTempCByIndex(0);
  Serial.println(temperature);
Serial.print("PWM.");
//analogWrite(ledPin, tempDur);
//Serial.printin(tempDur);


  
  return temperature;
}

int temperatureToPWM(float temperature)
{
  float temp=0;
  float voltage = 0;
  temp = temperature*10;
  voltage = map(temp,MIN_TEMP*10,MAX_TEMP*10,0,250);
  return voltage;
}

Je souhaiterai obtenir le même résultat avec un capteur MLX90614 en utilisant que le signal température ambiante.

Voici le code que j’ai modifié qui ne fonctionne pas pour l’instant.

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_MLX90614.h>



#include <OneWire.h>
//#include <DallasTemperature.h>

//#define ONE_WIRE_BUS 2

//OneWire oneWire(ONE_WIRE_BUS);
//DallasTemperature sensors(&oneWire);
Adafruit_MLX90614 mlx = Adafruit_MLX90614();


int MIN_TEMP = 16;
int MAX_TEMP = 28;

void setup() {


Serial.begin(9600);
Serial.println("Adafruit MLX90614 test");
    mlx.begin();
//sensors.begin();
pinMode(9,OUTPUT);
}

void loop() {

  //float temperature = getTemperature();
  float celsius = mlx.readObjectTempC();
  //int voltage = temperatureToPWM(temperature);
  int voltage = mlx.readObjectTempCToPWM(temperature);
  analogWrite(9,voltage);
  delay(500);
}

float getTemperature()
{
  float temperature =0;
 // sensors.requestTemperatures(); // Send the command to get temperatures
 // temperature = sensors.getTempCByIndex(0);
  Serial.println(temperature);
Serial.print("PWM.");
//analogWrite(ledPin, tempDur);
//Serial.printin(tempDur);


  
  return temperature;
}

int temperatureToPWM(float temperature)
{
  float temp=0;
  float voltage = 0;
  temp = temperature*10;
  voltage = map(temp,MIN_TEMP*10,MAX_TEMP*10,0,250);
  return voltage;
}

Que dois-je modifier sur mon code ? :confused:

Merci pour votre aide

On ouvre pas deux sujets sur le même problème.....

Ok pas de soucis

Voiic ce que tu as dit pour décrire ton besoin :

J'ai un capteur de température DS18B20 connecter à l'arduino une sortie PWM qui pilote un ESC contrôleur brushless de modèle réduit qui alimente une turbine EDF RC.

Ça ne parle pas de ventilateur et on ne sait pas ce qui doit être fait en cas de température inférieure au min ou supérieure au max. Si la commande de la broche 9 est celle du ventilateur, alors :
Si tu déclares MIN_TEMP = 50 et MAX_TEMP = 80 et que tu mets 220 à la place de 250 --> La sortie 9 sera comprise entre 0 et 220 pour une mesure de température entre 50 et 80. 50°C donnera 0 et 80°C donnera 220.

Ce chiffre n'est pas une vitesse de ventilateur, même si elle est reliée. La variable voltage, qui varie entre 0 et 220, divisée par 255 te donnera le pourcentage de vitesse du ventilateur par rapport à sa vitesse maximale (celle qu'il aurait pour une tension maximale). Par exemple, si voltage vaut 150, 150/255 = 58.8% de la vitesse max.

Il faut prendre en compte les cas où le capteur te donne des valeurs de température inférieures à MIN_TEMP ou supérieure à MAX_TEMP avec la fonction constrain pour ne pas avoir de bug.

Pour le capteur MLX90614, il faut que tu lises de la doc et tu devras certainement utiliser une bibliothèque adaptée

Bonjour

Effectivement je n’ai pas parlé de ventilateur mais de turbine EDF RC qui va faire office de ventilation forcé dans le conduit d’arrivé d’air de refroidissement.

Je pense qu’il faudra que je limite la vitesse max car ces turbine fonctionne ¼ voir ½ heure dans leur utilisation initiale.

Dans mon cas elle va tourner en permanence et suivant la température de la courroie et du carter variateur.

Quand la température sera infèrieur à 50° la turbine doit être à l’arrêt, apprêt si la température arrive à 80° et plus la turbine doit être à la vitesse maxi soit par exemple 220 sur pin 9.

Je ne connais pas du tout la fonction constrain ?

J’ai bien lu la doc MLX90614 modifier mon code d’origine qui fonctionne avec le capteur DS18B20 mais sans résultat.

Je précise bien que je suis novice donc pas simple pour moi.

Voici mon code modifié :

//#include <OneWire.h>
//#include <DallasTemperature.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_MLX90614.h>
#include <Adafruit_GFX.h>

Adafruit_MLX90614 mlx = Adafruit_MLX90614();

//#define ONE_WIRE_BUS 2

//OneWire oneWire(ONE_WIRE_BUS);
//DallasTemperature sensors(&oneWire);

//Adafruit_MLX90614 sensors(&oneWire);


int MIN_TEMP = 16;
int MAX_TEMP = 28;

void setup() {

pinMode(9,OUTPUT);
Serial.begin(9600);
Serial.println("Adafruit MLX90614 test");
mlx.begin();
//sensors.begin();

}

void loop() {

//float temperature = getTemperature();
float celsius = mlx.readObjectTempC();
  
 //int voltage = temperatureToPWM(temperature);
 int voltage = mlx.readObjectTempC(temperature);
 
  analogWrite(9,voltage);
  delay(500);
}

//float getTemperature()
float celsius = mlx.readObjectTempC();

  float temperature =0;
//sensors.requestTemperatures(); // Send the command to get temperatures
 mlx.readObjectTempC.requestTemperatures();

  
  temperature = sensors.getTempCByIndex(0);
  Serial.println(temperature);
  return temperature;
}

int temperatureToPWM(float temperature)
{
  float temp=0;
  float voltage = 0;
  temp = temperature*10;
  voltage = map(temp,MIN_TEMP*10,MAX_TEMP*10,0,250);
  return voltage;
}

pour constrain, voir le lien dans mon premier message