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.
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.
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.
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.
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