Go Down

Topic: "tuto" thermostat, en cours de structuration (Read 979 times) previous topic - next topic

FP24V

en cours de création va évoluer petit à petit, suis preneur de toute remarque

bonjour a tous:


j'aimerai créer un tuto sur une petit projet que je viens de finir dans le but  de redonner l'assistance que beaucoup d'entre vous m'ont fournis de maniérés passive ou active.
Je ne donnerai pas tous les noms de peur d'en oublier et de les frustrer. Vous reconnaîtrez vos lignes, astuce...

Bon voici le projet, simple mais efficace, un thermostat utilisant:
-des sonde DS18S20:

-un afficheur  de chez sparkfun:

-un arduino de type uno


bon je lâche le code à l'arrache je reviendrai sur le tuto petit à petit:

Code: [Select]


#include <stdio.h> //intégration de la bibliothéque STRING

#include <OneWire.h> //intégration de la bibliothéque ONE WIRE
#define ONE_WIRE_BUS 6 //définition de la pin pour le ONE WIRE
OneWire oneWire(ONE_WIRE_BUS); //déclaration du bus ONE WIRE

#include <DallasTemperature.h> //intégration de la bibliothéque sonde de température DALLAS 18S20
DallasTemperature sensors(&oneWire); //spécification du ONE WIRE capteur de température DALLAS

#include <ColorLCDShield.h> //intégration de la bibliothéque pour l'écran LCD
LCDShield lcd; //à éclaircir, je n'ai pas regardé exactement ce que c'est

int buttonPins[3] = {  3, 4, 5}; //déclaration des boutons pour le LCD

float tempi; //variable à virgule (flottante) de la température intérieur
float tempe; //variable à virgule (flottante) de la température extérieur

int THA=10; // pin relai thermostat arudino
float VTAmax=25; // temperature max de l'ambiance
float VTAmin=15; // temperature min de l'ambiance
float VTAC=21; // variable température recherchée pour l'ambiance
float VTACO=21; // variable température de base recherchée pour l'ambiance
float HSTA=0.75; // variable Hysteresys ambiance

//configuration début
void setup(void)
{   
  lcd.init(PHILLIPS); //réglage de l'écran LCD sur la marque phillips (nokia par défaut, mais ça n'affiche pas)
  lcd.contrast(40); //réglage du taux de contraste
  lcd.clear(SLATE); //réglage de couleur de fond d'écran, "slate" oui ça existe
  pinMode(THA,OUTPUT); // réglage de pin THA sur SORTIE
  Serial.begin(9600); //démarrage du port série et réglage à 9600k
  sensors.begin(); // démarrage du bus ONE WIRE (capteur de température dans notre cas)

  for (int i=0; i<3; i++) // pour les boutons 0, 1 et 2
  {
    pinMode(buttonPins[i], INPUT); // réglage des pins sur entrées
    digitalWrite(buttonPins[i], HIGH); // réglage des pins par détection positive (+5v)
  }
}
//configuration fin

