[RÉSOLU] Mega Projet Contrôleur de Température et d'Humidité

Merci pour vos interventions tres instructif J-M-L,
finalement il faut que je finisse ce projet, j'ai donc dessiner le shemas sur Fritzing et voulais le partager, maintenant il faut passer a l'action. :sweat_smile:

J'ai modifié et commenté le sketch car il y à des morceaux que je ne comprend pas, remplacé les pin 8 et 9 du module relais par les pin 18 et 19.

Ce qui m'embête aussi c'est que je n'ai pas de rétroéclairage lcd, il s'allume et s'éteint 1 seconde après appuis sur Reset ?

Voici le plan du montage et le code modifier

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

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7);  // 0.27 est l’adresse du bus I2C

const int humidityRelay = 18; // PIN 18 pour (Humidificateur)  ← * Const. déclaré” 1 x ici *
const int heaterRelay = 19; // PIN 19 pour (Température)        ←*Remplacement des num pin*


const int DHTPIN = 2;  // PIN 2 pour le capteur 

// Démarrage des valeurs après le démarrage, on peut les changer

int temp = 12;  // Température souhaitée
int hum = 80;  // Humidité souhaitée
int readkey;
long int lastmillis;
long int hours;
long int minutes;
long int seconds;

char l2c1;
char l2c2;
char l2c3;


DHT dht (DHTPIN, DHT22);  //  Type de capteur DHT22 (AM2023)


const int humidityRelay = 18;   //   ← * Je re declare les Const. est ce utile 2x *
const int heaterRelay = 19;      //   ← * Ou je supprime, celui-ci ou celui au dessus ? *



DFR_Key keypad(0);  // Utilise 0 pour le tableau DFRobot et 1 pour le tableau Cytron (?)

int localKey = 0;
String keyString = "";
int lcd_key = 0;
int adc_key_in = 0;

// Utilisation de (const) au lieu de (#define)
const byte btnRIGHT = 0;  
const byte btnUP = 1;     
const byte btnDOWN = 2;   
const byte btnLEFT = 3;   
const byte btnSELECT = 4; 
const byte btnNONE = 5;   

int read_LCD_buttons() {
  adc_key_in = analogRead(0);
  if (adc_key_in > 1000) return btnNONE;
  if (adc_key_in < 50)   return btnRIGHT;
  if (adc_key_in < 150)  return btnUP;
  if (adc_key_in < 300)  return btnDOWN;
  if (adc_key_in < 460)  return btnLEFT;
  if (adc_key_in < 690)  return btnSELECT;
}

void setup() 

{
  pinMode(humidityRelay, OUTPUT);
  pinMode(heaterRelay, OUTPUT);
  lcd.begin(16, 2);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Keith control");
  lcd.setCursor(0, 1);
  lcd.print("Select instr");
  delay(2500);
  Serial.begin(9600);
  dht.begin();
  delay(1000);
  lcd.clear();

  // Taux d'échantillonnage (par défaut 10ms)
  keypad.setRate(10);
  digitalWrite(humidityRelay, HIGH);  // Relais Humidité actif
  digitalWrite(heaterRelay, HIGH);  // Relais Température actif

}

void loop() 

{
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  if (isnan(t) || isnan(h))
{   // contrôle du fonctionnement du capteur
                             
    lcd.begin(16, 2);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Capteur N/C!!");
    delay(10000);
  } 
else 
 {
    lcd_key = read_LCD_buttons();  // Affichage d’utilisation des boutons pour les réglages
    switch (lcd_key) {
      case btnLEFT:
        {
          temp = temp + 1;  // Bouton LEFT augmente la température de +1 par appuie
          break;
        }
      case btnRIGHT:
        {
          temp = temp - 1;  // Bouton RIGHT diminue la température de -1 par appuie
          break;
        }
      case btnUP:
        {
          hum = hum + 1;  // Bouton UP augmente l’humidité de +1 par appuie
          break;
        }
      case btnDOWN:
        {
          hum = hum - 1;  // Bouton DOWN diminue l’humidité de -1 par appuie
          break;
        }
      case btnSELECT:   // Bouton SELECT pour la sélection
        {
          lcd.begin(16, 2);
          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print("Hum Up/Down +-1%");
          lcd.setCursor(0, 1);
          lcd.print("Temp L/R +-1");
          lcd.print((char)223);
          lcd.print("C");
          delay (5000);
          break;
        }
    } 
    lcd.setCursor(0, 0);     
    lcd.print("Hum: ");
    lcd.print(h);
    lcd.print("%");
    lcd.print("(");
    lcd.print(hum);
    lcd.print("%)");
    lcd.setCursor(0, 1);
    lcd.print("Tem: ");
    lcd.print(t);
    lcd.print((char)223);
    lcd.print("(");
    lcd.print(temp);
    lcd.print((char)223);
    lcd.print(")");

    // Je ne comprend pas trop la méthode à utilisé ici pour avoir le relais humidité qui s’active vers 75% et s’arrête vers + / - 85% et le relais température qui s’active vers 14℃ et s’arrête vers 12℃ ou 10℃ grand max ?
   
    
    int H = 75 + 10;  // Pour éviter les démarrages fréquents H = 75 + 10% 
   
    if (h < 85) digitalWrite(humidityRelay, LOW);  // Si humidité inférieur à 85 Relais1 Fermé
    else if (h >= H) digitalWrite(humidityRelay, HIGH);  // Sinon si humidité supérieure a 
H =75+10 relais1 ouvert
   
    int T = 12 + 2 ;  // Ajout Hystérésie de 2 - Température=12+2
    if (t < 12 )
      digitalWrite(heaterRelay, LOW);  // Si température intérieure a 12 Relais2 Fermé
    else if (t >= T)
      digitalWrite(heaterRelay, HIGH);  // Sinon si température supérieur a T Relais2 Ouvert
  }

}

Merci encore pour les conseils, cordialement.

Bonjour,

Y à t il une âme charitable qui pourrait contrôlé le code et me confirmé les changements à effectué ?

ça fonctionne chez vous ça?

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7);  // 0.27 est l'adresse du bus I2C

chez moi je fais plutôt

const byte nbColumns = 20;
const byte nbLines   = 4;

LiquidCrystal_I2C lcd( 0x3F, nbColumns, nbLines); // my LCD is at I2C address 0x3F, 20 cols, 4 rows

si le LCD est connecté en I2C

const int humidityRelay = 18; // PIN 18 pour (Humidificateur)  ← * Const. déclaré" 1 x ici *
const int heaterRelay = 19; // PIN 19 pour (Température)        ←*Remplacement des num pin*
const int DHTPIN = 2;  // PIN 2 pour le capteur

--> mettre des const byte

Trop fort J-M-L merci de venir aux secours,

Donc au lieu d'utiliser cette déclaration :
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7);  // 0.27 est l'adresse du bus I2C

J'inscris comme ceci :

const byte nbColumns = 20;
const byte nbLines   = 4;

LiquidCrystal_I2C lcd( 0x3F, nbColumns, nbLines); // my LCD is at I2C address 0x3F, 20 cols, 4 rows

Et comme le LCD est connecté en I2c je mets des const byte au lieu des const int:

const byte humidityRelay = 18; 
const byte heaterRelay = 19; 
const byte DHTPIN = 2;

Je vais faire les changements, très grand Merci J-M-L sans vous impossible d'avancé, Merci encore.

Bonsoir, voici toutes les modifications apportées selon vos instructions, beaucoup de notes pour ma compréhension,
je vais travailler sur le delais de 5000 et les réglages de température et d'humidité pour avoir ce que je souhaite, Merci pour tout de A à Z, merci pour votre compréhension et votre patience, Cordialement.

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


const byte humidityRelay = 18; 
const byte heaterRelay = 19;     // Modifier les (const int) en (const byte)
const byte DHTPIN = 2;  
const byte nbColumns = 20;
const byte nbLines   = 4;             //  Ici utilisé votre méthode mon adresse est 0,27 je laisse ainsi ?

LiquidCrystal_I2C lcd( 0x27, nbColumns, nbLines); 



// Démarrage des valeurs après le démarrage, on doit pouvoir les changées

int temp = 12;  
int hum = 80;  
int readkey;
long int lastmillis;   // ici je n'ai malheureusement pas compris avec Unsigned long ? 
long int hours;
long int minutes;   // je n'ai pas d'heures affiché sur le Lcd ? 
long int seconds;

char l2c1;
char l2c2;
char l2c3;


DHT dht (DHTPIN, DHT22);  //  Type de capteur DHT22 (AM2023)

const byte humidityRelay = 18;   //   ← * J'ai changé les int en byte,  mais c'est déjà fait au dessus
const byte heaterRelay = 19;      //   ← * je laisse les 2 (const byte) Ou je supprime ?

DFR_Key keypad(0);  // Utilise 0 pour le tableau DFRobot et 1 pour le tableau Cytron (?)

                                 // String keyString = "";  (Ne sert à rien le viré), c'est ok supprimé.
int localKey = 0;  
int lcd_key = 0;
int adc_key_in = 0;

// Utilisation de (const) au lieu de (#define)
const byte btnRIGHT = 0;  
const byte btnUP = 1;     
const byte btnDOWN = 2;   
const byte btnLEFT = 3;   
const byte btnSELECT = 4; 
const byte btnNONE = 5;   

int read_LCD_buttons() 
{
  adc_key_in = analogRead(0);
  if (adc_key_in > 1000) return btnNONE;
  if (adc_key_in < 50)   return btnRIGHT;
  if (adc_key_in < 150)  return btnUP;
  if (adc_key_in < 300)  return btnDOWN;
  if (adc_key_in < 460)  return btnLEFT;
  if (adc_key_in < 690)  return btnSELECT;
}

void setup() 

{
  pinMode(humidityRelay, OUTPUT);
  pinMode(heaterRelay, OUTPUT);
  lcd.begin(16, 2);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(F("Keith control"));  //  utilisé le macro F () dans tous les Print () du Lcd ou de Serial
  lcd.setCursor(0, 1);
  lcd.print(F("Select instr"));  // utilisé le macro F () 
  delay(2500);
  Serial.begin(F(115200));   // Mettre le port série sur 115200 au lieu de 9600 + macro F ()
  dht.begin();
  delay(1000);
  lcd.clear();

  // Taux d'échantillonnage (par défaut 10ms)
  keypad.setRate(10);
  digitalWrite(humidityRelay, HIGH);  // Relais Humidité actif
  digitalWrite(heaterRelay, HIGH);  // Relais Température actif

}

void loop() 

