Mesure des températures avec courbes

Posez ici vos questions techniques avec ou sans rapport à l'impression 3D
Tim0th3e
Contributeur actif
Messages : 240
Inscription : sam. oct. 25, 2014 9:02 am
Imprimante 3D : Hephestos I 2014 + plateau Mk2a, montée quand j'étais assez petit
Localisation : Suisse

Bonsoir,
Voici le programme que j'ai écrit ces derniers jours:

Code : Tout sélectionner

// Inclusion de la librairie OneWire
#include <OneWire.h>  

//Définitons
// Pin pour le contrôle pwm
#define pin_pwm 9
// Adresse 1-Wire du DS18B20
#define DS18B20 0x28  
// Pin pour les données
#define pin_data 16   

OneWire ds(pin_data); // Création de l'objet OneWire ds

float getTemperature() { // Fonction récupérant la température depuis le DS18B20
	byte data[9], addr[8]; // data : Données lues depuis le scratchpad, addr : adresse du module 1-Wire détecté

	if (!ds.search(addr)) { // Recherche un module 1-Wire
		ds.reset_search();    // Réinitialise la recherche de module
		return 65535;         // Si ce n'est pas le cas erreur
	}

	if (OneWire::crc8(addr, 7) != addr[7]) // Vérifie que l'adresse a été correctement reçue
		return 65535;                        // Si ce n'est pas le cas erreur 

	if (addr[0] != DS18B20) // Vérifie qu'il s'agit bien d'un DS18B20
		return 65535;         // Si ce n'est pas le cas erreur

	ds.reset();             // On reset OneWire
	ds.select(addr);        // On sélectionne le DS18B20

	ds.write(0x44, 1);      // On lance une mesure
	delay(1000);            // Et on attend la fin de la mesure

	ds.reset();             // On reset OneWire
	ds.select(addr);        // On sélectionne le DS18B20
	ds.write(0xBE);         // On envoie une demande de lecture du scratchpad

	for (byte i = 0; i < 9; i++) // On lit le scratchpad
		data[i] = ds.read();       // Et on stock les données reçues

	float temp = ((data[1] << 8) | data[0]) * 0.0625; // Calcul de la température  

	return temp; // Pas d'erreur
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
void setup() {
	analogWrite(pin_pwm,255);
        pinMode(pin_pwm, OUTPUT);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
void loop() {
	float temp = getTemperature();
	if (temp == 65535) {
		int bite = 1;
		//code à exécuter si la température n'a pas pu être récupérée
	}
	else {
		if(temp < 28) {
			analogWrite(pin_pwm,0);
			delay(100);
		}
		else if (temp > 32) {
			analogWrite(pin_pwm,255); //vitesse du ventilo 100%
			delay(100);
		}
		else {
			switch((int) temp) {
				case 28:
					analogWrite(pin_pwm,51); //vitesse du ventilo 20%
					delay(100);
				break;
				case 29:
					analogWrite(pin_pwm,102); //vitesse du ventilo 40%
					delay(100);
				break;
				case 30:
					analogWrite(pin_pwm,153); //vitesse du ventilo 60%
					delay(100);
				break;
				case 31:
					analogWrite(pin_pwm,204); //vitesse du ventilo 80%
					delay(100);
				break;
			}
		}
	}
delay(3000);
}
--
J'ai eu énormément de difficultés à le réaliser, c'est pourquoi j'ai demandé à un ami de m'aider. Il a apporté de légères modifications pour que ça fonctionne.
Au niveau du fonctionnement, avec la led, ça à l'air de fonctionner. Quand je met un foehn devant le capteur, la led se met en marche; et quand je refroidis le capteur, la led s’éteint.
Maintenant passons à la problématique. Je branche le ventilateur sur une alim externe 12v. Quand je branche le câble sur la même ligne que la cathode de la led, le ventilateur ne change presque pas d'intensité. On sens une très légère différence mais il devrait être arrêté, vu que la led est éteinte.
Pourtant j'ai bien branché le câble bleu du ventilateur (c'est le dernier du connecteur).

Auriez vous une idée pourquoi cela ne fonctionne pas?

Merci et bonne soirée
signé Timothée
Avatar de l’utilisateur
Jacques
Site Admin
Messages : 5616
Inscription : jeu. oct. 23, 2014 3:02 pm
Imprimante 3D : Witbox, Witbox 2 et Hephestos
Localisation : Aix en Provence
Contact :

Je crains que ton problème soit lié à ce que j'écrivais plus haut, ce ventilateur demande une fréquence PWM de 25Khz alors que l'Arduino ne donne qu'une fréquence de 500 à 900hz regarde ici https://www.arduino.cc/en/Reference/AnalogWrite
Tu pourrais le vérifier en générant une fréquence de 25kz par l'Arduino, en y branchant le ventilateur, il devrait tourner à mi-vitesse.

Si c'est bien le problème, tu ne pourras pas utiliser cette solution mais utiliser un transistor directement sur la puissance.
Des idées d'améliorations https://www.thingiverse.com/Premium/designs
Une question, une précision, un manque de pièces détachées, posez vos questions ici même.
Tim0th3e
Contributeur actif
Messages : 240
Inscription : sam. oct. 25, 2014 9:02 am
Imprimante 3D : Hephestos I 2014 + plateau Mk2a, montée quand j'étais assez petit
Localisation : Suisse

Pour générer une fréquance de 25khz puis-je utiliser cette notation dans le programme arduino?

Merci
signé Timothée
Avatar de l’utilisateur
Jacques
Site Admin
Messages : 5616
Inscription : jeu. oct. 23, 2014 3:02 pm
Imprimante 3D : Witbox, Witbox 2 et Hephestos
Localisation : Aix en Provence
Contact :

Oui, c'est parfait, 25000 hz ca devrai mettre le ventilateur à 50%
Il ne sera par contre pas possible d'augment ou de baisser la vitesse, c'est juste pour vérifier si j'ai raison.
Des idées d'améliorations https://www.thingiverse.com/Premium/designs
Une question, une précision, un manque de pièces détachées, posez vos questions ici même.
Tim0th3e
Contributeur actif
Messages : 240
Inscription : sam. oct. 25, 2014 9:02 am
Imprimante 3D : Hephestos I 2014 + plateau Mk2a, montée quand j'étais assez petit
Localisation : Suisse

Voici le code que j'ai utilisé:

Code : Tout sélectionner

void setup() {
  
pinMode(10, OUTPUT);
}

void loop() {
tone(10,25000);  
}
--
Très simple.
J'ai branché le fil pwm sur la pin D10 et j’entends que le ventilateur basse mais je ne saurais pas dire si c'est 50%.
Par contre le flux d'air distribué ne change pas.
signé Timothée
Avatar de l’utilisateur
Jacques
Site Admin
Messages : 5616
Inscription : jeu. oct. 23, 2014 3:02 pm
Imprimante 3D : Witbox, Witbox 2 et Hephestos
Localisation : Aix en Provence
Contact :

Si la vitesse baisse, le bruit baisse (sérieusement) et le flux d'air aussi... :-??
Des idées d'améliorations https://www.thingiverse.com/Premium/designs
Une question, une précision, un manque de pièces détachées, posez vos questions ici même.
Tim0th3e
Contributeur actif
Messages : 240
Inscription : sam. oct. 25, 2014 9:02 am
Imprimante 3D : Hephestos I 2014 + plateau Mk2a, montée quand j'étais assez petit
Localisation : Suisse

Jacques a écrit :Si la vitesse baisse, le bruit baisse (sérieusement) et le flux d'air aussi... :-??
Le flux d'air non, et je dirai que le bruit baisse très très légèrement...
signé Timothée
Tim0th3e
Contributeur actif
Messages : 240
Inscription : sam. oct. 25, 2014 9:02 am
Imprimante 3D : Hephestos I 2014 + plateau Mk2a, montée quand j'étais assez petit
Localisation : Suisse

EDIT:

Avec 25Khz le ventilateur diminue bien sa vitesse. J'ai mis une fréquence de 100khz et la vitesse ne change pas.

Que faire ?

Merci et bonne soirée
signé Timothée
Avatar de l’utilisateur
Jacques
Site Admin
Messages : 5616
Inscription : jeu. oct. 23, 2014 3:02 pm
Imprimante 3D : Witbox, Witbox 2 et Hephestos
Localisation : Aix en Provence
Contact :

C'est 25 Khz ou rien pour ce test
10Khz est une fréquence audible, ca doit siffler en effet
Si le fil de commande est mis à la masse, le ventilateur devrait s'arrêter (attention le débrancher de la carte arduino avant de faire cet essai)
Si la vitesse ne baisse pas, peut être faut-il retirer la résistance en série avec la commande (si tu en as mis une)

On est donc d'accord, 100Khz ne fait rien par contre 25K baisse la vitesse.
Il n'y a donc pas le choix, il faut utiliser le PWM directement sur le 12V, il faudra donc un transistor de puissance. Commandé par la carte arduino, sa source sera le/les ventilateurs connectés au 12V, le drain sera lui à la masse.
Des idées d'améliorations https://www.thingiverse.com/Premium/designs
Une question, une précision, un manque de pièces détachées, posez vos questions ici même.
Tim0th3e
Contributeur actif
Messages : 240
Inscription : sam. oct. 25, 2014 9:02 am
Imprimante 3D : Hephestos I 2014 + plateau Mk2a, montée quand j'étais assez petit
Localisation : Suisse

J'ai commandé le transistor. Il arrivera en fin de semaine. Je vous redonne des nouvelles quand le montage sera refait

Bonne soirée
signé Timothée
Tim0th3e
Contributeur actif
Messages : 240
Inscription : sam. oct. 25, 2014 9:02 am
Imprimante 3D : Hephestos I 2014 + plateau Mk2a, montée quand j'étais assez petit
Localisation : Suisse

Bonjour,
J'ai reçu les transistors. J'ai réalisé mon montage comme ceci:
Circuit
Circuit
Et j'utilise le même programme que pour les mesures de températures, sauf que j'ai modifié la fin. La voici:

Code : Tout sélectionner

void setup() {

  pinMode(pin_led, OUTPUT);
  Serial.begin(9600);
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void loop() {

  float temp = getTemperature();
  Serial.println(temp);

  if (temp > 32) {
    Serial.println("TEMPERATURE SUPPERIEURE A 32 DEGRES, VENTILATEUR A 100%");
    //Serial.println("------------------------------------------------------");
    analogWrite(pin_led, 0); //inverser les données ex 255 pwm = 0
    delay(100);
  }
  else if (temp > 30) {
    Serial.println("TEMPERATURE SUPPERIEURE A 30 DEGRES, VENTILATEUR A 80%");
    //Serial.println("------------------------------------------------------");
    analogWrite(pin_led, 51); //inverser les données ex 204 pwm = 51
    delay(100);
  }
  else if (temp > 28) {
    Serial.println("TEMPERATURE SUPPERIEURE A 28 DEGRES, VENTILATEUR A 60%");
    Serial.println("-------------------------------------------------------");
    analogWrite(pin_led, 102); //inverser les données ex 153 pwm = 102
    delay(100);
  }
  else if (temp > 26) {
    Serial.println("TEMPERATURE SUPPERIEURE A 26 DEGRES, VENTILATEUR A 40%");
    Serial.println("-------------------------------------------------------");
    analogWrite(pin_led, 153); //inverser les données ex 102 pwm = 153
    delay(100);
  }
  else if (temp > 24) {
    Serial.println("TEMPERATURE SUPPERIEURE A 24 DEGRES, VENTILATEUR A 20%");
    Serial.println("-------------------------------------------------------");
    analogWrite(pin_led, 204); //inverser les données ex 51 pwm = 204
    delay(100);
  }
}
----
En exécutant cela, le programme fonctionne bien avec une led. Elle varie son intensité en fonction de la température. Par contre, avec le ventilateur, il ne se passe rien...
Auriez-vous une idée? :-??

Merci et bonne soirée
signé Timothée
Tiflo
Contributeur
Messages : 76
Inscription : dim. déc. 27, 2015 12:36 am
Imprimante 3D : Prusa i3 Hephestos BQ

Bonsoir,

4,7kOhm entre l'arduino et la gate c'est beaucoup trop.
Cette résistance n'est pas vraiment utile, si tu veux vraiment en mettre une, utilise 100Ohm.
Par contre ce qui est important c'est de mettre une résistance Pulldown (sur la ligne arduino -> mossfet mais dirigé vers la masse). ça permet de garantir que le mosfet rester fermer si il y a un problème avec l'arduino.


Tiflo
Avatar de l’utilisateur
Jacques
Site Admin
Messages : 5616
Inscription : jeu. oct. 23, 2014 3:02 pm
Imprimante 3D : Witbox, Witbox 2 et Hephestos
Localisation : Aix en Provence
Contact :

J'ai bien une petite idée...
En premier il faut prendre l'habitude de faire ses schémas selon les symboles normalisées (comme par exemple le mosfet)
En second on représente en principe le plus par un ligne horizontale en haut et le moins par une autre ligne en bas, le montage se faisant au centre, entre les lignes (le courant passe alors du haut vers le bas).
En troisième, on respecte le sens de lecture, le signal vient de la gauche pour aller vers la droite (arduino à gauche, ventilateur à droite)
En respectant ces principes la lecture se fait en un instant.

Alors une led fonctionne mais pas un ventilateur car le mos est mal branché, la source doit se trouver à la masse et le drain doit être mis à la borne - du ventilateur, le + est lui directement au + 12v
Si tu regardes les plans de la RAMPS, c'est monté de cette manière. Typiquement le schéma que tu propose est pour un mos canal P alors que tu utilises un canal N

Image
Des idées d'améliorations https://www.thingiverse.com/Premium/designs
Une question, une précision, un manque de pièces détachées, posez vos questions ici même.
Tim0th3e
Contributeur actif
Messages : 240
Inscription : sam. oct. 25, 2014 9:02 am
Imprimante 3D : Hephestos I 2014 + plateau Mk2a, montée quand j'étais assez petit
Localisation : Suisse

Jacques a écrit : En premier il faut prendre l'habitude de faire ses schémas selon les symboles normalisées (comme par exemple le mosfet)
En second on représente en principe le plus par un ligne horizontale en haut et le moins par une autre ligne en bas, le montage se faisant au centre, entre les lignes (le courant passe alors du haut vers le bas).
En troisième, on respecte le sens de lecture, le signal vient de la gauche pour aller vers la droite (arduino à gauche, ventilateur à droite)
En respectant ces principes la lecture se fait en un instant.
J'essaierai d'en tenir compte dans mes prochains schémas. Merci pour l'astuce.
Jacques a écrit :Alors une led fonctionne mais pas un ventilateur car le mos est mal branché, la source doit se trouver à la masse et le drain doit être mis à la borne - du ventilateur, le + est lui directement au + 12v
Si tu regardes les plans de la RAMPS, c'est monté de cette manière. Typiquement le schéma que tu propose est pour un mos canal P alors que tu utilises un canal N

Image
D'accord je l'ai bien branché cette fois mais rien ne se passe. Pourtant je ne pense pas que c'est une erreur de firmware car il fonctionne parfaitement avec une led...
Du coup est-ce que un ventilateur peut justement recervoir des instructions avec la fonction "analogWrite", c'est a dire des quantités variables de courant?

Merci
signé Timothée
Avatar de l’utilisateur
Jacques
Site Admin
Messages : 5616
Inscription : jeu. oct. 23, 2014 3:02 pm
Imprimante 3D : Witbox, Witbox 2 et Hephestos
Localisation : Aix en Provence
Contact :

La fonction PWM permet de moduler dans le temps un signal qui sera égal à +5v ou 0v selon un rapport cyclique qui va de 0% à 100% qui lui-même est lié à une valeur comprise entre 0 et 255.
La "variation de tension" est en fait égale à la moyenne du rapport cyclique.
Un exemple pour la valeur 25 le rapport entre le signal haut (5v) et le signal bas est de 10%. Sur un période de temps, ce rapport sera alors de 10% de 5V soit, 0,5v.
Dans le cas présent l'alimentation étant de 12V, ce rapport au niveau du ventilateur sera égal à 1,2 V.
La variation de vitesse sera alors en rapport avec la moyenne de tension appliquée au ventilateur. Le courant lui n'étant lié qu'aux caractéristiques du ventilateur.

Cependant il est à noter que la majorité des ventilateurs ont une électronique interne ne permettant pas de se mettre en marche avec une tension moyenne inférieure à 5v. Certains ne fonctionneront pas à mois de 8v et d'autre pas du tout en dessous de 11V.
Il est donc utile de tester avec plusieurs moteurs afin de s'assurer que le montage fonctionne avant de tirer une conclusion définitive.
Des idées d'améliorations https://www.thingiverse.com/Premium/designs
Une question, une précision, un manque de pièces détachées, posez vos questions ici même.
Répondre