Partage
  • Partager sur Facebook
  • Partager sur Twitter

Domotique Arduino

    27 janvier 2014 à 18:59:22

    Bonjour tout le monde,

       je viens vers vous car je rencontre quelque petits problème sur un projet que je me suis laissé entreprendre.

    Je voudrais donc créer un "automate" a base d'Arduino pour gérer certaine chose de ma maison:

    • Chauffage,
    • Lampe,
    • Prise,
    • Visu température extérieure,
    • Et peut être par la suite installer une caméra IP ( car je travaille en même temps avec un Raspberry Pi :D)
    • ...

        Le matériel que j'utilise est basé principalement sur du matériel Tinkerkit pour le moment. Je précise car quand mon projet sera au point je monterais mes cartes moi même qui seront liées au RPI par onde radio sur laquelle  je ferais une interface graphique.

    Et puis le temps ne me manque pas sachant que le matériel n'est pas encore totalement a ma disposition.

    J'ai pour le moment pour mon thermostat :

    • Une sonde de température,
    • Un relais pour commander le thermostat,
    • Un potentiomètre pour changer la consigne de chauffe.
    • Une led Rouge pour indiquer que la chaudière n'est pas en marche de chauffe,
    • Une led Verte pour indiquer qu'elle est bien en marche de chauffe, ( Je tiens a préciser que par la suite je vais utiliser un écran 16*2 pour l'affichage de la température).

    Voilà pour la partie matériel ^^.

    En ce qui concerne le fonctionnement il est assez simple. Sa Fonctionne comme ceci:

    • Lecture de la température : je la lis 8 fois d'affiler :o (je sais vous aller me dire que je suis fou, mais c'est la seul façon que j'ai trouvé pour le moment de stabiliser correctement ma température)
    • Je la compare et si elle est cohérente, je l'affiche.
    • Je compare les valeurs Maxi et Mini afin de les affichées correctement.

    Voila pour la lecture de la température. Ici le problème est à la comparaison des valeurs Maxi et Mini. Le Mini reste toujours égale a 0.

    Ensuite voici la fonction du thermostat:

    • Je lis la valeurs du potar.
    • Je la définie avec un "map" pour qu'il y ai 19 valeurs.
    • Je définie ces valeurs en fonction des températures recherchées.
    • J'affiche les valeurs et le relais passe a 0/1 en fonction de la température et de la consigne.

    Second problème, si je débranche/rebranche l'Arduino, le potar peut être régler au milieu il m'affichera 0 jusqu'à ce que je le tourne a fond.

    Voici mon code en trois fichiers, il y a surement beaucoup de choses a revoir. (Ne faites pas attention à tout ces "Serial.print(blablabla);" ces pour moi j'aime bien qu'il m'affiche tout plein de bordel ^^.

    //thermostat.ino

    #include <TinkerKit.h>
    	
    TKThermistor therm(I0);        
    TKMosFet relay(O0); 
    TKLed ledVerte(O1);
    TKLed ledRouge(O2);
    TKLightSensor ldr(I2);
    TKPotentiometer pot(I1); 
    int brightnessValue = 0;
    int lightValue =0;
    float C =0;
    float tempConsigne = 20;
    float tempAffiche =0;
    float tempMin = 30;
    float tempMax =0;
    
    void setup()
    {
      Serial.begin(9600);
    }
    
    void loop()
    {
      //fonction_thermostat();  
      temperature();  
      lecture_lumiere(lightValue); 
      
    }

    // fonction_thermostat.ino

    void fonction_thermostat()
    {
       static unsigned long tempo = 0;
       brightnessValue = pot.read();
       brightnessValue = map(brightnessValue, 0, 1023, 0, 18);
       
          if(brightnessValue == 18)
          {
             tempConsigne = 10;
          }
          else if(brightnessValue == 17)
          {
             tempConsigne = 15.5;
          } 
          else if(brightnessValue == 16)
          {
             tempConsigne = 16;
          } 
          else if(brightnessValue == 15)
          {
             tempConsigne = 16.5;
          } 
          else if(brightnessValue == 14)
          {
             tempConsigne = 17;
          } 
          else if(brightnessValue == 13)
          {
             tempConsigne = 17.5;
          } 
          else if(brightnessValue == 12)
          {
             tempConsigne = 18;
          } 
          else if(brightnessValue == 11)
          {
             tempConsigne = 18.5;
          } 
          else if(brightnessValue == 10)
          {
             tempConsigne = 19;
          } 
          else if(brightnessValue == 9)
          {
             tempConsigne = 19.5;
          }
          else if(brightnessValue == 8)
          {
             tempConsigne = 20;
          }
          else if(brightnessValue == 7)
          {
             tempConsigne = 20.5;
          }
          else if(brightnessValue == 6)
          {
             tempConsigne = 21;
          }
          else if(brightnessValue == 5)
          {
             tempConsigne = 21.5;
          }
          else if(brightnessValue == 4)
          {
             tempConsigne = 22;
          }
          else if(brightnessValue == 3)
          {
             tempConsigne = 22.5;
          }
          else if(brightnessValue == 2)
          {
             tempConsigne = 23;
          }
          else if(brightnessValue == 1)
          {
             tempConsigne = 23.5;
          }
          else if(brightnessValue == 0)
          {
             tempConsigne = 24;
          }       
        
        
      if((millis()-tempo)> 2000)
        {                           
           Serial.print("temperature de consigne brute =" );
           Serial.println(brightnessValue);
           Serial.print("temperature de consigne =" );
           Serial.print(tempConsigne);
           Serial.println(" Degres Celsius");   
             
           tempo=millis();
        }
      
      if(tempAffiche < tempConsigne-0.7 && relay.state() == false)
        {
          relay.on();
          ledVerte.on();
          ledRouge.off();
        }
      else if(tempAffiche > tempConsigne +0.3 && relay.state() == true)
        {
          relay.off();
          ledRouge.on();
          ledVerte.off();
        } 
    }

    //lecture_temp.ino

     void temperature()
    {
       static unsigned long tempo = 0;
       
       float temp[8] ={0};
       float lastTemp = 0;
       
       for(int i=0; i<8; i++)
       {
         C = therm.readCelsius()-1;
         temp[i] = C;     
         lastTemp += temp[i];  
       }   
    
      lastTemp /= 8;
      if(lastTemp == temp[0] && lastTemp == temp[1] && lastTemp == 
      temp[2] && lastTemp == temp[3] && lastTemp == temp[4] && 
      lastTemp == temp[5] && lastTemp == temp[6] && lastTemp == temp[7])
       {
         tempAffiche = lastTemp;
       }
       
      if(tempAffiche > tempMax){tempMax = tempAffiche;}
      if(tempAffiche < tempMin){tempMin = tempAffiche;}
      
      if((millis()-tempo)>2000)
        {
          Serial.print("temperature apres calcul = ");
            Serial.print(tempAffiche, 1);
            Serial.println(" Degres Celsius");
           Serial.print("temperature Mini= ");
            Serial.print(tempMin, 1);
            Serial.println(" Degres Celsius"); 
           Serial.print("temperature Maxi = ");
            Serial.print(tempMax, 1);
            Serial.println(" Degres Celsius");  
            Serial.print("temperature de reference = ");
            Serial.print(C);
            Serial.println(" Degres Celsius");
            Serial.println("tableau de temperature = ");
            for(int i =0; i <8; i++)
            {
              Serial.print(temp[i]);
              Serial.print(" ,");
            }
            Serial.println();
            tempo=millis();
        }
        
    }




    -
    Edité par steph02590 27 janvier 2014 à 19:15:02

    • Partager sur Facebook
    • Partager sur Twitter
      28 janvier 2014 à 18:02:31

      Pour ce qui est des températures Mini/Maxi je les ai déplacé dans la boucle millis() et ça fonctionne. Reste le problème du potar...
      • Partager sur Facebook
      • Partager sur Twitter
        29 janvier 2014 à 10:29:45

        surtout ton problème avec temp min/max, c'était qe tu initialise pas tes valeurs. initialise tempMin à 200°C tu vas voir, ça va marcher.
        ton autre probleme vient peut-être du code. essaye avec une structure switch..case, déjà ça sera plus rapide (je sais que c'est trèèèèèèèès long à faire (et surtout trèèèèèèèèès chiant, mais ton code gagnera en rapidité et en lisibilité).
        sinon, ton potar, c'est quoi comme type? il se peut que ton probleme vienne de là, ou de la lib que tu as utilisé pour le lire. (ou des deux).

        • Partager sur Facebook
        • Partager sur Twitter

        oui. non. enfin je regarde et je te dis.

          29 janvier 2014 à 20:13:36

          tempMin est bien initialisée il est a 30 . j'ai résolu le problème comme je l'ai indiqué par la suite.

          Pour le switch je vais voir ce ne sera pas trop long je tape vite lol.

          Mon potar est celui proposer par tinkerkit qui ce branche directement sur la shield tinkerkit. Donc j'utilise la librairie tinkerkit.

          • Partager sur Facebook
          • Partager sur Twitter
            29 janvier 2014 à 21:02:30

            si le fait de réécrire ton switch/case n'a pas marché, pourquoi ne pas réaliser une lecture de la commande proportionnelle? (dans l'idée, pourquoi se faire chier à découper en un nombre entier de valeurs quand on peut juste faire exécuter une fontion affine au microcontroleur?)
            sinon, elle est exécutée quand ta fonction fonction_thermostat? enfin je veux dire... je la trouve pas, peut-être en as tu changé le nom (dans le main c'est lecture_lumiere?)

            • Partager sur Facebook
            • Partager sur Twitter

            oui. non. enfin je regarde et je te dis.

              29 janvier 2014 à 21:11:48

              Non La fonction est juste sous commentaire lol je l'ai mis ainsi car le relais me soûler un peu ^^ vu que le potar bug quand je n'y touche pas après un televersement. Donc tu as juste a retirer les slashs. Lecture_lumière c'est pour plus tard.

              Que veux tu dire par faire une fonction affine ?

              -
              Edité par steph02590 29 janvier 2014 à 21:12:34

              • Partager sur Facebook
              • Partager sur Twitter
                29 janvier 2014 à 21:50:42

                je sais d'ou vient ton erreur: tu dois donner des étendues dans ton switch/case (ou la série de else..if), parce que sinon, tu recherche une valeur exacte. la fonction map rend un réel long, et toi tu check sur des valeurs entieres. en gros tu n'as jamais de mise à jour de ta consigne parce que tu n'es jamais dans les contraintes que tu donne pour redimmensionner. j'arriv e pas trop à m'expliquer donc je te donne un exemple pour le haut de la structure, à toi d'étendre au reste de la liste.

                if(brightnessValue  <= 18){
                         tempConsigne = 10;
                      }
                else if(brightnessValue <= 17 && brightnessValue < 18)
                      {
                         tempConsigne = 15.5;
                      }

                ceci dit je trouve dommage de segmenter le thermostat en 19 cas comme ça là ou une simple opération "linéaire" suffirait: remplacer tout ton paté de if..else if par une fonction du style de tempConsigne = -0.014*brightnessValue + 24 (j'ai mis des valeurs au pif, relativement cohérentes mais à toi de regarder mieux pour trouver l'équation qui te plait, tu n'es par ailleurs pas limité à l'ordre 1, mais après ça fait du calcul pour au final pas beaucoup d'amélioration).

                • Partager sur Facebook
                • Partager sur Twitter

                oui. non. enfin je regarde et je te dis.

                  30 janvier 2014 à 21:42:47

                  j'ai essayer ta fonction qui fonctionne plutôt pas mal, mais je trouve que sa fonctionne au ralenti par rapport au switch.

                  Et j'ai toujours un problème, quand je compile mon programme et tant que je ne bouge pas le potar, il a tendance a faire des petits clic-clic. Il passe de 0 à 1 pour rien alors que la température ne bouge pas.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    30 janvier 2014 à 22:47:27

                    quand tu dis ma fonction, tu parle de laquelle? en tout cas, algorithmiquement parlant elle est bonne. je comprends pas ce qui te chagrine dans tout ça?... (0 et 1 sont peut-être très proches géographiquement, du coup des perturbations peuvent faire changer la donne...)

                    -
                    Edité par remace 30 janvier 2014 à 22:49:31

                    • Partager sur Facebook
                    • Partager sur Twitter

                    oui. non. enfin je regarde et je te dis.

                      31 janvier 2014 à 6:27:59

                      Je parle de cette fonction :   tempConsigne = -0.014*brightnessValue + 24.

                      Et non le problème n'est pas la car une fois que je bouge le potar et que je le remets a la même position et bien sa fonctionne très bien . De toutetoute façon si je ne réussi pas avec le potar, je passerai par deux boutons pour incrémenter et décrémenter la consigne.

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Domotique Arduino

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown