CTN 10Ko allume 3 leds en fonction de la temperature.

Bonjour , voici un petit programme pour savoir si la temperature d'une pièce (Séjour par exemple) est comprise dans la température souhaitée .
grâce à une CTN 10Ko dans cet exemple , on allume 3 led

led rouge allumée il fait trop chaud (au dessus de 21 degrés)
led jaune allumée temperature idéale (entre 19 et 21 degrés)
led bleue allumée il fait froid (en dessous de 19 degrés).

J'ai utilisé une CTN parce que je l'avais en stock . :slight_smile:

//Petit programme pour savoir si la temperature d'une piéce 
//(Séjour par exemple) est comprise dans la temperature
//souhaitée .
// grace à une CTN 10Ko dans cet exemple , on allume 3 led

// led rouge allumée il fait trop chaud (au dessus de 21 degrés) 
// led jaune allumée temperature idéale (entre 19 et 21 degrés)
// led bleue allumée il fait froid (en dessous de 19 degrés)
// Programme libre de droit 
//ARTNOW44 (c)2016
//********************************************************************************************

// CTN SUR PIN A0
#define CTNPIN A0         
// Valeur theorique de la CTN à 25 degrees C
#define CTNNOMINAL 10000      
#define TEMPERATURENOMINAL 25   
// le nombre d'échantillons à prendre 
// pour le lissage de la valeur
#define NUMSAMPLES 5
// coefficient pour la CTN (entre 3000-4000)
#define BCOEFFICIENT 3950
// la valeur de l'autre résistance 10Ko (noir/marron/orange)
#define SERIESRESISTOR 10000    
 
int echantillons[NUMSAMPLES];
    int rouge =2;//déclaration de la led rouge sur pin 2
    int jaune =3;//déclaration de la jaune sur pin 3
    int bleue =4;//déclaration de la led bleue sur pin 4
   
   
    void setup(void) {
      
      Serial.begin(9600);
       
  pinMode(2, OUTPUT);// initialise pin2 est une sortie.LED ROUGE
       
  pinMode(3, OUTPUT);// initialise pin3 est une sortie.LED JAUNE
       
  pinMode(4, OUTPUT); // initialise pin4 est une sortie.LED BLEUE
      analogReference(EXTERNAL);

    }
     
    void loop(void) {

      uint8_t i;
      float moyenne;
     
      // échantillonnage, avec un retard de 10ms
      for (i=0; i< NUMSAMPLES; i++) {
      echantillons[i] = analogRead(CTNPIN);
       delay(10);
   
      }
     
  // moyenne tous les échantillons
  moyenne = 0;
  for (i=0; i< NUMSAMPLES; i++) {
     moyenne += echantillons[i];
  }
  moyenne /= NUMSAMPLES;
 


     
      // convert the value to resistance
      moyenne = 1023 / moyenne - 1;
      moyenne = SERIESRESISTOR / moyenne;
  
  float temp;
  temp = moyenne / CTNNOMINAL;     // (R/Ro)
  temp= log(temp);                  // ln(R/Ro)
  temp /= BCOEFFICIENT;                   // 1/B * ln(R/Ro)
  temp += 1.0 / (TEMPERATURENOMINAL + 273.15); // + (1/To)
  temp = 1.0 / temp;                 // Inverser
  temp -= 273.15;                         // convertir en Celcius


      Serial.print("Temperature "); 
      Serial.print(temp);
      Serial.println(" C");

      delay(1000);
 // gestion des led avec la température
 // Led rouge au dessus de 21 degrés    
 // led jaune entre 19 et 21 degrés
 // led bleue en dessous de 19 degrés
        if (temp> 21 ) digitalWrite(rouge, HIGH);{
           if(temp >21) digitalWrite(jaune,LOW);{
               if(temp >20) digitalWrite(jaune,LOW);{
      if(temp <20) digitalWrite(rouge,LOW);{
        if (temp<21 ) digitalWrite(jaune, HIGH);{ 
      if (temp>19 ) digitalWrite(bleue, LOW);{ 
                
      if(temp <19) digitalWrite(jaune,LOW);{
         if(temp <19) digitalWrite(bleue,HIGH);{

        
    } }  } } } } }  }  }

Bonjour,
Ton code est instructif pour moi qui débute aussi.

Tu emploies beaucoup "define" pour déclarer tes constantes. C'est intuitif mais peut poser problème si le nom employé est contenu dans le nom d'une autre constante, d'après la doc.

C'est quoi "uint8_t i;" ?

L'allumage des leds n'aurait pas pu se simplifier avec "swich case" ?