{
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  if (isnan(t) || isnan(h))
{  
                             
                           // Ne pas répété lcd.begin(1602) dans la loop car déjà présent dans setup (effacé)
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print(F("Capteur N/C!!"));  // utilisé le macro F () 
    delay(10000);
  } 
else 
 {
    lcd_key = read_LCD_buttons();  // Affichage d'utilisation des boutons pour les réglages
    switch (lcd_key) {
      case btnLEFT:
        {
          temp = temp + 1;  // Bouton LEFT augmente la température de +1 par appuie
          break;
        }
      case btnRIGHT:
        {
          temp = temp - 1;  // Bouton RIGHT diminue la température de -1 par appuie
          break;
        }
      case btnUP:
        {
          hum = hum + 1;  // Bouton UP augmente l'humidité de +1 par appuie
          break;
        }
      case btnDOWN:
        {
          hum = hum - 1;  // Bouton DOWN diminue l'humidité de -1 par appuie
          break;
        }
      case btnSELECT:   // Bouton SELECT pour la sélection
        {
          lcd.begin(16, 2);
          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print(F("Hum Up/Down +-1%"));  // utilisé le macro F () 
          lcd.setCursor(0, 1);
          lcd.print(F("Temp L/R +-1"));   // utilisé le macro F () 
          lcd.print(F((char)223));  // ici pas sûr ?
          lcd.print(F("C"));  // utilisé le macro F () 
          delay (5000);
          break;
        }
    } 
    lcd.setCursor(0, 0);     
    lcd.print(F("Hum: "));  // utilisé le macro F () pour tous les lcd.print
    lcd.print(F(h));
    lcd.print(F("%"));
    lcd.print(F("("));
    lcd.print(F(hum));
    lcd.print(F("%)"));
    lcd.setCursor(0, 1);
    lcd.print(F("Tem: "));
    lcd.print(F(t));
    lcd.print(F((char)223));  // pas sûr de moi
    lcd.print(F("("));
    lcd.print(F(temp));
    lcd.print(F((char)223));
    lcd.print(F(")"));

    int H = 75 + 10;  // Pour éviter les démarrages fréquents H = 75 + 10% 
   
    if (h < 85) digitalWrite(humidityRelay, LOW);  // Si humidité inférieur à 85 Relais1 Fermé
    else if (h >= H) digitalWrite(humidityRelay, HIGH);  // Sinon si humidité supérieure a 
    H =75+10 relais1 ouvert
   
    int T = 12 + 2 ;  // Ajout Hystérésie de 2 - Température=12+2
    
    if (t < 12 )
      digitalWrite(heaterRelay, LOW);  // Si température intérieure a 12 Relais2 Fermé
    else if (t >= T)
      digitalWrite(heaterRelay, HIGH);  // Sinon si température supérieur a T Relais2 Ouvert
  }

}

bonsoir corrigez votre post ci dessus et mettez les code tags autour du code:
[code]`` [color=blue]// votre code ici[/color] ``[/code] au lieu des tags de [quote]

long int lastmillis;   // ici je n'ai malheureusement pas compris avec Unsigned long ?

--> utiliser le bon type de données

unsigned long lastmillis;   // avec unsigned long ?

Pour cette partie, vous avez bien un écran LCD de 4 lignes, 20 caractères par lignes, dont l'adresse I2C est 0x27?

 const byte nbColumns = 20;
const byte nbLines   = 4;             //  Ici utilisé votre méthode mon adresse est 0,27 je laisse ainsi ?

LiquidCrystal_I2C lcd( 0x27, nbColumns, nbLines);

Modifier de suite désolé, j'ai fait en sorte d'avoir le code complet afin de facilité les corrections.

int temp = 12;  
int hum = 80;  
int readkey;
long int lastmillis;   
unsigned long lastmillis;   // ajouté après (long int lastmillis)
long int hours;
long int minutes;   // (hours - minutes - seconds) pour afficher l'horaire ? 
long int seconds;

char l2c1;
char l2c2;
char l2c3;

Pour l'écran je possède un 1602 cela donnerait ? :

const byte nbColumns = 16;
const byte nbLines   = 2;

Et pour l'adresse I2C oui c'est bien 0,27 ce qui est ok :

 LiquidCrystal_I2C lcd( 0x27, nbColumns, nbLines);

Merci pour ses corrections, je modifie tout ça.

Aussi l'éclairage qui me cause un problème il n'est pas indiqué dans le code d'ailleurs j'ai pas d'éclairage, je ne sais pas si je peut rajouté ce petit morceau qui était dans le sketch que je me suis inspiré ?

