// Variation de la vitesse d'un ventilateur // en fonction de la température du dissipateur. // LM35DT (TO220) pour la mesure de la température. // Ventilateur(s) commandé(s) par sortie PWM Intégrée et amplifiée. // Alarme température élevée. // www.rotilom.com/F6IDT/ventilo.htm #include #include ///// ENTREES ///// #define TEMP_ADC A0 // Mesure température avec un LM 35DT ///// SORTIES ///// #define PWM_PIN 3 // Contrôle du ventilateur par PWM_PIN #define ALARME 13 // Alarme temérature élevée //// PARAMETRES //// #define MOY_NUM 10 // Nombre de mesures à moyenner pour la mesure de température //------------------------------------------------------------------ ////////////// DECLARATION DES VARIABLES GLOBALES ////////////////// //------------------------------------------------------------------ int temperature = 0; int PWM = 0; // Adresse (à modifier éventuellement)du LCD de 2 lignes de 16 caractères LiquidCrystal_I2C lcd(0x3F, 16, 2); //LiquidCrystal_I2C lcd(0x27, 16, 2); //****************** DEBUT PROGRAMME ************************* void setup() { Serial.begin(9600); // vitesse moniteur série // Fréquence PWM_PIN = 31,4 kHz TCCR2B = TCCR2B & B1111000 | B00000001; pinMode(PWM_PIN,OUTPUT); digitalWrite(PWM_PIN,LOW); pinMode(ALARME,OUTPUT); digitalWrite(ALARME,LOW); lcd.begin(); // initialisation du LCD I2C lcd.backlight(); lcd.setCursor(0, 0); lcd.clear(); } void loop() { read_data(); // lecture de la température ventilo_PWM(); // PWM sur ventilateur print_data(); // affichage dans le serial monitor lcd_display(); // affichage sur LCD delay(200); // 5 mesures par seconde } //********************* FIN PROGRAMME ***************************** //----------------------------------------------------------------- /////////// LECTURE ET MOYENNAGE DES ENTREES ANALOGIQUES ////////// //----------------------------------------------------------------- int read_adc(int adc_parameter) { int sum = 0; int sample ; for (int i = 0; i < MOY_NUM; i++) { // Boucle MOY_NUM de fois sample = analogRead(adc_parameter); // Lecture de la valeur sum += sample; // Somme des mesures avant moyenne delayMicroseconds(50); // Pause de 50 microsecondes } return(sum / MOY_NUM); // Calcul de la mesure moyenne } //--------------------------------------------------- ////////// LECTURE DE LA TEMPERATURE //////////////// //--------------------------------------------------- void read_data() { // Pour 5V on a ADC = 1024 d'ou 1 ADC = (5/1024)Volt = 0.00488 Volt // La valeur de 0,00488 est théorique et devra éventuellement être ajustée. temperature = read_adc(TEMP_ADC)*0.00495*100; } //-------------------------------------------------- //////////////// PWM_PIN VENTILATEUR ////////////////// //-------------------------------------------------- void ventilo_PWM() { if (temperature <= 25) { PWM = 0; digitalWrite(ALARME,LOW); } else if ((temperature > 25) && (temperature <= 35)) { PWM = 90; digitalWrite(ALARME,LOW); } else if ((temperature > 35) && (temperature <= 40)) { PWM = 130; digitalWrite(ALARME,LOW); } else if ((temperature > 40) && (temperature <= 45)) { PWM = 170; digitalWrite(ALARME,LOW); } else if ((temperature > 45) && (temperature <= 50)) { PWM = 200; digitalWrite(ALARME,LOW); } else if ((temperature > 50) && (temperature <= 60)) { PWM = 255; digitalWrite(ALARME,LOW); } else if (temperature > 60) { PWM = 255; digitalWrite(ALARME,HIGH); } analogWrite(PWM_PIN,PWM); } //-------------------------------------------------- ///////// AFFICHAGE DANS SERIAL MONITOR //////////// //-------------------------------------------------- void print_data() { Serial.print("Température: "); Serial.print(temperature); Serial.println(" degrés Celsius"); Serial.print("PWM: "); Serial.println(PWM); Serial.println("******************************"); } //------------------------------------------------------ ///////////////// AFFICHAGE SUR LCD //////////////////// //------------------------------------------------------ void lcd_display() { // affichage de la température lcd.setCursor(0, 0); lcd.print("T= "); lcd.print(temperature); lcd.write(0b11011111); // symbole degré lcd.print("C "); // affichage du PWM lcd.setCursor(0,1); lcd.print("PWM= "); lcd.print(PWM); lcd.print(" "); }