achess:
Bonjour,
Ton code est instructif pour moi qui débute aussi.

Tu emploies beaucoup "define" pour déclarer tes constantes. C'est intuitif mais peut poser problème si le nom employé est contenu dans le nom d'une autre constante, d'après la doc.

C'est quoi "uint8_t i;" ?

L'allumage des leds n'aurait pas pu se simplifier avec "swich case" ?

Bonjour, comme toi je débute et j’apprends beaucoup en récupérant des bribes de codes par ci par là et en compilant à ma façons, Pour define , cela permet d'après ce que j'ai compris de prendre moins de place après compilation , donc pas d'intérêt dans ce petit programme , cela fonctionne alors j'ai laissé mais je vais essayer de travailler dessus pour comprendre. Pour uint8_t i : c'est pour indiquer que i est un octet type d'entier non signé d'une longueur de 8 bits.

Pour "swich case" , je vais aussi regarder ça , c'est intéressant .

J’ai aussi modifié mon montage avec une led tricolore, je vais investir dans un arduino mini pour faire un petit montage.

merci :slight_smile:

Bravo pour ce sketch, bien utile pour gérer facilement un chauffage soufflant dans une salle de bain !!

guy06210:
Bravo pour ce sketch, bien utile pour gérer facilement un chauffage soufflant dans une salle de bain !!

Bonjour , merci , oui guy06210 effectivement , plein de possibilités :par exemple :

Contrôler la bonne température d'un congélateur ,ou d'un réfrigérateur .....

asservir un soufflage d'insert , une ventilation .

une alerte gel (température négative).

un chauffage de vieille voiture en auto etc....(en ajoutant un potentiomètre pour la température voulue).

vive l'Arduino j'adore !!! :slight_smile:

bonjour,
ton code est bien, sauf que tu mets des { alors quelles ne sont pas prises en compte

        if (temp> 21 ) digitalWrite(rouge, HIGH);{
           if(temp >21) digitalWrite(jaune,LOW);{
               if(temp >20) digitalWrite(jaune,LOW);{
      if(temp <20) digitalWrite(rouge,LOW);{
        if (temp<21 ) digitalWrite(jaune, HIGH);{
      if (temp>19 ) digitalWrite(bleue, LOW);{
               
      if(temp <19) digitalWrite(jaune,LOW);{
         if(temp <19) digitalWrite(bleue,HIGH);{

       
    } }  } } } } }  }

si tu fais un if avec sans { juste derrière, c'est la première instruction qui est prise en compte et s'arrête à la fin de cette instruction
donc si tu avais écris ceci, cela aurait été la même chose

        if (temp> 21 ) digitalWrite(rouge, HIGH);
           if(temp >21) digitalWrite(jaune,LOW);
               if(temp >20) digitalWrite(jaune,LOW);
      if(temp <20) digitalWrite(rouge,LOW);
        if (temp<21 ) digitalWrite(jaune, HIGH);
      if (temp>19 ) digitalWrite(bleue, LOW);
               
      if(temp <19) digitalWrite(jaune,LOW);
         if(temp <19) digitalWrite(bleue,HIGH);

tu aurais pu simplifier la chose avec les { } et avec un peu plus de logique dans tes conditions

        if (temp > 21 ) {digitalWrite(rouge, HIGH);} else {digitalWrite(rouge,LOW);}
        if (temp > 20 ) { digitalWrite(jaune,LOW);} else { digitalWrite(jaune, HIGH);}
        if (temp > 19 ) { digitalWrite(bleue, LOW);} else { digitalWrite(bleue,HIGH);}

Bonjour,

ARTNOW:
led rouge allumée il fait trop chaud (au dessus de 21 degrés)
led jaune allumée temperature idéale (entre 19 et 21 degrés)
led bleue allumée il fait froid (en dessous de 19 degrés).

Il n'y a que 2 seuils, j'ai pensé à 2 conditions :

if (temp > 21 ) {digitalWrite(rouge,1);digitalWrite(jaune,0);}
 else {digitalWrite(rouge,0);digitalWrite(jaune,1);}

if (temp > 19 ) { digitalWrite(bleue,0);digitalWrite(jaune,1);}
 else { digitalWrite(bleue,1);digitalWrite(jaune,0);}

PS: 0 et 1 c'est moins de boulot à écrire.
Avec swich case, je ne sait pas si on peut :wink:

Bonjour , merci infobarquee super simplification , je prend .

Par contre pour achess , je pense que ton code n'est pas complet car imagine que la température descende en dessous de 17 donc par exemple 15 ..... quand tu vas remonter en température à 20 degrés tu auras la led bleue allumée avec la jaune ...

:).

if (temp > 21 ) {digitalWrite(rouge,1);digitalWrite(jaune,0);}
else {digitalWrite(rouge,0);digitalWrite(jaune,1);}

if (temp > 19 ) { digitalWrite(bleue,0);digitalWrite(jaune,1);}
else { digitalWrite(bleue,1);digitalWrite(jaune,0);}

vue que les {} sont inutiles avec une instruction seule le code suivant doit fonctionner:

        if (temp > 21 ) digitalWrite(rouge, HIGH); else digitalWrite(rouge,LOW);
        if (temp > 20 )  digitalWrite(jaune,LOW); else  digitalWrite(jaune, HIGH);
        if (temp > 19 )  digitalWrite(bleue, LOW); else  digitalWrite(bleue,HIGH);

achess:

if (temp > 19 ) { digitalWrite(bleue,0);digitalWrite(jaune,1);}

else { digitalWrite(bleue,1);digitalWrite(jaune,0);}



PS: 0 et 1 c'est moins de boulot à écrire. 
Avec swich case, je ne sait pas si on peut ;)