void loop() 
{
 if (millis() - lastmillis > 15000) 
{
   lcd.setBacklight(HIGH);      // Backlight OFF
 }

Merci pour votre soutien J-M-L, désolé d'être un peut naze et surtout MERCI pour votre patience.

long int lastmillis;   
unsigned long lastmillis;   // ajouté après (long int lastmillis)

ben non, ne déclarez pas deux fois la même variable...

essayez de postez un code qui au moins compile...

Et pour l'adresse I2C oui c'est bien 0,27 ce qui est ok :

0,27 ça ne veut rien dire. on écrit 0x27 pour dire 27 en représentation Hexadécimale

tenez étudiez un peu ce code que j'avais fait il y a quelques temps pour quelqu'un d'autre

comme composants il faut

  • 2 DS18820 sur la pin 9 (avec une résistance de 4.7KΩ entre 5V et pin 9)
  • 1 potentiomètre branché sur A0
  • 1 bouton câblé ainsi pin 8 --> entrée bouton ---> BOUTON --> sortie bouton --> GND que l'on mettra dans le code en INPUT PULLUP
  • 1 écran LCD connecté en I2C 16x2 ou 20x4

appuyez sur le bouton, faites varier le potentiomètre ou faites chauffer ou refroidir les DS18820 et vous verrez comment ça se comporte

// Gestion des DS18820
#include <OneWire.h>
#include <DallasTemperature.h>

const byte onewireBusPin = 9;        // pin 9 pour le bus 1 wire avec une résistance de 4.7KΩ entre 5V et pin 9
OneWire  oneWire(onewireBusPin);
DallasTemperature sensors(&oneWire);

const byte nbCapteurs = 2;
DeviceAddress  DS18820Address[nbCapteurs];
float temperatures[nbCapteurs];

const int resolution = 10; // en bits --> Max 12 bit, min 9 bit (9bit prends 95ms, 10bit 187ms, 11bit 375ms et 12bit 750ms)

// on va lire la température seulement de temps en temps
unsigned long   chronoTemperatures = 0;
const unsigned long periodeLecture = 250; // 250 est OK pour une résolutoin en 10 bits. au minimum attendre  (750 / (1 << (12 - resolution)));

// Gestion du LCD
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// adresse LDC 0x27  16 caractères, 2 lignes
const byte nbColumns = 20;
const byte nbLines   = 2;
 LiquidCrystal_I2C lcd(0x27, nbColumns, nbLines);

// ou avec 4 lignes
//const byte nbColumns = 20;
//const byte nbLines   = 4;
//LiquidCrystal_I2C lcd( 0x3F, nbColumns, nbLines); // my LCD is at I2C address 0x3F, 20 cols, 4 rows

const byte symboleFlecheDroite = 126;
const byte symboleFlecheGauche = 127;
const byte symboleBlocBlanc = 255;
const byte symboleEgal = '=';



// La librairie de gestion des boutons
#include <OneButton.h>    // https://github.com/mathertel/OneButton

// le bouton pour les modes
const byte buttonPin = 8; // notre bouton est sur la pin 8
OneButton button(buttonPin, true); // true pour le mettre en INPUT_PULLUP

// les mode
enum : byte {eteint, manuel, automatique} mode = eteint;

// le potentiomètre
const byte pinConsigne = A0;
int tempConsigne = 0;


void afficheTemperature(int t, byte ligne, byte col)
{
  // on sait que la température est entre -55° et 125°, donc la longeur max de la chaîne 125°C = 5 caractères
  char affichage[9]; // 9 = 8 carcatère dédiés à la consigne + 1 '\0'

  char tmpBuffer[9];
  itoa(t, tmpBuffer, 10); // connvertir en chaîne, cf http://www.cplusplus.com/reference/cstdlib/itoa/?kw=itoa

  strcat(tmpBuffer, "\337C"); // \337 est le symbole '°'
  size_t l = strlen(tmpBuffer);
  memset(affichage, ' ', 8 - l); // on met des espaces à gauche
  strcpy(affichage + 8 - l, tmpBuffer);

  lcd.setCursor(col, ligne);
  lcd.print(affichage);
}


int lireEtAfficherTemperature()
{
  float t;
  for (int i = 0; i < nbCapteurs; i++) {
    t = sensors.getTempCByIndex(i);  // lire les T°. ici exemple de code avec des DS18820
    if (((int) t) != ((int) temperatures[i])) { // on n'affiche qu'en nombre entier vu la précision nécessaire
      afficheTemperature((int) t, 1, 8 * i);
    }
    temperatures[i] = t; // mais on stocke bien la bonne valeur
  }
}


void lireEtAfficherConsigne()
{
  int c;

  analogRead(pinConsigne); // double lecture pour stabiliser la mesure
  c = map(analogRead(pinConsigne), 0, 1023, -20, 100);
  if (c != tempConsigne) {
    tempConsigne = c;
    afficheTemperature(c, 0, 8);
  }
}


void afficherMode()
{
  // occupe 6 caractères de l'afficheur
  lcd.setCursor(0, 0);
  switch (mode) {
    case eteint:
      lcd.noBacklight();
      lcd.clear();
      lcd.print(F("Eteint"));
      digitalWrite(LED_BUILTIN, LOW);
      for (int i = 0; i < nbCapteurs; i++) temperatures[i] = -99; // valeur arbitraire en mode off
      tempConsigne = -99;
      break;

    case manuel:
      lcd.print(F("Manuel"));
      digitalWrite(LED_BUILTIN, HIGH);
      lcd.backlight();
      break;

    case automatique:
      lcd.print(F(" Auto "));
      digitalWrite(LED_BUILTIN, HIGH);
      lcd.backlight();
      break;
  }
}

// La fonction de call back, appellée automatiquement quand on clique
void simpleclick()
{
  switch (mode) {
    case eteint:
      mode = manuel;
      sensors.requestTemperatures();  // on lance une demande de lecture qui sera prête plus tard
      chronoTemperatures = millis();
      // ***  ICI ALLUMER LA REGULATION DE COURANT ***

      break;

    case manuel:
      mode = automatique;
      sensors.requestTemperatures();  // on lance une demande de lecture qui sera prête plus tard
      chronoTemperatures = millis();
      // ***  ICI ALLUMER LA REGULATION DE COURANT ***

      break;

    case automatique:
      mode = eteint;
      // ***  ICI ETEINDRE LA REGULATION DE COURANT ***

      break;
  }
  afficherMode();
}



void regulation()
{
  static byte oldSymbole = 0;
  byte symbole;

  switch (mode) {
    case eteint:
      symbole = symboleBlocBlanc;
      break;
    case manuel:
    case automatique:
      if ((int) tempConsigne > (int) temperatures[1]) {
        symbole = symboleFlecheDroite;
      } else if ((int) tempConsigne == (int) temperatures[1]) {
        symbole = symboleEgal;
      } else {
        symbole = symboleFlecheGauche;
      }
      break;
  }

  // pour éviter de clignotter pour rien
  if (symbole != oldSymbole) {
    // occupe 1 caractère de l'afficheur
    lcd.setCursor(7, 0);
    lcd.write(symbole);
    oldSymbole = symbole;
  }

  // ************************************************************************************
  // ici piloter les alimentations pour contrôler la température comme vous le souhaitez
  // ************************************************************************************

  // A FAIRE


  // ************************************************************************************
}




void setup() {
  Serial.begin(115200);

  pinMode(pinConsigne, INPUT);

  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);

  // on initialise les capteurs de températures
  sensors.begin();
  for (byte i = 0; i < nbCapteurs; i++) {
    sensors.getAddress(DS18820Address[i], i);
    sensors.setResolution(DS18820Address[i], resolution);
  }

  sensors.setWaitForConversion(false);  // on travaillera en asynchrone, on n'attend pas les lectures
  sensors.requestTemperatures();  // on lance une demande de lecture qui sera prête plus tard
  chronoTemperatures = millis();

  // initialiser the LCD
  lcd.begin();
  lcd.noBacklight();

  // On attache la fonction simpleClick() comme callBack en cas de simple click
  button.attachClick(simpleclick);

  afficherMode();
}


void loop() {
  // On vérifie l'état des boutons, ce qui déclenche l'appel d'une des fonctions callBack si nécessaire
  button.tick();

  if (mode != eteint) {

    // est-ce le moment le lire les capteurs de température?
    if (millis() - chronoTemperatures >= periodeLecture) {
      lireEtAfficherTemperature();
      // on relance une requete pour la prochaine fois
      sensors.requestTemperatures();
      chronoTemperatures = millis();
    }

    lireEtAfficherConsigne();

    // ici on peut gérer la régulation, cette fonction est appelée souvent mais la température n'est lue que de temps en temps
    regulation();
  }

}

