[RÉSOLU] Contrôle d'Humidité Débutant (lcd I2C 1602, Dht11 et relais)

Bonjour très chère communauté de progammateur, j'essaie de réaliser mon premier projet Arduino Contrôle d'humidité avec sonde déporté et relais (1 canal) mais sans vous impossible d'avancé j'ai vraiment besoin de vos conseils.

Étant débutant le code et schéma du projet ont été repris sur le net, j'ai juste modifier les valeurs d'humidité pour activer le relais et ajouté sur la ligne 64 un (if) pour dire else if (h <= 85) sinon si hum. supérieur à 85% d'humidité, relais Low (éteint) avec des (c) Celsius au lieu des (f) Fahrenheit présent.

Première tentative de compilation tout est ok donc montage et là bien-sûr :slight_smile: surprise, l'ecran affiche des carrés blanc (voir photo) apres recherches sur le net je constate que l'adresse du module I2C n'est pas 0x30 mais 0x27, modif. du sketch j'obtient enfin l'affichages de température et humidité

mais qui se coupe et se rallume chaque secondes, le relais s'active bien à partir de 65% d'humidité mais ne s'arrête pas à 85% comme souhaité.

Comment faire pour avoir une affichage stable ?
Comment modifié le sketch pour arrêter le relais à 85% d'humidité ?

Voici le code et des images, Vous remerciant d'avance pour le passage, la lecture et éventuellement un petit coup de main, Merci.

1 #include <DHT.h> // inclure les librairies
2 #include <Wire.h>
3 #include <LCD.h>
4 #include <LiquidCrystal_I2C.h>
5
6 const int relayPin = 8;
7 const int DHTPIN = A0;
8
9 // Type de capteur utiliser
10 #define DHTTYPE DHT11   // DHT 11
11
12
13 DHT dht(DHTPIN, DHTTYPE);// Initialise le capteur DHT11
14 LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Initialise le module 1602 I2C
15
16  void setup() {
17  Serial.begin(9600);
18  pinMode(relayPin, OUTPUT);
19  dht.begin();
20 }
21
22 void loop()
23 {
24   // Définit l'écran LCD 16 colonnes par 2 lignes
25   lcd.begin (16, 2);
26   // Réglage du rétroéclairage
27   lcd.setBacklight(HIGH);
28   
29  // Lecture de température et de l'humiditer environ 250 millisecondes
30  // La durer des capteurs peuvent etre regler jusqu'a 2 secondes (capteur tres lent)
31  float h = dht.readHumidity();
32  // Lit la temperature en degres Celsius (valeur par defaut
33  float t = dht.readTemperature();
34  float c = dht.readTemperature(true);
35
36  // Vérifie si toutes les lectures ont échoué et quitte le début (pour réessayer).
37  if (isnan(h) || isnan(t) || isnan(c)) {
38    Serial.println("Failed to read from DHT sensor!");
39    return;
40  }
41  
42  lcd.setCursor(0, 0);
43  lcd.print("Temp = ");
44  lcd.print(t);
45  lcd.print(" *C ");
46  lcd.setCursor(0, 1);
47  lcd.print(" Hum = ");
48  lcd.print(h);
49  lcd.print(" % ");
50 
51  Serial.print("Temperature = ");
52  Serial.print(t);
53  Serial.print(" *C ");
54  Serial.print("Temperature = ");
55  Serial.print(f);
56  Serial.print(" *C ");
57  Serial.print("Humidity = ");
58  Serial.print(h);
59  Serial.print(" %\t ");
60  Serial.println();
61  if (h >= 65) { // on peut changer la valeur de l’humiditer ici inferieur ou = a 65 relais ouvert 
62    digitalWrite(relayPin, HIGH);
63  }
64  else if (h <= 85) { // sinon si humiditer superieur a 85 relais fermer
65    digitalWrite(relayPin, LOW);
66  }
67 else 
68 {
69 digitalWrite(relayPin, LOW); // Sinon relais fermé
70  }
71  delay(1000);// Delai d’une seconde entre les mesures
72 }

bonjour,
les begin se mettent dans le setup, sinon tu initialise à chaque loop le lcd

  // Définit l'écran LCD 16 colonnes par 2 lignes
 lcd.begin (16, 2);
  // Réglage du rétroéclairage
   lcd.setBacklight(HIGH);

le relais s'active bien à partir de 65% d'humidité mais ne s'arrête pas à 85% comme souhaité.