oui mais les 1 ou les 0 comme tous les nombres écrit dans le code utilise plus de ressources du micocontroleur c'est pour cela qu'on déclare les variables au début du programme ou on utilise celles déjà déclarées tel que true, false, HIGH, LOW ...

fifi82:
vue que les {} sont inutiles avec une instruction seule le code suivant doit fonctionner:

        if (temp > 21 ) digitalWrite(rouge, HIGH); else digitalWrite(rouge,LOW);

if (temp > 20 )  digitalWrite(jaune,LOW); else  digitalWrite(jaune, HIGH);
        if (temp > 19 )  digitalWrite(bleue, LOW); else  digitalWrite(bleue,HIGH);



oui mais les 1 ou les 0 comme tous les nombres écrit dans le code utilise plus de ressources du micocontroleur c'est pour cela qu'on déclare les variables au début du programme ou on utilise celles déjà déclarées tel que true, false, HIGH, LOW ...

oui le code peut fonctionner dans l'exemple que j'ai donné sans les {}
MAIS, cela est plus clair lorsque l'on commence a programmer.
après chacun ses gouts, surtout si dans le cas présent, le code ne prend pas des masses de mémoires.
on est pas à 1 caractère près dans ce cas.

il me semble, mais ce n'est que mon avis, qu'il faut partir sur de bonnes bases au départ afin de mieux structurer son code.

Bon, si c'est un concours moi aussi je propose ma solution. Il suffit de suivre le cdc (le commentaire).

  digitalWrite(rouge,temp>21);              // Led rouge allumée au dessus de 21 degrés
  digitalWrite(jaune,temp>=19 && temp <=21);// led jaune allumée entre 19 et 21 degrés
  digitalWrite(bleue,temp<19);              // led bleue allumée en dessous de 19 degrés

Continuez cela m'intéresse au plus haut point à 70 ans j'en apprend chaque jour un peu plus, merci à vous.

Bonsoir à tous , merci pour vos solutions de simplifications , c'est super du coup j'ai tester elles fonctionnent toutes , j'ai ajouter une ligne pour étalonner la sonde (légère déviation de 1.3 degrés sur ma sonde entre 18 et 25° température testées) .

Je poste donc le code de l'heureux gagnant qui se reconnaitra :slight_smile: :slight_smile: .

En tout cas bravo pour votre coté pédagogique et amical , c'est le premier forum ou je prend plaisir à poster et lires vos commentaires et réalisations .

//Petit programme pour savoir si la temperature d'une piece 
//(Sejour par exemple) est comprise dans la temperature
//souhaitee .
// grace a  une CTN 10Ko dans cet exemple , on allume 3 led

// led rouge allumee il fait trop chaud (au dessus de 22 degres) 
// led jaune allumee temperature ideale (entre 19 et 22 degres)
// led bleue allumee il fait froid (en dessous de 19 degres)
// Programme libre de droit 
//ARTNOW44 (c)2016
//********************************************************************************************

// CTN SUR PIN A0
#define CTNPIN A0         
// Valeur theorique de la CTN a  25 degrees C
#define CTNNOMINAL 10000      
#define TEMPERATURENOMINAL 25   
// le nombre d'echantillons à prendre 
// pour le lissage de la valeur
#define NUMSAMPLES 5
// coefficient pour la CTN (entre 3000-4000)
#define BCOEFFICIENT 3950
// la valeur de l'autre resistance 10Ko (noir/marron/orange)
#define SERIESRESISTOR 10000    
 