C'est tout bon j'ai bien compris, je ne déclare pas 2 fois la même variable, mon adresse est bien 0x27 (désolé pour mon amateurisme).

Un très grand Merci pour l'exemple, c'est ce dont j'avais besoin
Comme je possède les pièces pour le projet je vais essayé de le réaliser
j'ai qu'un seul DS18B20 en module, pour les boutons et potentiomètre (récup) et l'écran 1602 avec I2C ok c'est tout bon, impeccable vraiment trop fort MERCI.

Voici le code qui fonctionne sans problème, je viens de compilé à l'instant pour faire un montage et notez les disfonctionnements.

En même temps je rédige le code, modifie tout ce que vous m'avez conseillé afin de testé la compilation.

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


LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // 0.27 est l'adresse du bus I2C

const int humidityRelay = 18; 
const int heaterRelay = 19; 
const int DHTPIN = 3; 


int temp = 12;
int hum = 80;
int readkey;
long int lastmillis;
long int hours;
long int minutes;
long int seconds;

char l2c1;
char l2c2;
char l2c3;

DHT dht (DHTPIN, DHT22);

DFR_Key keypad(0); 

int localKey = 0;
String keyString = "";
int lcd_key = 0;
int adc_key_in = 0;

const byte btnRIGHT = 0;  
const byte btnUP = 1;     
const byte btnDOWN = 2;   
const byte btnLEFT = 3;   
const byte btnSELECT = 4; 
const byte btnNONE = 5;   

int read_LCD_buttons() {
  adc_key_in = analogRead(0);
  if (adc_key_in > 1000) return btnNONE;
  if (adc_key_in < 50)   return btnRIGHT;
  if (adc_key_in < 150)  return btnUP;
  if (adc_key_in < 300)  return btnDOWN;
  if (adc_key_in < 460)  return btnLEFT;
  if (adc_key_in < 690)  return btnSELECT;
}

void setup() {
  pinMode(humidityRelay, OUTPUT);
  pinMode(heaterRelay, OUTPUT);
  lcd.begin(16, 2);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Keith control");
  lcd.setCursor(0, 1);
  lcd.print("Instr on Select");
  delay(2500);
  Serial.begin(9600);
  dht.begin();
  delay(1000);
  lcd.clear();

  keypad.setRate(10);
  digitalWrite(humidityRelay, HIGH);
  digitalWrite(heaterRelay, HIGH);

}

void loop() 

{
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  if (isnan(t) || isnan(h)) 

{ 
                              
    lcd.begin(16, 2);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Capteur N/C!!");
    delay(10000);
} 

else 

{
    lcd_key = read_LCD_buttons();
    switch (lcd_key) {
      case btnLEFT:
        {
          temp = temp + 1;
          break;
        }
      case btnRIGHT:
        {
          temp = temp - 1;
          break;
        }
      case btnUP:
        {
          hum = hum + 1;
          break;
        }
      case btnDOWN:
        {
          hum = hum - 1;
          break;
        }
      case btnSELECT:
        {
          lcd.begin(16, 2);
          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print("Hum Up/Down +-1%");
          lcd.setCursor(0, 1);
          lcd.print("Temp L/R +-1");
          lcd.print((char)223);
          lcd.print("C");
          delay (5000);
          break;
        }
    }
    lcd.setCursor(0, 0);
    lcd.print("Hum: ");
    lcd.print(h);
    lcd.print("%");
    lcd.print("(");
    lcd.print(hum);
    lcd.print("%)");
    lcd.setCursor(0, 1);
    lcd.print("Tem: ");
    lcd.print(t);
    lcd.print((char)223);
    lcd.print("(");
    lcd.print(temp);
    lcd.print((char)223);
    lcd.print(")");
    
    int H = 70 + 10;
    if (h < 85) digitalWrite(humidityRelay, LOW);
    else if (h >= H) digitalWrite(humidityRelay, HIGH);
    
    int T = 12 + 2 ;
    if (t < 12 )
      digitalWrite(heaterRelay, LOW);
    else if (t >= T)
      digitalWrite(heaterRelay, HIGH);
  }

}

J'ai beaucoup de modif à faire. Je vous remercie encore pour tout le soutien J-M-L, Respect à vous.

Pas de soucis, il faut commencer quelque part - on est tous passé par là.. maintenant c’est mieux si on ne répète pas 36 fois les même choses :slight_smile:

Dans votre code vous faitesLiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // 0.27 est l'adresse du bus I2Cle commentaire serait mieux avec 0x27 pourquoi mettre un . Maintenant à la place de votre virgule ? Et c’est quoi les 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE ? Vous êtes en I2C vraiment? Utilisez vous cette librairie ?

const int humidityRelay = 18; on avait dit const [color=red]byte[/color] pour les numéros de pins non ?

long int lastmillis; et notre discussion sur unsigned long oubliée déjà ?

Etc

Un peu déprimant...

Bonjour cher J-M-L, je m'excuse car je vous est mal compris comme vous m'avez écrit
(essayez de postez un code qui au moins compile...)
Alors j'ai envoyé le premier sketch d'origine sans modif pensant vous facilité la compréhension du code.

Pas de problème j'ai bien tout noté lettres par lettre pour finalisé le code selon vos instructions.

Voici le code final modifié :

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


const byte humidityRelay = 18; 
const byte heaterRelay = 19;     
const byte DHTPIN = 2;  
const byte nbColumns = 16;
const byte nbLines   = 2;            

LiquidCrystal_I2C lcd( 0x27, nbColumns, nbLines);  

int temp = 12;  
int hum = 80;  
int readkey;
unsigned long lastmillis; 
long int hours;
long int minutes;   
long int seconds;

char l2c1;
char l2c2;
char l2c3;


DHT dht (DHTPIN, DHT22);  //  Type de capteur DHT22 (AM2023)


DFR_Key keypad(0); 

int localKey = 0;  
int lcd_key = 0;
int adc_key_in = 0;