//boucle permante (PRG) début
void loop(void)
{
  sensors.requestTemperatures(); //envoie la requette au bus ONE WIRE, "donnes les température sur les sondes"
  tempi=((sensors.getTempCByIndex(0))); // stockage de la valeur de la premiére sonde
  tempe=((sensors.getTempCByIndex(1))); // stockage de la valeur de la seconde sonde

  char tempic[4]; //création d'un bloc de stockage pour une chaine de caratére
  int temp1 = (tempi - (int)tempi) * 100; //convertion du CHAR en STRING étape 1, à dévelloper j'ai pas tous compris
  sprintf(tempic," %0d.%d", (int)tempi, temp1); //convertion du CHAR en STRING étape 2, à dévelloper j'ai pas tous compris
  lcd.setStr("interieur:", 2 ,5, WHITE, SLATE); //affiche sur le LCD le mot "intérieur" ,Y,X,couleur de texte,couleur de derriére de texte
  lcd.setStr(tempic, 20 ,5, WHITE, SLATE); //affiche sur le LCD la valeur de la sonde "intérieur" ,Y,X,couleur de texte,couleur de derriére de texte
  Serial.println(tempi); //affichage sur le port série de la valeur de la sonde intérieur

  char tempec[4]; //création d'un bloc de stockage pour une chaine de caratére
  int temp2 = (tempe - (int)tempe) * 100; //convertion du CHAR en STRING étape 1, à dévelloper j'ai pas tous compris
  sprintf(tempec," %0d.%d", (int)tempe, temp2); //convertion du CHAR en STRING étape 2, à dévelloper j'ai pas tous compris
  lcd.setStr("exterieur:", 36 ,5, WHITE, SLATE); //affiche sur le LCD le mot "exterieur" ,Y,X,couleur de texte,couleur de derriére de texte
  lcd.setStr(tempec, 54 ,5, WHITE, SLATE); //affiche sur le LCD la valeur de la sonde "exterieur" ,Y,X,couleur de texte,couleur de derriére de texte

  char cons[4]; //création d'un bloc de stockage pour une chaine de caratére
  int cons1 = (VTAC - (int)VTAC) * 100; //convertion du CHAR en STRING étape 1, à dévelloper j'ai pas tous compris
  sprintf(cons," %0d.%d", (int)VTAC, cons1); //convertion du CHAR en STRING étape 2, à dévelloper j'ai pas tous compris
  lcd.setStr("consigne:", 72 ,5, WHITE, SLATE); //affiche sur le LCD le mot "consigne" ,Y,X,couleur de texte,couleur de derriére de texte
  lcd.setStr(cons, 88 ,5, WHITE, SLATE); //affiche sur le LCD la valeur de la "consigne" ,Y,X,couleur de texte,couleur de derriére de texte


  if ((!digitalRead(buttonPins[0]))&&(VTAC<VTAmax)) //si l'on appuie sur le bouton 0 et que la température consigne et inférieur au max autorisé
  {
    VTAC=VTAC+0.5; //on augmente + 0,5
  }
  if ((!digitalRead(buttonPins[1]))&&(VTAC>VTAmin)) //si l'on appuie sur le bouton 1 et que la température consigne et supérieur au mini autorisé
  {
    VTAC=VTAC-0.5; //on diminue la consigne  - 0,5
  }
  if (!digitalRead(buttonPins[2])) //si l'on appuie sur le bouton 2
  {
    VTAC=VTACO; //on remet la consigne à la valeur par défaut
  }

if ((tempi<=(VTAC-HSTA))) // si la températeure intérieur est inférieur à la consigne-le décallage autorisé
  {
    digitalWrite (THA,HIGH); //on active la sortie de chauffage
   lcd.setRect(100,100,110,110,1,BLUE); // et on affiche un carré Ydébut,Xdébut,Yfin,Xfin,couleur,remplissage oui
  }
  else if ((tempi>=VTAC)) //si la température intérieur et supérieur ou égale à la consigne
  {
    digitalWrite (THA,LOW); //on désactive la sortie de chauffage
    lcd.setRect(100,100,110,110,1,RED); // et on affiche un carré Ydébut,Xdébut,Yfin,Xfin,couleur,remplissage oui
  }

}
//boucle permante (PRG) fin




2 ans d'absence et tout à réapprendre.
Heureusement, je ne savais pas grand chose.

zoroastre

#1
Jan 30, 2012, 05:35 pm Last Edit: Jan 30, 2012, 06:05 pm by zoroastre Reason: 1
Yep!

Il manque juste dans ton programme une prévention contre les erreurs de lecture de la sonde de temperature ambiante.
Elles sont rares mais peuvent exister. Dans la librairie Dallas, l'erreur de lecture a la valeur de -127 ou s'appelle DEVICE_DISCONNECTED.

Code: [Select]
if ((tempi<=(VTAC-HSTA)) && !DEVICE_DISCONNECTED)

Pour l'activation/désactivation du chauffage, tu forces la sortie à chaque boucle du programme, le temps que le chauffage donne son effet et que l'inertie soit en équilibre. L'utilisation d'un flag améliorerait l'usage géneral et te préviendrait d'activation/désactivation malheureuse...

Code: [Select]

if ((tempi<=(VTAC-HSTA)) && !DEVICE_DISCONNECTED)
 {
   flag = 1;
   if (flag =! prev_flag) {
     digitalWrite(THA, HIGH);
     lcd.setRect(100,100,110,110,1,BLUE);
     }
 }
else if ((tempi>=VTAC))
 {
flag = 0;
if (flag =! prev_flag) {
 digitalWrite(THA, LOW);
         lcd.setRect(100,100,110,110,1,RED);
     }
 }
prev_flag = flag;  


Ainsi tu es sur que la condition est executée une seule fois.
Si la condition tempi est inférieure à la consigne, flag = 1 et comme flag est different de prev_flag, on active la sortie.
A la sortie de la condition, prev_flag = flag = 1.
A la prochaine boucle, comme flag est égale à prev_flag, la sortie n'est plus exitée. Elle reste active jusqu'à ce que flag = 0, soit à la prochaine consigne : tempi>=VTAC.

Tu gagnes en temps de cycle en plus, pas de pulse sur la sortie, affichage du carré (voyant lcd) unique. ;)

@+

Zoroastre.
Gné! ;)

Go Up