relis bien ce que tu as codé

 if (h >= 65) { // on peut changer la valeur de l'humiditer ici inferieur ou = a 65 relais ouvert
   digitalWrite(relayPin, HIGH);
 }
  else if (h <= 85) { // sinon si humiditer superieur a 85 relais fermer
    digitalWrite(relayPin, LOW);
  }

ta condition >=65 est toujours valide donc pas de off au dessus de 65

ca ne serait pas mieux de dire
si h=>65 ET h<=85 ===> relais on
else relais off

Merci Infobarquee, donc pour la première réponse j'ai pas bien capté pardonne moi pour mon amateurisme voici ce que j'ai compris

20 }    ←  ouverture
21
22 void loop()
23 
24   // Définit l'écran LCD 16 colonnes par 2 lignes
25   lcd.begin (16, 2);
26   // Réglage du rétroéclairage
27   lcd.setBacklight(HIGH);
28 {   ←  fermeture (les beging dans le setup)

Pour la 2ème réponses c'est tout bon Merci infiniment je modifie de suite super sympa, pour l'adresse du module I2C apparemment c'est 0x20 par defaut à 0x27,

maintenant je ne sais pas si le fait que l'ecran s'éteint et s'allume est dû à l'erreur d'ouverture et fermeture des beging dans le setup, je vais testé et modifié tout ça, Merci encore pour vos éclairages.

t'as pas compris pour les begin

 void setup() {
Serial.begin(9600);
  pinMode(relayPin, OUTPUT);
  dht.begin();
  // Définit l'écran LCD 16 colonnes par 2 lignes
   lcd.begin (16, 2);
   // Réglage du rétroéclairage
   lcd.setBacklight(HIGH);
 }

    void loop()
 {
reste du code

Tu est un Génie Infobarquee, sans toi je serais foutus, merci de tout mon coeur, grâce à toi je m'en sort, je modifie tout ça et passe à l'action

16  void setup() {
17  Serial.begin(9600);
18  pinMode(relayPin, OUTPUT);
19  dht.begin();
20  // Définit l'écran LCD 16 colonnes par 2 lignes
21  lcd.begin (16, 2);
22  // Réglage du rétroéclairage
28  lcd.setBacklight(HIGH); 
29  }
30   void loop()
31  {
32  // Lecture de température et de l'humiditer environ 250 millisecondes
33  // La durer des capteurs peuvent etre regler jusqu'a 2 secondes (capteur tres lent)
34  float h = dht.readHumidity();
35  // Lit la temperature en degres Celsius (valeur par defaut
36  float t = dht.readTemperature();
37  float c = dht.readTemperature(true);

et le changementsi (h=>65 ET h<=85 ===> relais on
else relais of) et c'est tout bon, Franchement je ne sais pas comment te remercier, Que tout le bonheur soit avec toi Infobarquee.

Re, après tous les modifications malheureusement ça marche pas, j'ai tout essayé même change le Nano avec le Uno mais non, pourtant j'étais pas loin :slight_smile:
mais là je suis épuisé vraiment :confused:

l'écran s'allume et s'éteint tous les 2 secondes, quand l'humidité descend en dessous de 75% le relais s'enclenche puis s'arrête vers 80% mais s'enclenche à nouveau vers 85% et s'arrête vers 80? ...

pour l'affichage j'ai modifié l'adresse I2c vers x20 (des carrés blancs) idem pour x30F il y à juste le 0x27 qui fonctionne mais avec intermittences, je ne sais pas si c'est l'ecran qui à un problème,

bref quelle galère, on baisse pas les bras, au pire j'essayerais de trouvé un autre sketch je partage ce code final pour ceux éventuellement qui seront l'utilisé en le modifiant, en tout cas Merci vraiment Infobarquee pour le soutien et l'aide apportée, très bon week-end.

1 #include <DHT.h> // inclure les librairies
2 #include <Wire.h>
3 #include <LCD.h>
4 #include <LiquidCrystal_I2C.h>
5
6 const int relayPin = 8;
7 const int DHTPIN = A0;
8
9 // Type de capteur utiliser
10 #define DHTTYPE DHT11   // DHT 11
11
12
13 DHT dht(DHTPIN, DHTTYPE);// Initialise le capteur DHT11
14 LiquidCrystal_I2C lcd(0x20, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Initialise le module 1602 I2C
15
16  void setup() {
17  Serial.begin(9600);
18  pinMode(relayPin, OUTPUT);
19  dht.begin();
20  // Définit l'écran LCD 16 colonnes par 2 lignes
21  lcd.begin (16, 2);
22  // Réglage du rétroéclairage
28  lcd.setBacklight(HIGH); 
29  }
30   void loop()
31  {
32  // Lecture de température et de l'humiditer environ 250 millisecondes
33  // La durer des capteurs peuvent etre regler jusqu'a 2 secondes (capteur tres lent)
34  float h = dht.readHumidity();
35  // Lit la temperature en degres Celsius (valeur par defaut
36  float t = dht.readTemperature();
37  float c = dht.readTemperature(true);
38
39  // Vérifie si toutes les lectures ont échoué et quitte le début (pour réessayer).
40  if (isnan(h) || isnan(t) || isnan(c)) {
41    Serial.println("Failed to read from DHT sensor!");
42    return;
43  }
44  
45  lcd.setCursor(0, 0);
46  lcd.print("Temp = ");
47  lcd.print(t);
48  lcd.print(" *C ");
49  lcd.setCursor(0, 1);
50  lcd.print(" Hum = ");
51  lcd.print(h);
52  lcd.print(" % ");
53 
54  Serial.print("Temperature = ");
55  Serial.print(t);
56  Serial.print(" *C ");
57  Serial.print("Temperature = ");
58  Serial.print(f);
59  Serial.print(" *C ");
60  Serial.print("Humidity = ");
61  Serial.print(h);
62  Serial.print(" %\t ");
63  Serial.println();
64
65  if (h => 75 && h <= 80) // si hum. est = ou sup. a 75 ET hum infer. ou = a 80 relais ouvert             
66  {
67    digitalWrite(relayPin, HIGH);
68  }
69 else 
70 {
71 digitalWrite(relayPin, LOW); // Sinon relais fermé
72  }
73  delay(1000);// Delai d’une seconde entre les mesures
74 }

je propose de placer 2 boucles if imbriqués

if >= 70
if <= 80
digitalWrite
else
digitalWrite
end

pour l'affichage j'ai modifié l'adresse I2c vers x20 (des carrés blancs) idem pour x30F il y à juste le 0x27 qui fonctionne mais avec intermittences, je ne sais pas si c'est l'ecran qui à un problème,

alors pourquoi mettre 0X20 dansz le code.
un I2C a une et une seule adresse, pas 36

je suis pratiquement certain que si tu remplace le relais par une led (avec une résistance, ou mettre sur la pin 13), ca va fonctionner sans soucis.

fais une photo de ton montage et donne les lien du relais lcd, etc...

esloch:
je propose de placer 2 boucles if imbriqués

if >= 70
if <= 80
digitalWrite
else
digitalWrite
end

Bonjour Esloch merci pour l'astuce, je vais essayé voir ce que ça donne, cordialement.

pourquoi se compliquer la vie avec 2 if alors qu'avec 1 seul ca suffit.

c'est le relais qui pompe le jus du lcd, pas autre chose.
donc photo du montage comme demandé

infobarquee:
pourquoi se compliquer la vie avec 2 if alors qu'avec 1 seul ca suffit.

...

c'est juste une idée ... :frowning:

infobarquee:
...

je suis pratiquement certain que si tu remplace le relais par une led (avec une résistance, ou mettre sur la pin 13), ca va fonctionner sans soucis.

...

bonne idée ... :slight_smile:

testé, compile, fonctionne
const int relayPin = 13; // PIN 13 pour test sur une LED de la carte

#include <DHT.h> // inclure les librairies
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

const int relayPin = 13; // PIN 13 pour test sur une LED de la carte
const int DHTPIN = A0;

// Type de capteur utiliser
#define DHTTYPE DHT11   // DHT 11


DHT dht(DHTPIN, DHTTYPE);// Initialise le capteur DHT11
LiquidCrystal_I2C lcd(0x27, 16,2); // Initialise le module 1602 I2C

void setup() {
  Serial.begin(9600);
  pinMode(relayPin, OUTPUT);
  dht.begin();
  // Définit l'écran LCD 16 colonnes par 2 lignes
  lcd.init();
  // Réglage du rétroéclairage
  lcd.setBacklight(HIGH);
}
void loop()
{
  // Lecture de température et de l'humiditer environ 250 millisecondes
  // La durer des capteurs peuvent etre regler jusqu'a 2 secondes (capteur tres lent)
  float h = dht.readHumidity();
  // Lit la temperature en degres Celsius (valeur par defaut
  float t = dht.readTemperature();
  float c = dht.readTemperature(true);

  // Vérifie si toutes les lectures ont échoué et quitte le début (pour réessayer).
  if (isnan(h) || isnan(t) || isnan(c)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }

  lcd.setCursor(0, 0);
  lcd.print("Temp = ");
  lcd.print(t);
  lcd.print(" *C ");
  lcd.setCursor(0, 1);
  lcd.print(" Hum = ");
  lcd.print(h);
  lcd.print(" % ");

  Serial.print("Temperature = ");
  Serial.print(t);
  Serial.print(" *C ");
 
  Serial.print("Humidity = ");
  Serial.print(h);
  Serial.print(" %\t ");
  Serial.println();

  if (h >= 75 && h <= 80) // si hum. est = ou sup. a 75 ET hum infer. ou = a 80 relais ouvert
  {
    digitalWrite(relayPin, HIGH);
  }
  else
  {
    digitalWrite(relayPin, LOW); // Sinon relais fermé
  }
  delay(1000);// Delai d'une seconde entre les mesures
}

Merci Infobarquee désolé de te prendre la tête avec mes aventures, la référence de l'écran est PCF8574T, il n'y à que l'adresse 0x27 qui fonctionne les 2 autres (0.3F d'origine du code et 0x20) ne fonctione pas ou affiche des carrés blancs

Je ne serais pas comment faire un essai avec le led pin 13, mais je vais essayé de trouvé, sinon pour l'ecran il y à un super blog à ce sujet, j'envois les photos et vais envoyé les liens de l'ecran et du relais

Je suis vraiment désolé, je ne savais pas que cela serait un bras de fer infernal :frowning: pardonne moi Infobarquee, Merci pour tout grand Respect.

infobarquee:
testé, compile, fonctionne
const int relayPin = 13; // PIN 13 pour test sur une LED de la carte

#include <DHT.h> // inclure les librairies

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

const int relayPin = 13; // PIN 13 pour test sur une LED de la carte
const int DHTPIN = A0;

// Type de capteur utiliser
#define DHTTYPE DHT11  // DHT 11

DHT dht(DHTPIN, DHTTYPE);// Initialise le capteur DHT11
LiquidCrystal_I2C lcd(0x27, 16,2); // Initialise le module 1602 I2C

void setup() {
  Serial.begin(9600);
  pinMode(relayPin, OUTPUT);
  dht.begin();
  // Définit l'écran LCD 16 colonnes par 2 lignes
  lcd.init();
  // Réglage du rétroéclairage
  lcd.setBacklight(HIGH);
}
void loop()
{
  // Lecture de température et de l'humiditer environ 250 millisecondes
  // La durer des capteurs peuvent etre regler jusqu'a 2 secondes (capteur tres lent)
  float h = dht.readHumidity();
  // Lit la temperature en degres Celsius (valeur par defaut
  float t = dht.readTemperature();
  float c = dht.readTemperature(true);

// Vérifie si toutes les lectures ont échoué et quitte le début (pour réessayer).
  if (isnan(h) || isnan(t) || isnan(c)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }

lcd.setCursor(0, 0);
  lcd.print("Temp = ");
  lcd.print(t);
  lcd.print(" *C ");
  lcd.setCursor(0, 1);
  lcd.print(" Hum = ");
  lcd.print(h);
  lcd.print(" % ");

Serial.print("Temperature = ");
  Serial.print(t);
  Serial.print(" *C ");

Serial.print("Humidity = ");
  Serial.print(h);
  Serial.print(" %\t ");
  Serial.println();

if (h >= 75 && h <= 80) // si hum. est = ou sup. a 75 ET hum infer. ou = a 80 relais ouvert
  {
    digitalWrite(relayPin, HIGH);
  }
  else
  {
    digitalWrite(relayPin, LOW); // Sinon relais fermé
  }
  delay(1000);// Delai d'une seconde entre les mesures
}

Merci j'attaque de suite...

Supeeeerrrr merci Infobarquee l'ecran fonctionne tu est trop fort !!!

un peu le bordel tes fils sur les photos.
pourquoi le lcd n'est pas sur A4-A5?

puissance de l'alim?

infobarquee:
un peu le bordel tes fils sur les photos.
pourquoi le lcd n'est pas sur A4-A5?

puissance de l'alim?

J'ai suivie le schéma du code qui relie Scl et Sda avec ceux de la Uno je vais modifié sur le A4 A5 merci pour le guidage, l'alim est un 9V 1A.

La dernière adresse d'I2C que tu ma envoyé fonctionne à merveille, je vais modifié tout ça
Tu est un grand homme très aimable Infobarquee Merci pour ta patience.

la référence de l'écran est PCF8574T,

Evite d'écrire des grosses bêtises .
Ce que tu lis sur un boîtier n'est que la référence du circuit intégré qui est dans le boîtier, absolument pas celles des autres composants.
le PCF8574 est un "Remote 8-bit I/O expander for I2C-bus with interrupt"

Ce n'est pas particulier à ce module c'est général.
S'il doit y avoir une référence elle est marquée sur le circuit imprimé.

Le PCF8574T est un circuit intégré qui permet de gérer 8 sorties par le bus I2C.
Sa datasheet peut s'obtenir par le lien :

Au passage l'adresse du PCF8574T est écrit noir sur blanc dans la datasheet.
Dès que tu as des doutes ou que tu lis des informations contradictoires --> consulter la datasheet du produit.

Bonjour, vraiment désolé pour l'erreur 68tjs, comme le module est directement soudé j'ai pas capté le système sur le coup, Merci pour la correction et l'explication, Trop fort.

J'ai reçu du lait de fermier, actuellement en mode fabrication de fromage j'ai même pas le temps de touché 1 pin, Fini ce soir et demain j'attaque l'Arduino,

Merci à Infobarquee et toute l'équipe pour votre soutien, Grand Respect, Cordialement.

Bonjour je voulais partagé les résultats, après avoir essayé le led pin 13 et les Pin A4 et A5 j'ai toujours un affichage assez bizarre des valeurs sur le moniteur de l' écran mais sinon ça marche très bien.

Quand je souffle sur le capteur Dht11 les valeurs bougent mais reste néanmoins incompréhensible (voir photos)

Sur l'écran il est indiqué (T2.00) qui veut sûrement dire température 2.? et (4.00) qui veut peut être dire humidité 40? et quelques choses.

J'ai ajouté un hysteresie (info récolté sur le forum) en utilisant float hystérie et 2 x le if mais pas possible de reussire, voici le dernier code utilisé. Je suis deg. :confused:

#include <DHT.h> // inclure les librairies
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

const int relayPin = 8; // PIN 8 pour le relais
const int DHTPIN = A0; // PIN A0 pour le capteur

// Type de capteur utiliser
#define DHTTYPE DHT11   // DHT 11


DHT dht(DHTPIN, DHTTYPE);// Initialise le capteur DHT11
LiquidCrystal_I2C lcd(0x27, 16,2); // Initialise le module 1602 I2C

void setup() {
  Serial.begin(9600);
  pinMode(relayPin, OUTPUT);
  dht.begin();
  // Définit l'écran LCD 16 colonnes par 2 lignes
  lcd.init();
  // Réglage du rétroéclairage
  lcd.setBacklight(HIGH);
}
void loop()
{
  // Lecture de température et de l'humiditer environ 250 millisecondes
  // La durer des capteurs peuvent etre regler jusqu'a 2 secondes (capteur tres lent)
  float h = dht.readHumidity();
  // Lit la temperature en degres Celsius (valeur par defaut)
  float t = dht.readTemperature();
  float c = dht.readTemperature(true);
  float hys=2; // Réglage hystérie

  // Vérifie si toutes les lectures ont échoué et quitte le début (pour réessayer).
  if (isnan(h) || isnan(t) || isnan(c)) 
{
    Serial.println("Failed to read from DHT sensor!");
    return;
  }

  lcd.setCursor(0, 0);
  lcd.print("Temp = ");
  lcd.print(t);
  lcd.print(" *C ");
  lcd.setCursor(0, 1);
  lcd.print(" Hum = ");
  lcd.print(h);
  lcd.print(" % ");

  Serial.print("Temperature = ");
  Serial.print(t);
  Serial.print(" *C ");
 
  Serial.print("Humidity = ");
  Serial.print(h);
  Serial.print(" %\t ");
  Serial.println();

  if (h <75-hys);  // Si humidité inferieur a 75 - (moin) hys. 
  {
    digitalWrite(relayPin, HIGH);  // relais ouvert
  }
  if (h >80+hys); // Si humidité supérieure a 80 + hys. 
  {
    digitalWrite(relayPin, LOW); // relais fermé
  }
  delay(1000); // Delai d'une seconde entre les mesures
}

Merci de me pointé, j'suis vraiment épuisé, cordialement.

2017-10-17 23.02.20.jpg