const byte btnRIGHT = 0;  
const byte btnUP = 1;     
const byte btnDOWN = 2;   
const byte btnLEFT = 3;   
const byte btnSELECT = 4; 
const byte btnNONE = 5;   

int read_LCD_buttons() 
{
  adc_key_in = analogRead(0);
  if (adc_key_in > 1000) return btnNONE;
  if (adc_key_in < 50)   return btnRIGHT;
  if (adc_key_in < 150)  return btnUP;
  if (adc_key_in < 300)  return btnDOWN;
  if (adc_key_in < 460)  return btnLEFT;
  if (adc_key_in < 690)  return btnSELECT;
}

void setup() 

{
  pinMode(humidityRelay, OUTPUT);
  pinMode(heaterRelay, OUTPUT);
  lcd.begin(16, 2);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(F("Keith control"));  //  utilisé le macro F () dans tous les Print () du Lcd ou de Serial
  lcd.setCursor(0, 1);
  lcd.print(F("Select instr"));  // 
  delay(2500);
  Serial.begin(F(115200));   // Mettre le port série sur 115200 au lieu de 9600
  dht.begin();
  delay(1000);
  lcd.clear();

  
  keypad.setRate(10);
  digitalWrite(humidityRelay, HIGH);  // Relais Humidité actif
  digitalWrite(heaterRelay, HIGH);  // Relais Température actif

}

void loop() 

{
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  if (isnan(t) || isnan(h))
{  
                             
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print(F("Capteur N/C!!"));  // utilisé le macro F () 
    delay(10000);
  } 
else 
 {
    lcd_key = read_LCD_buttons();  
    switch (lcd_key) 
 {
      case btnLEFT:
        {
          temp = temp + 1; 
          break;
        }
      case btnRIGHT:
        {
          temp = temp - 1;  
          break;
        }
      case btnUP:
        {
          hum = hum + 1;  
          break;
        }
      case btnDOWN:
        {
          hum = hum - 1;  
          break;
        }
      case btnSELECT:   
        {
          lcd.begin(16, 2);
          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print(F("Hum Up/Down +-1%"));  // utilisé le macro F () 
          lcd.setCursor(0, 1);
          lcd.print(F("Temp L/R +-1"));   
          lcd.print(F((char)223));  
          lcd.print(F("C"));  
          delay (5000);
          break;
        }
    } 
    lcd.setCursor(0, 0);     
    lcd.print(F("Hum: "));  // utilisé le macro F () pour tous les lcd.print
    lcd.print(F(h));
    lcd.print(F("%"));
    lcd.print(F("("));
    lcd.print(F(hum));
    lcd.print(F("%)"));
    lcd.setCursor(0, 1);
    lcd.print(F("Tem: "));
    lcd.print(F(t));
    lcd.print(F((char)223));  
    lcd.print(F("("));
    lcd.print(F(temp));
    lcd.print(F((char)223));
    lcd.print(F(")"));

    int H = 70 + 10;  
   
    if (h < 85) digitalWrite(humidityRelay, LOW);  
    
    else if (h >= H) digitalWrite(humidityRelay, HIGH);  
   
    int T = 12 + 2 ; 
    
    if (t < 12 )
      
    digitalWrite(heaterRelay, LOW);  
    
     else if (t >= T)
     
    digitalWrite(heaterRelay, HIGH);  
  }

}

J'ai peur d'avoir oublié quelque chose :cold_sweat:
Si tout est ok je vais essayé de le compilé tout ça afin de voir le résultat,
Merci de tout mon coeur pour votre générosité très cher J-M-L.

Si tout est ok je vais essayé de le compilé tout ça afin de voir le résultat,

le principe de base en informatique, c'est de compiler et tester... même si on essaye de tout écrire correctement au début, c'est rarement le cas...

vous n'avez même pas encore compilé quoi que ce soit ?