int echantillons[NUMSAMPLES];
    int rouge =2;//declaration de la led rouge  2
    int jaune =3;//declaration de la jaune 3
    int bleue =4;//declaration de la led bleue 4
    int tetal; // pour temperature etalonee
    void setup(void) {
      
    Serial.begin(9600);
       
  for (int thisPin = 2; thisPin < 5; thisPin++) {// On declare les pins 2 a 4 en sorties
    pinMode(thisPin, OUTPUT);}
      analogReference(EXTERNAL);

    }
     
    void loop(void) {

      uint8_t i;
      float moyenne;
     
      // echantillonnage, avec un retard de 10ms
      for (i=0; i< NUMSAMPLES; i++) {
      echantillons[i] = analogRead(CTNPIN);
       delay(10);
   
      }
     
  // moyenne tous les echantillons
  moyenne = 0;
  for (i=0; i< NUMSAMPLES; i++) {
     moyenne += echantillons[i];
  }
  moyenne /= NUMSAMPLES;     
      // convertion de la valeur de la resistance
      moyenne = 1023 / moyenne - 1;
      moyenne = SERIESRESISTOR / moyenne;
  
  float temp;  
  temp = moyenne / CTNNOMINAL;     // (R/Ro)
  temp= log(temp);                  // ln(R/Ro)
  temp /= BCOEFFICIENT;                   // 1/B * ln(R/Ro)
  temp += 1.0 / (TEMPERATURENOMINAL + 273.15); // + (1/To)
  temp = 1.0 / temp;                 // Inverser
  temp -= 273.15;                         // convertir en Celcius
  tetal=temp-1.6; // Etalonnage de ma sonde a  verifier sur la votre !!


      Serial.print("Temperature "); 
      Serial.print(tetal);
      Serial.println(" C");
      delay(1000);
 // gestion des led avec la temperature

  digitalWrite(rouge,tetal>22);              // Led rouge allumee au dessus de 22 degres
  digitalWrite(jaune,tetal>=19 && tetal <=22);// led jaune allumee entre 19 et 22 degres
  digitalWrite(bleue,tetal<19);              // led bleue allumee en dessous de 19 degres
    }

ARTNOW:
Par contre pour achess , je pense que ton code n'est pas complet car imagine que la température descende en dessous de 17 donc par exemple 15 ..... quand tu vas remonter en température à 20 degrés tu auras la led bleue allumée avec la jaune ...

:).

if (temp > 21 ) {digitalWrite(rouge,1);digitalWrite(jaune,0);}
else {digitalWrite(rouge,0);digitalWrite(jaune,1);}

if (temp > 19 ) { digitalWrite(bleue,0);digitalWrite(jaune,1);}
else { digitalWrite(bleue,1);digitalWrite(jaune,0);}

Et pourquoi donc ? en passant le seuil de 19 °, la bleue s'éteint et la jaune s'allume.

Kamill, on peut donc remplacer une constante par une condition ?

Et avec swich case, ça donnerait quoi ?

Et avec swich case, ça donnerait quoi ?

des lignes en plus pour rien :wink:
tu vas pas mettre un case pour chaque temp.

achess:
Et pourquoi donc ? en passant le seuil de 19 °, la bleue s'éteint et la jaune s'allume.

Bonjour , oui effectivement ACHESS Ton code est fonctionnel également dessolé :slight_smile: .

J'ai choisi cette version de code car je la trouve pratique à modifier et à interpréter :

digitalWrite(jaune,tetal>=19 && tetal <=22);// led jaune allumee entre 19 et 22 degres.

achess:

Kamill, on peut donc remplacer une constante par une condition ?

Ce n'est pas une constante c'est une variable.

Une condition par exemple temp>21 vaut true ou false suivant temp

Comme C++ n'est pas un langage fortement typé, il y a une conversion implicite en entier 0/1

Donc on peut par exemple écrire sans problème

int val = temp>21;

Ou remplacer un entier par un test conditionnel dans toute expression

infobarquee:
tu vas pas mettre un case pour chaque temp.

D'autant plus que ce sont des float et entre 19 et 21 ça en fait une tripotée de valeurs.

de plus, tu peux utiliser un case, mais comme déjà dit, ca fait des lignes en plus pour rien.
si <19 valeur=1
si >21 valeur=2
sinon valeur=3
case 1.....
case 2.....
case 3......

en gros, 9-12 lignes au lieu de 3 maxi, le choix est vite fait, non?

Merci de votre aide kamill et infobarquee et désolé ARTNOW pour avoir squatté ton sujet :confused: