récupérateur de chaleur

Je vais essayer de répondre :

hbachetti les sonde que j'utilise sont des dht 11 j'ai lu qu'elles n’était pas très précise mais bon

je vais essayer de m'expliquer aux mieux pour ce système:

je veux que l'extracteur tourne que si la t°salon est atteinte et qu'il y a une demande de chaleur dans au mois l'une des chambres .

L'extracteur possède 2 vitesse si il y a une demande dans les trois chambres j'aurais voulu qu'il passe en deuxième vitesse .

Le problème c'est que le servo de la chambre 1 serait dépendend de la t° chambre 1 et ainsi de suite pour les autres ce que j'avais c'est que le servo que j'utilise faisait sans arret des aller et de retour je peut poster mon code que j’avais réussit a sortir en me débrouillant. je ne sais pas si j'ai assez claire dans mes explications.

pour ce qui et de la distance les deux chambres du haut ne devraient pas poser trop de problème car pour la plus éloigner des sonde je devrait avoir quelque chose comme 6 ou 7 m j'utiliserai du câble cat 5 Ethernet je pense

que sa devrais suffire. c'est ma chambre qui posera le plus de problème je pense,il faut que j'arrive a redescendre dans ma cloison,faisable mais chiant a faire et je devrais avoir a peut prés la même distance mais si

je n'y arrive pas la ça se compliquera un peut, j'aurais peut être une autre solution qui elle va avoir pour distance environ 20 m a la louche.

Il faut afficher des informations sur le moniteur série :

  • température
  • commandes servo-moteur
  • etc

je devrait avoir quelque chose comme 6 ou 7 m j'utiliserai du câble cat 5 Ethernet je pense

Je te recommande de faire des essais préalables avec un câble de cette longueur entre l'ARDUINO et la sonde.

@+

oui j'ai essayer mais je ne pense pas les mettre au bon endroit pour l'affichage du port série,le problème c'est qu'une fois en place dans le grenier je ne pour plus brancher d'ordi dessus sauf un portable qu je n'ai plus actuellement il a griller et pas envie d'en racheter un pour le moment

Je ne vois pas le rapport avec un port série ou un PC.
Je disais : essayer les câbles entre les sondes DHT11 et l'ARDUINO
Simplement vérifier que la transmission passe bien avec une longueur pareille. Normalement on ne dépasse guère un à deux mètres.

OK pas compris ce que tu vouler dire avec le port série sorry.

Bon j'ai fait un câblage vite fait avec du câble Ethernet de 8 m d long apparemment ça marche j'ai bien mon retour de t° ,j'ai réussi a le placer a coter de mon thermostat d'ambiance et j’obtiens la même t° que celui ci donc sa marche

bon je met mon code si ca interese quelq'un n'hesiter pas a me dire ou il y des erreur car il doit y en avoir beaucoup attention il n'est pas terminer:

  #include <Servo.h>
#include <Wire.h>

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // Set the LCD I2C address

Servo  ch1;                     //servo registre chambre manon
Servo  ch2;                    //servo registre  chambre luke
Servo  ch3;                   //servo registre chambre nous

int fermer = 0;            //registre fermer
int ouvert = 90;          //registre ouvert
int ch1Read();
int ch2Read();
int ch3Read();

// Décrire cette fonction
void ouverture_manon() {
  for (ouvert = 90; ouvert >= 0; ouvert += 1) { // de 0°a 90°
    ch1.write(ouvert);            // met le servo a la position ouverture
  }                      
}

// Décrire cette fonction
void fermeture_manon() {
  for (fermer = 0; fermer  <= 90; fermer -= 1) { // de 90° a 0°
ch1.write(fermer);              // met le servo en position fermeture
  }    
}

// Décrire cette fonction
void ouverture_luke() {
  for (ouvert = 90; ouvert >= 0; ouvert += 1) { // ideme
    ch2.write(ouvert);
  }
}

// Décrire cette fonction
void fermeture_luke() {
  for (fermer = 90; fermer <= 90; fermer -= 1) { // ideme 
    ch2.write(fermer);
  }
}

// Décrire cette fonction
void ouverture_nous() {
  for (ouvert = 90; ouvert >= 0; ouvert += 1) {
    ch3.write(ouvert);
  }
}

// Décrire cette fonction
void fermeture_nous() {
  for (fermer = 0; fermer <= 90; fermer -= 1) { 
    ch3.write(fermer);  
  }
}

#include <SimpleDHT.h>

// for DHT11,
//      VCC: 5V or 3V
//      GND: GND
//      DATA: 2,4,7,8
int pinDHT11salon = 2;
int pinDHT11manon = 4;
int pinDHT11luke = 7;
int pinDHT11nous = 8;

SimpleDHT11 salon ;///pin 2
SimpleDHT11 manon ;///pin 4
SimpleDHT11 luke ;///pin 7
SimpleDHT11 nous ;///pin 8

int value_salon = 0;
int value_manon = 0;
int value_luke = 0;
int value_nous = 0;

int conssalon = 23; // consigne de température pour salon
int consch = 19;// consigne de température pour manon
int consluke = 19;// consigne de température pour luke
int consnous = 19;// consigne de température pour nous





void setup() {

  pinMode(12, OUTPUT);        //relais extracteur vitesse 1
  digitalWrite(12, LOW);     //relais en position eteint
  pinMode(13, OUTPUT);      //relais extracteur vitesse 2
  digitalWrite(13, LOW);   //relais en position eteint
  Serial.begin(9600);
  Serial.print("demarrage");
  lcd.init();
  lcd.backlight();
  lcd.setCursor(1, 0);
  lcd.print("demarrage");
  delay(5000);
  lcd.clear();
}

void loop() {
  // start working...
  Serial.println("=================================");
  Serial.println("lecture des temperatures salon,Manon,Luke,nous");
  delay(500);
  {

  }

  //lecture t° salon.
  byte temperature = 0 ;
  byte humidity = 0;
  byte data[40] = {0};

  if (salon.read(pinDHT11salon, &temperature, &humidity, data)) {
    Serial.print("lecture salon erreur");
    lcd.setCursor(0, 0);
    lcd.println("sal:err         ");
    delay(1000);
    return;
  }

  Serial.println("");
  Serial.print("salon OK: ");
  Serial.print((int)temperature); Serial.print(" C, ");
  Serial.print((int)humidity); Serial.println(" %");
  lcd.setCursor(0, 0);
  lcd.print("sal:");
  lcd.print((int)temperature);
  lcd.println("C /");
  delay(1500);
  // read with raw sample data manon.
  byte temperature1 = 0 ;
  byte humidity1 = 0;
  byte data1[40] = {0};

  if (manon.read(pinDHT11manon, &temperature1, &humidity1, data1)) {
    Serial.print("lecture manon erreur");
    lcd.setCursor(0, 1);
    lcd.println("man:err          ");
    delay(2000);
    return;
  }
  Serial.println("");
  Serial.print("manon OK: ");
  Serial.print((int)temperature1); Serial.print(" C, ");
  Serial.print((int)humidity1); Serial.println(" %");
  lcd.setCursor(0, 1);
  lcd.print("Man:");
  lcd.print((int)temperature1);
  lcd.println("C /");
  delay(2500);
  // read with raw sample data luke.
  byte temperature2 = 0 ;
  byte humidity2 = 0;
  byte data2[40] = {0};

  if (luke.read(pinDHT11luke, &temperature2, &humidity2, data2)) {
    Serial.print("lecture luke erreur");
    lcd.setCursor(9, 0);
    lcd.println("luk:err      ");
    delay(3000);
    return;
  }
  Serial.println("");
  Serial.print("luke OK: ");
  Serial.print((int)temperature2); Serial.print(" C, ");
  Serial.print((int)humidity2); Serial.println(" %");
  lcd.setCursor(9, 0);
  lcd.print("Luk:");
  lcd.print((int)temperature2);
  lcd.println("C");
  delay(3500);

  // read with raw sample data nous.
  byte temperature3 = 0 ;
  byte humidity3 = 0;
  byte data3[40] = {0};

  if (nous.read(pinDHT11nous, &temperature3, &humidity3, data3)) {
    Serial.print("lecture nous erreur");
    lcd.setCursor(9, 9);
    lcd.println("nou:err");
    delay(4000);
    return;
  }
  Serial.println("");
  Serial.print("nous OK: ");
  Serial.print((int)temperature3); Serial.print(" C, ");
  Serial.print((int)humidity3); Serial.println(" %");
  lcd.setCursor(9, 9);
  lcd.print("nou:");
  lcd.print((int)temperature3);
  lcd.println("C");
  delay(4500);

  Serial.print("Sample RAW Bits: ");
  for (int i = 0; i < 40; i++) {
    Serial.print((int)data[i]);
    if (i > 0 && ((i + 1) % 4) == 0) {
      Serial.print(' ');
    }
  }
  //DHT11 sampling rate is 1HZ.

  Serial.println("");

  Serial.print("etat contacteur: ");
  Serial.print(digitalRead(13));
  delay(1000);

  Serial.println("");
  Serial.print("registre manon: ");
  Serial.print(ch1.read());
  delay(1500);

  Serial.println("");
  Serial.print("registre luke: ");
  Serial.print(ch2.read());
  delay(2000);

  Serial.println("");
  Serial.print("registre nous: ");
  Serial.print(ch3.read());
  delay(2500);


  //programme

  ch1.attach(3);
  ch2.attach(5);
  ch3.attach(6);
  int tempsalon = temperature;
  int tempmanon = temperature1;
  int templuke = temperature2;
  int tempnous = temperature3;

  if (tempsalon < conssalon - 1 &&  (tempmanon  || (templuke  || tempnous < consch - 1))) { //si la  t°salon n'a pas atteind sa consigne alors on coupe tout 
    digitalWrite(12, LOW);
    fermeture_manon;
    ch1.detach();
    fermeture_luke;
    ch2.detach();
    fermeture_nous;
    ch3.detach();
 Serial.println("");
  Serial.print("systeme arreter");
    
  }
  
  else if (tempsalon >= conssalon  &&  (tempmanon || (templuke  || tempnous < consch - 1 ))) {  // sinon si la t° salon a atteind sa consigne et que l'une des t°des chambre est plus basse que la consigne chambre

    ouverture_manon();                       // ouverture registre ch1
    ch1.detach();
    Serial.println("");
    Serial.print("registre manon: ");
    Serial.print(ch1.read());
    delay(1500);
    ouverture_luke();                       // ouverture registre ch2
    ch2.detach();  
    Serial.println("");
    Serial.print("registre luke: ");
    Serial.print(ch2.read());
    delay(2000);
    ouverture_nous();                     // ouverture registre ch3
    ch3.detach();
    Serial.println("");
    Serial.print("registre nous: ");
    Serial.print(ch3.read());
    delay(2500);
    digitalWrite(12, HIGH);              // extracteur sur vitesse 1
    
    Serial.println("");

    Serial.print("etat contacteur: ");
    Serial.print(digitalRead(13));
    delay(1000);

  }

  else if (tempsalon >= conssalon + 1 && (tempmanon  || (templuke   ||  tempnous >= consch ))) { // sinon si la t°salon a atteind ou et toujour a sa consigne mais que les chambres sont aussi a leur consigne on coupe tout
    digitalWrite(12, LOW);                  // arret extracteur
    fermeture_manon;                       // fermeture registre ch1
    ch1.detach();
    fermeture_luke;                       // fermeture registre ch2
    ch2.detach();
    fermeture_nous;                      // fermeture registre ch3
    ch3.detach();
    Serial.print("systeme arreter");
  }

}

Bon j'ai fait un câblage vite fait avec du câble Ethernet de 8 m d long apparemment ça marche j'ai bien mon retour de t° ,j'ai réussi a le placer a coter de mon thermostat d'ambiance et j'obtiens la même t° que celui ci donc sa marche

C'est cool.

Reste plus qu'à voir la partie code.
Mais pas ce soir. Je suis de sortie.

Bonne soirée.
@+

Bonne soirée aussi et merci de cet intérêt ,je viens justement de le poster

avec des ds18b20 ça fonctionne avec 9 sondes réparties sur 50m de câble

oui j'avais lu ça quelque part mais je croit que c’était sur 20 m, donc avec des dht 11 sa fonctionne donc aussi au

moins pour 8 m ,il me semble avoir lu aussi que comme les dht 11 sont numérique il y a beaucoup mois de

pertes si je me souvient bien j'ai potasser pas mal avant d'acheter mais bon personne n'est parfait.

l'intéret des ds18b20, c'est que toutes les sondes ont une adresse unique, du coup tu peux toutes les mettre en // sur le même câble.

Dans ton code je ne comprends pas l'intéret des boucles for dans les fonctions pour faire bouger les servos ? Pourquoi ne pas écrire directement la valeur 0 ou 90 selon qu'il faut ouvrir ou fermer ?

et bien c'est des morceau de code que j'ai récupérer par ci par la donc il faut surement changer des choses comme je l'ai dit je débute et pour ce langage c'est un peut du chinois sans arrières penser bien entendus.Il me semble avoir essayer est ça ne marcher pas.Mais je vais retester de suite.

Dans ton code je ne comprends pas l'intéret des boucles for dans les fonctions pour faire bouger les servos ? Pourquoi ne pas écrire directement la valeur 0 ou 90 selon qu'il faut ouvrir ou fermer ?

+1

  lcd.init();
  // si tu utilises https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library

  // plutôt ceci :

  lcd.begin();
  if (manon.read(pinDHT11manon, &temperature1, &humidity1, data1)) {
  if (luke.read(pinDHT11luke, &temperature2, &humidity2, data2)) {
  if (nous.read(pinDHT11nous, &temperature3, &humidity3, data3)) {

  // les paramètre data1, data2, data3 sont inutiles
  // si tu ne les utilises pas, plutôt ceci :

  if (manon.read(pinDHT11manon, &temperature1, &humidity1, NULL)) {
  if (luke.read(pinDHT11luke, &temperature2, &humidity2, NULL)) {
  if (nous.read(pinDHT11nous, &temperature3, &humidity3, NULL)) {
  if (tempsalon < conssalon - 1 &&  (tempmanon  || (templuke  || tempnous < consch - 1))) { 
  else if (tempsalon >= conssalon  &&  (tempmanon || (templuke  || tempnous < consch - 1 ))) {
  else if (tempsalon >= conssalon + 1 && (tempmanon  || (templuke   ||  tempnous >= consch ))) {

  // tu utilises de opérateurs logiques entre des valeurs
    fermeture_manon;    // manque ()
    ch1.detach();
    fermeture_luke;        // manque ()
    ch2.detach();
    fermeture_nous;       // manque ()
    ch3.detach();

    // idem plus bas, lignes 287 et suivantes

Plus généralement, quand la température salon est OK, tu commandes les registres de manière globale. Tu les fermes tous ou tu les ouvres tous.

@+

en fait je voudrais qu'ils s’ouvrent et se ferme indépendamment par rapport a la t° de la chambre qu'ils doivent géré

ch1 avec t° 1
ch2 avec t° 2
ch3 avec t° 3

c’est que je n'arrive pas a faire
pour les boucles for je crois que si je ne l'ai fait pas les servos ne bouge pas

je voudrais que quand la t°salon a atteins sa consigne et qu' au moins une des t° des chambres na pas

atteins sa consigne le registre de cette chambre s'ouvre et l'extracteur se met en marche puis une fois atteint l'extracteur se coupe sauf si il y a un autre registre d'ouvert puis le registre se ferme et ainsi de suite jusqu’à ce qu'il n'y a plus de registre d'ouvert alors l'extracteur se coupe.

  if (tempsalon < conssalon - 1 &&  (tempmanon  || (templuke  || tempnous < consch - 1))) {

  // si la T° salon est inférieure à la consigne basse, tester le reste est inutile
  // ceci suffit
  if (tempsalon < conssalon - 1) {

c'est que je n'arrive pas a faire

Il suffit de séparer les conditions :

  else if (tempsalon >= conssalon) { // sinon si la t° salon a atteint sa consigne
    // variable indiquant le nombre de demandes
    int demande = 0;

    if (tempmanon < consch - 1 ) {   // la t° de la chambre est plus basse que la consigne
      demande++;
      // ouverture ch1
    }
    else if (tempmanon >= consch) { // la t° de la chambre est plus haute que la consigne
      // fermeture ch1
    }
    if (templuke < consch - 1 ) {   // la t° de la chambre est plus basse que la consigne
      demande++;
      // ouverture ch2
    }
    else if (templuke >= consch) { // la t° de la chambre est plus haute que la consigne
      // fermeture ch2
    }
    if (tempnous < consch - 1 ) {   // la t° de la chambre est plus basse que la consigne
      demande++;
      // ouverture ch3
    }
    else if (tempnous >= consch) { // la t° de la chambre est plus haute que la consigne
      // fermeture ch3
    }
    switch (demande) {
      case 0:
        digitalWrite(12, LOW);                  // arret extracteur
        digitalWrite(13, LOW);                  // arret extracteur
        break;
      case 1:
        digitalWrite(12, HIGH);                  // vitesse 1
        digitalWrite(13, LOW);
        break;
      default:
        digitalWrite(12, LOW);
        digitalWrite(13, HIGH);                  // vitesse 2
        break;
    }
  }

C'est vraiment utile tous ces ch.detach() ?
Libérer les pins servos ne sert pas à grand chose non ?

J'ai l'impression que l'extracteur en vitesse 2 (pin 13) n'est pas utilisé

L'extracteur possède 2 vitesse si il y a une demande dans les trois chambres j'aurais voulu qu'il passe en deuxième vitesse .

Pourquoi le faire tourner en vitesse 1 s'il n'y a pas de demande ?
Tu pourrais par exemple le faire tourner en vitesse 2 s'il y a de la demande pour plus d'une chambre, vitesse 1 sinon.
Comme dans le code ci-dessus :

  • utilisation d'une variable demande
  • demande incrémentée pour chaque chambre dont la température est trop basse
  • si demande == 1 : vitesse 1
  • si demande > 1 : vitesse 2

@+

je penser que detach server a ne pas envoyer l’information tous le temps au servo si si c'est pas utile je les virerai

pour le pine13 effectivement pour l'instant il n'est pas utiliser d'accord avec toi pour la deuxieme vitesse

if (tempmanon < consch - 1 ) { // la t° de la chambre est plus basse que la consigne
demande++;
// ouverture ch1

je doit changer quelque chose ou apporter quelque choses ?