(sinon comme je suis un homme - évitez le 'e" à la fin de très chère J-M-L :grin: :grin: )

Desole pour l'erreur :slight_smile:

Je viens d'essayer mais malheureusement pas compiler voici le message d'erreur :

Arduino : 1.8.4 (Windows 7), Carte : "Arduino/Genuino Uno"

C:\Users\\Documents\Arduino\Essai_Code_JML_oct29\Essai_Code_JML_oct29.ino: In function 'void setup()':
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/WString.h:38:74: error: initializer fails to determine size of '__c'
#define F(string_literal) (reinterpret_cast<const __FlashStringHelper *>(PSTR(string_literal)))

                                                                   C:\Users\\Documents\Arduino\Essai_Code_JML_oct29\Essai_Code_JML_oct29.ino:67:16: note: in expansion of macro 'F'

   Serial.begin(F(9600));   

                ^
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/WString.h:38:74: error: array must be initialized with a brace-enclosed initializer

 #define F(string_literal) (reinterpret_cast<const __FlashStringHelper *>(PSTR(string_literal)))

                                                                        C:\Users\\Documents\Arduino\Essai_Code_JML_oct29\Essai_Code_JML_oct29.ino:67:16: note: in expansion of macro 'F'

   Serial.begin(F(9600));   

                ^
C:\Users\\Documents\Arduino\Essai_Code_JML_oct29\Essai_Code_JML_oct29.ino: In function 'void loop()':

C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/WString.h:38:74: error: initializer fails to determine size of '__c'

 #define F(string_literal) (reinterpret_cast<const __FlashStringHelper *>(PSTR(string_literal)))

                                                                          ^
C:\Users\\Documents\Arduino\Essai_Code_JML_oct29\Essai_Code_JML_oct29.ino:126:21: note: in expansion of macro 'F'

           lcd.print(F((char)223));  

                     ^
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/WString.h:38:74: error: array must be initialized with a brace-enclosed initializer

 #define F(string_literal) (reinterpret_cast<const __FlashStringHelper *>(PSTR(string_literal)))

                                                                          ^

C:\Users\\Documents\Arduino\Essai_Code_JML_oct29\Essai_Code_JML_oct29.ino:126:21: note: in expansion of macro 'F'

           lcd.print(F((char)223));  

                     ^
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/WString.h:38:74: error: initializer fails to determine size of '__c'

 #define F(string_literal) (reinterpret_cast<const __FlashStringHelper *>(PSTR(string_literal)))

                                                                          ^
C:\Users\\Documents\Arduino\Essai_Code_JML_oct29\Essai_Code_JML_oct29.ino:134:15: note: in expansion of macro 'F'

     lcd.print(F(h));

               ^
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/WString.h:38:74: error: array must be initialized with a brace-enclosed initializer

 #define F(string_literal) (reinterpret_cast<const __FlashStringHelper *>(PSTR(string_literal)))

                                                                          ^
C:\Users\\Documents\Arduino\Essai_Code_JML_oct29\Essai_Code_JML_oct29.ino:134:15: note: in expansion of macro 'F'

     lcd.print(F(h));

               ^
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/WString.h:38:74: error: initializer fails to determine size of '__c'

 #define F(string_literal) (reinterpret_cast<const __FlashStringHelper *>(PSTR(string_literal)))

                                                                          ^
C:\Users\\Documents\Arduino\Essai_Code_JML_oct29\Essai_Code_JML_oct29.ino:137:15: note: in expansion of macro 'F'

     lcd.print(F(hum));

               ^
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/WString.h:38:74: error: array must be initialized with a brace-enclosed initializer

 #define F(string_literal) (reinterpret_cast<const __FlashStringHelper *>(PSTR(string_literal)))

                                                                          ^
C:\Users\\Documents\Arduino\Essai_Code_JML_oct29\Essai_Code_JML_oct29.ino:137:15: note: in expansion of macro 'F'

     lcd.print(F(hum));

               ^
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/WString.h:38:74: error: initializer fails to determine size of '__c'

 #define F(string_literal) (reinterpret_cast<const __FlashStringHelper *>(PSTR(string_literal)))

                                                                          ^

C:\Users\\Documents\Arduino\Essai_Code_JML_oct29\Essai_Code_JML_oct29.ino:141:15: note: in expansion of macro 'F'

     lcd.print(F(t));

               ^
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/WString.h:38:74: error: array must be initialized with a brace-enclosed initializer

 #define F(string_literal) (reinterpret_cast<const __FlashStringHelper *>(PSTR(string_literal)))

                                                                          ^
C:\Users\\Documents\Arduino\Essai_Code_JML_oct29\Essai_Code_JML_oct29.ino:141:15: note: in expansion of macro 'F'

     lcd.print(F(t));

               ^
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/WString.h:38:74: error: initializer fails to determine size of '__c'

 #define F(string_literal) (reinterpret_cast<const __FlashStringHelper *>(PSTR(string_literal)))

                                                                          ^
C:\Users\\Documents\Arduino\Essai_Code_JML_oct29\Essai_Code_JML_oct29.ino:142:15: note: in expansion of macro 'F'

     lcd.print(F((char)223));  

               ^
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/WString.h:38:74: error: array must be initialized with a brace-enclosed initializer

 #define F(string_literal) (reinterpret_cast<const __FlashStringHelper *>(PSTR(string_literal)))

                                                                          ^
C:\Users\\Documents\Arduino\Essai_Code_JML_oct29\Essai_Code_JML_oct29.ino:142:15: note: in expansion of macro 'F'

     lcd.print(F((char)223));  

               ^
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/WString.h:38:74: error: initializer fails to determine size of '__c'

 #define F(string_literal) (reinterpret_cast<const __FlashStringHelper *>(PSTR(string_literal)))

                                                                          ^
C:\Users\\Documents\Arduino\Essai_Code_JML_oct29\Essai_Code_JML_oct29.ino:144:15: note: in expansion of macro 'F'

     lcd.print(F(temp));

               ^

C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/WString.h:38:74: error: array must be initialized with a brace-enclosed initializer

 #define F(string_literal) (reinterpret_cast<const __FlashStringHelper *>(PSTR(string_literal)))

                                                                          ^
C:\Users\\Documents\Arduino\Essai_Code_JML_oct29\Essai_Code_JML_oct29.ino:144:15: note: in expansion of macro 'F'

     lcd.print(F(temp));

               ^
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/WString.h:38:74: error: initializer fails to determine size of '__c'

 #define F(string_literal) (reinterpret_cast<const __FlashStringHelper *>(PSTR(string_literal)))

                                                                          ^
C:\Users\\Documents\Arduino\Essai_Code_JML_oct29\Essai_Code_JML_oct29.ino:145:15: note: in expansion of macro 'F'

     lcd.print(F((char)223));

               ^
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/WString.h:38:74: error: array must be initialized with a brace-enclosed initializer

 #define F(string_literal) (reinterpret_cast<const __FlashStringHelper *>(PSTR(string_literal)))

                                                                     C:\Users\\Documents\Arduino\Essai_Code_JML_oct29\Essai_Code_JML_oct29.ino:145:15: note: in expansion of macro 'F'

     lcd.print(F((char)223));

               ^
Erreur de compilation pour la carte Arduino/Genuino Uno

je crois que ca va etre mission impossible pour moi :sweat_smile: mais c'est pas grave on apprend toujours.

Mon objectif n'est pas de devenir programmateur, niveau d'etude malheureusement (cacahuètes), dans la vie active (ouvrier en usine)
mais juste de réaliser un genre de thermostat ou contrôleur de température et d'humidité genren PID afin d'affiner du fromage fait maison dans un frigo modifié.

Je possède déjà de thermostat numérique et humidificateur numérique acheté tout prêt mais les options sont limitées, alors qu'avec le système Arduino les possibilités sont multiples comme enregistré les données sur carte sd, recevoir l'état actuel du frigo par mail ou message grâce aux modules Ethernet ou wifi...

Voici la photo du frigo d'affinage en question que je desire contrôlé,
Très Cher J-M-L, je vous est pris la tête avec mes aventures veuillez m'excuser mais là j'ai plus le niveau :slight_smile:

En tout cas je vous remercie encore et encore pour tout ce que vous avez fait pour ce galérien, pour votre patience bien-sûr et votre compréhension, Grand Respect à vous,
Cordialement.

Des nouvelles vite fait...

Reussi a compiler avec ce code sans utiliser la methode Macro F et on gagne de la place dans la memoire
Grace a vous J-M-L merci.

#include <DHT.h> 
#include <Wire.h>
#include <LCD.h>
#include <DFR_Key.h> 
#include <LiquidCrystal_I2C.h>

const byte humidityRelay = 10; 
const byte heaterRelay = 11;     
const byte DHTPIN = 2;  
const byte nbColumns = 16;
const byte nbLines   = 2;             

LiquidCrystal_I2C lcd( 0x27, nbColumns, nbLines); 

int temp = 12;
int hum = 80;
int readkey;
long int lastmillis; 
long int hours;
long int minutes;
long int seconds;

char l2c1;
char l2c2;
char l2c3;

// Pour DHT22 (AM2023)
DHT dht (DHTPIN, DHT22);

DFR_Key keypad(0); 

int localKey = 0;
int lcd_key = 0;
int adc_key_in = 0;

const byte btnRIGHT = 0;  
const byte btnUP = 1;     
const byte btnDOWN = 2;   
const byte btnLEFT = 3;   
const byte btnSELECT = 4; 
const byte btnNONE = 5;   

int read_LCD_buttons() 
{
  adc_key_in = analogRead(0);
  if (adc_key_in > 1000) return btnNONE;
  if (adc_key_in < 50)   return btnRIGHT;
  if (adc_key_in < 150)  return btnUP;
  if (adc_key_in < 300)  return btnDOWN;
  if (adc_key_in < 460)  return btnLEFT;
  if (adc_key_in < 690)  return btnSELECT;
}

void setup() 

{
  pinMode(humidityRelay, OUTPUT);
  pinMode(heaterRelay, OUTPUT);
  lcd.begin(16, 2);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Keith control");
  lcd.setCursor(0, 1);
  lcd.print("Instr on Select");
  delay(2500);
  Serial.begin(9600);
  dht.begin();
  delay(1000);
  lcd.clear();

  
  keypad.setRate(10);
  digitalWrite(humidityRelay, HIGH);
  digitalWrite(heaterRelay, HIGH);

}

void loop() 

{
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  if (isnan(t) || isnan(h)) 
  
  {
                             
    // lcd.begin(16, 2);supprimer
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Capteur N/C!!");
    delay(10000);
  } 
  
  else 
  
  {
    lcd_key = read_LCD_buttons();
    switch (lcd_key) {
      case btnLEFT:
        {
          temp = temp + 1;
          break;
        }
      case btnRIGHT:
        {
          temp = temp - 1;
          break;
        }
      case btnUP:
        {
          hum = hum + 1;
          break;
        }
      case btnDOWN:
        {
          hum = hum - 1;
          break;
        }
      case btnSELECT:
        {
          lcd.begin(16, 2);
          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print("Hum Up/Down +-1%");
          lcd.setCursor(0, 1);
          lcd.print("Temp L/R +-1");
          lcd.print((char)223);
          lcd.print("C");
          delay (5000);
          break;
        }
    }
    
    lcd.setCursor(0, 0);
    lcd.print("Hum: ");
    lcd.print(h);
    lcd.print("%");
    lcd.print("(");
    lcd.print(hum);
    lcd.print("%)");
    lcd.setCursor(0, 1);
    lcd.print("Tem: ");
    lcd.print(t);
    lcd.print((char)223);
    lcd.print("(");
    lcd.print(temp);
    lcd.print((char)223);
    lcd.print(")");
    
    int H = 70 + 10;
    if (h < 85) digitalWrite(humidityRelay, LOW);
    else if (h >= H) digitalWrite(humidityRelay, HIGH);
    
    int T = 12 + 2 ;
    if (t < 12 )
      digitalWrite(heaterRelay, LOW);
    else if (t >= T)
      digitalWrite(heaterRelay, HIGH);
  }

}

J'ai compris qu'il faut que je fasse pas mal d'essais avant d'arriver au but final et encore...
Mais ya moyen comme on dit.

On baisse pas les bras. >:(

et je viens d'ajouter ces 2 lignes pour essayer d'avoir de la lumiere le temps de visualiser l'ecran
mais... rien.

}

void loop() 

{
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  if (isnan(t) || isnan(h)) 
  if (millis() - lastmillis > 15000)          // Ajouter pour essai
  {
                             
    lcd.setBacklight(HIGH);               // Ajouter pour essai
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Capteur N/C!!");
    delay(10000);
  }

pare contre je ne sais pas ce que ca va donner au montage, je vais essayer.

Bonsoir,

Résultat final, après avoir modifié sur modifié compilé sur compilé rien de concluant, avec la méthode J-M-L je gagne de l'espace dans la mémoire mais pas d'affichage, le seul code qui fonctionne est celui d'origine mais sans eclairage et une mauvaise gestion des menus... rien de satisfaisant.

Comme ça à l'air d'être un projet unique (Shield 1602 6boutons, module I2C, module dht22 et relais 2 canaux avec menu pour changer les valeurs..) je ne trouve pas d'exemple précis dans le net pour faire avancer les choses.

Et bien-sûr étant amateur et voulant me prendre pour un programmateur avec ce big projet, je tourne en rond.

Mais je ne lache pas l'affaire.

Je ne peut mettre résolu car pas résolu, mais je vais bosser comme me le conseil J-M-L dans le système PID etc...

Je remercie encore une fois J-M-L pour toute l'aide apporté.
À bientôt.

La politique du forum c’est qu’il n’est pas correct d’ouvrir deux fois le même sujet

Je ne vous ai pas manqué de respect, comme il y a de nombreux participants qui parlent français (dont des modérateurs) sur le forum anglais j’ai mis un lien vers le post en français - ce que vous aviez omis - et j’ai dit que je ne contribuerais pas aux deux endroits. Je ne vois pas en quoi ça vous pose un soucis, concentrez vous sur le code et les faits.

Cordialement