Problème Ecran LCD

Bonjour,

Je m'appelle Enzo et je suis en fin de L1 à l'université de Bordeaux en filière IMSAT (vu que vous demandez une présentation je la pose là, si il fallait le faire ailleurs je m'excuse). Je me suis mis à bosser sur l'électronique suite à mes cours (surtout d'Elec Programée) pour réviser et faire 2-3 projets sympas vu qu'on en a pas en L1.

Comme premier projet, j'ai comme idée de faire une station météo avec une carte Arduino Uno, à laquelle j'ai ajouté un Shield pour y brancher un Groove DHT22. À tout ça j'ai branché un écran LCD 16x2 I2C et sur un breadboard 2 boutons. Le but c'est que l'écran LCD soit éteint et que des qu'on appuie sur l'un des deux boutons, soit afficher la température soit l'humidité.

J'ai fais de nombreux test:

Tout d'abord les boutons avec le DHT22 pour afficher soit la température soit l'humidité sur le moniteur Série, ça fonctionne.

#include "Grove_Temperature_And_Humidity_Sensor.h"


#define DHTTYPE DHT22
#define DHTPIN 2    
DHT dht(DHTPIN, DHTTYPE);


#if defined(ARDUINO_ARCH_AVR)
    #define debug  Serial

#elif defined(ARDUINO_ARCH_SAMD) ||  defined(ARDUINO_ARCH_SAM)
    #define debug  SerialUSB
#else
    #define debug  Serial
#endif

//configuration boutons
int bouton_temp = 3;
int bouton_hum = 4;

void setup() {

    debug.begin(115200);
    debug.println("DHTxx test!");
    Wire.begin();

    pinMode(bouton_temp, INPUT_PULLUP);
    pinMode(bouton_hum, INPUT_PULLUP);


    dht.begin();
}

void loop() {
    float temp_hum_val[2] = {0};
    
    //Lecture états des boutons
    digitalRead(bouton_temp);
    digitalRead(bouton_hum);

    if (digitalRead(bouton_hum) == HIGH) {
        !dht.readTempAndHumidity(temp_hum_val);
        Serial.print("Humidity: ");
        Serial.print(temp_hum_val[0]);
        Serial.print(" %\t");
        delay(2000);
     } 
    
    if (digitalRead(bouton_temp) == HIGH){
        !dht.readTempAndHumidity(temp_hum_val);
        Serial.print("Temperature: ");
        Serial.print(temp_hum_val[1]);
        Serial.println(" *C");
        delay(2000);
        } 
    
    else {
        Serial.println("No data");
    }

    delay(250);
}

Ensuite l'écran LCD avec le DHT 22 où j'affiche la température et ça se rafraîchit toutes les 2 secondes, ça fonctionne.

#include <LiquidCrystal_I2C.h>
#include <Grove_Temperature_And_Humidity_Sensor.h>

LiquidCrystal_I2C lcd(0x27,16,2);

#define DHTTYPE DHT22 
#define DHTPIN 2
DHT dht(DHTPIN, DHTTYPE); 
#if defined(ARDUINO_ARCH_AVR)
    #define debug  Serial
#elif defined(ARDUINO_ARCH_SAMD) ||  defined(ARDUINO_ARCH_SAM)
    #define debug  SerialUSB
#else
    #define debug  Serial
#endif


void setup() {

  debug.begin(115200);
  Wire.begin();
  dht.begin();

  lcd.init();
  lcd.clear();
  lcd.backlight();

}

void loop() {

  float temp_hum_val[2] = {0};

  if (!dht.readTempAndHumidity(temp_hum_val)) {

    lcd.setCursor(0,0);
    lcd.print("Temperature");
    lcd.setCursor(0,1);
    lcd.print(temp_hum_val[1]);

    } else {
      lcd.setCursor(0,0);
      debug.println("Fail");
    }

    delay(2000);
}

Et enfin j'ai essayé de fusionner les deux car je me dis que si j'arrive à faire fonctionner ces deux codes je peux les fusionner pour finir mon projets sauf qu'au moment d'appuyer sur l'un des deux boutons l'écran affiche une suite de caractère qui ont aucun sens et j'ai l'impression qu'il reste bloqué. Je vous laisse une vidéo pour illustrer ce que je dis ainsi que le code.

Si quelqu'un peut m'aider ça m'aiderait fortement ! Ça fait 2 semaines que je suis bloqué là dessus et ça commence à m'énerver sachant que j'aimerai passer à un autre projet.

Merci par avance la communauté.

Le code en question:

//Définition Bilbiothèques
#include <Grove_Temperature_And_Humidity_Sensor.h>
#include <LiquidCrystal_I2C.h>

//Configuration DHT22
#define DHTTYPE DHT22 
#define DHTPIN 2
DHT dht(DHTPIN, DHTTYPE); 
#if defined(ARDUINO_ARCH_AVR)
    #define debug  Serial
#elif defined(ARDUINO_ARCH_SAMD) ||  defined(ARDUINO_ARCH_SAM)
    #define debug  SerialUSB
#else
    #define debug  Serial
#endif

//Configuration Ecran
LiquidCrystal_I2C lcd(0x27,16,2);

//configuration boutons
int bouton_temp = 3;
int bouton_hum = 4;


void setup() {

  //Initialisation debug
  debug.begin(115200);

  //Initialisation Ecran
  lcd.begin(16,2);
  lcd.init();
  lcd.clear();
  lcd.backlight();

  //Initialisation Boutons
  pinMode(bouton_temp, INPUT_PULLUP);
  pinMode(bouton_hum, INPUT_PULLUP);

  //Initialisation DHT22
  Wire.begin();
  dht.begin();

  

}

void loop() {

  //mets les variables du DHT22 à 0
  float temp_hum_val[2] = {0};

 if (digitalRead(bouton_temp) == HIGH){
  !dht.readTempAndHumidity(temp_hum_val);
  lcd.backlight();
  lcd.setCursor(0,0);
  lcd.print("temperature");
  lcd.setCursor(0,1);
  lcd.print(temp_hum_val[1]);
  delay(2000);
  }

  else if (digitalRead(bouton_hum) == HIGH){
  !dht.readTempAndHumidity(temp_hum_val);
  lcd.backlight();
  lcd.setCursor(0,0);
  lcd.print("humidite");
  lcd.setCursor(0,1);
  lcd.print(temp_hum_val[0]);
  delay(2000);
  }

  else {
    lcd.noBacklight();
    lcd.clear();
    }

  delay(250);



}

L'illustration en question:

à quoi ça sert cela?

pourquoi un ! devant cette commande ?

où avez vous affecté les variables que vous imprimez ?

Tout d’abord je suis d’accord que les deux digitalread ne servent à rien. Je les avais supprimé un peu avant de me décider d’écrire ici et j’ai vu qu’ils sont inutiles.

Ensuite pour le « ! » devant le dht.Read c’est parce que dans la bibliothèque du Groove DHT22 la fonction de lecture de la température et de l’humidité, ou du moins de ce que j’ai compris, commence comme ça. Dans le code exemple de la bibliothèque en tout cas c’est comme ça.

Enfin la ligne écrite ci-dessous définit ces deux variables, du moins je crois car en la supprimant j’ai un code erreur qui me dit que ces deux variables ne sont pas définit.

La ligne en question:

float temp_hum_val[2] = {0};

ça devait être dans un if (....)non ?

l'opérateur ! est un opérateur booléen qui retournera la valeur de vérité inverse (vrai devient faux et faux devient vrai).

de nombreuses fonctions vont retourner une valeur de vérité (ou un code numérique) pour vous dire s'il y a eu une erreur par exemple si la fonction retourne 0 ou false et on verra alors

if (!dht.readTempAndHumidity(temp_hum_val)) {
  ... // ça s'est bien passé
}

mais si vous vous fichez de savoir si la lecture était correcte Alors ça sert à rien d'inverser la valeur retournée par la fonction puisque vous ne la lisez pas.


plus précisément ça définit un tableau avec deux entrées. temp_hum_val[0]et temp_hum_val[1]
le question était : où avez vous affecté les variables (stocké une valeur dans la variable) que vous imprimez ?

Rebonjour,

Tout d'abord merci pour l'explication de l'opérateur "!". A vrai dire je ne le connaissais pas alors ça m'a permis d'apprendre quelque chose de nouveau. Maintenant dans mon code j'ai essayé d'enlever cet opérateur et l'écran afficher toujours la même chose que sur la vidéo.

Sinon de ce que j'ai compris la ligne float temp_hum_val[2] = {0}; crée un tableau avec les deux variables de température et d'humidité. Et le {0} sert à quoi ? Donc vous me conseillez de stocké ces données dans une variable et ensuite de faire un lcd.print(la variable en question); ?

oui, il sert juste à rien - ça ne change pas l'appel de fonction

il met les 2 valeurs à 0 par défaut

Non.

dans votre code vous faites (j'ai enlevé le ! qui ne sert à rien)

  dht.readTempAndHumidity(temp_hum_val);
...
  lcd.print(temp_hum_val[1]);

et puis dans le else

dht.readTempAndHumidity(temp_hum_val);
...
lcd.print(temp_hum_val[0]);

Dans votre esprit, comment le premier appel pourrait remplir la variable temp_hum_val[1] alors que le même appel dans le else devrait remplir la variable temp_hum_val[0] ?

Ça ne vous intrigue pas ? :innocent:

Rebonsoir @J-M-L , vos messages sont d'une grande aide car ça me permet d'en apprendre plus sur le codage mais malheureusement je suis toujours bloqué...

Dans votre esprit, comment le premier appel pourrait remplir la variable temp_hum_val[1] alors que le même appel dans le else devrait remplir la variable temp_hum_val[0] ?
Ça ne vous intrigue pas ? :innocent:

Tout d'abord en ce qui concerne cette partie je crois ne pas avoir bien saisis ce que vous voulez m'expliquer.

Maintenant sur mon code j'ai enlevé l'opérateur "!" et là stupéfaction: j'avais mal mis mon bouton de température sur le breadboard et l'écran lcd affichait bien "température 23,90", comme quoi le problème ne vient pas de mes lignes lcd.print(); mais des boutons !! Car au moment de mettre le bouton, le même texte que sur la vidéo que j'ai posté s'affiche.

Je vais donc vous mettre une photo du breadboard avec les boutons pour que vous me donniez votre avis, car je pense que la piste des boutons est la bonne voie. Les câbles noirs sont bien branché au GND de la carte, les câbles rouges au 5V de la carte et les fils blancs au port D3 et D4 (faîtes pas attention aux fils rouge et noir qui sortent de la breadboard ils sont branchés à l'écran qu'on voit pas)

Pour simple rappel, mon projets est de faire une station météo avec le DHT22 et un écran lcd où, dans un premier temps il est éteint mais, au moment d'appuyer sur l'un des deux boutons, afficher soit l'humidité soit la température, selon le bouton appuyé.

Je laisse le code avec les modifications appliqués au-dessus au cas où.

//Définition Bilbiothèques
#include <Grove_Temperature_And_Humidity_Sensor.h>
#include <LiquidCrystal_I2C.h>

//Configuration DHT22
#define DHTTYPE DHT22 
#define DHTPIN 2
DHT dht(DHTPIN, DHTTYPE); 
#if defined(ARDUINO_ARCH_AVR)
    #define debug  Serial
#elif defined(ARDUINO_ARCH_SAMD) ||  defined(ARDUINO_ARCH_SAM)
    #define debug  SerialUSB
#else
    #define debug  Serial
#endif

//Configuration Ecran
LiquidCrystal_I2C lcd(0x27,16,2);

//configuration boutons
int bouton_temp = 3;
int bouton_hum = 4;


void setup() {

  //Initialisation debug
  debug.begin(115200);

  //Initialisation Ecran
  lcd.begin(16,2);
  lcd.init();
  lcd.clear();
  lcd.backlight();

  //Initialisation Boutons
  pinMode(bouton_temp, INPUT_PULLUP);
  pinMode(bouton_hum, INPUT_PULLUP);

  //Initialisation DHT22
  Wire.begin();
  dht.begin();

  

}

void loop() {

  //mets les variables du DHT22 à 0
  float temp_hum_val[2] = {0};

 if (digitalRead(bouton_temp) == HIGH){
  dht.readTempAndHumidity(temp_hum_val);
  lcd.backlight();
  lcd.setCursor(0,0);
  lcd.print("temperature");
  lcd.setCursor(0,1);
  lcd.print(temp_hum_val[1]);
  delay(2000);
  }

  else if (digitalRead(bouton_hum) == HIGH){
  dht.readTempAndHumidity(temp_hum_val);
  lcd.backlight();
  lcd.setCursor(0,0);
  lcd.print("humidite");
  lcd.setCursor(0,1);
  lcd.print(temp_hum_val[0]);
  delay(2000);
  }

  else {
    lcd.noBacklight();
    lcd.clear();
    }

  delay(250);



}

lcd.begin(16,2);
lcd.init();

chez moi erreur de compil, je n'ai qu'une seule biblio LiquidCrystal_I2C.h

pourquoi le +5v est-il connecté aux boutons ? les entrées sont déclarées pullup
justement les 2 fils noirs qui partent des boutons vont où ?
les fils rouges qui arrivent aux boutons sont sur le +5v

bouton sur entree arduino

Ce n’est pas une explication - je vous demande d’essayer de comprendre le code que vous avez. Comment la même ligne de lecture du capteur pourrait stocker la valeur dans deux variables différentes selon vous ?

Pour les boutons le mieux c’est de les câbler en diagonal - avec le bouton à cheval sur le milieu de la breadboard et en INPUT_PULLUP (une pin à GND et l’autre vers l’arduino).

Il y a plusieurs bibliothèques avec le même nom. Le plus simple c’est de les virer toutes et prendre hd44780 - Arduino Reference qui est bien plus efficace


Sur ta breadboard,

  • le fil rouge arrive sur la borne 3 du bouton
  • le fil noir arrive sur la borne 1
  • le fil blanc arrive sur la borne 2

Donc le fil blanc est connecté en permanence au fil noir et lorsque tu appuies sur le bouton tu réunis tous les signaux.
Donc, si

  • le rouge c'est le +5V
  • le noir le GND
  • le blanc l'entrée de ton Arduino

L'entrée est connectée en permanence à GND et lorsque tu appuies sur le bouton tu fais un court-circuit entre +5V et GND.

Donc il faudrait supprimer le fil rouge et, comme le suggère @J-M-L , câbler le noir et le blanc en diagonal sur 1 et 4 par exemple.

Ce qui peut détruire l’arduino…

Bonjour tout le monde, j'ai pris connaissances de tous les messages et j'ai fais mes modifications et mes tests. Je peux déjà vous dire qu'il y a eu une grosse modification: l'écran affiche ENFIN la température avec la valeur de la température MAIS il affiche que ça, alors que j'appuie sur aucun bouton (donc le code devrait aller dans le else où je demande à l'écran de ne rien faire). Je vais en venir en vous répondant pour que vous compreniez mieux....

Tout d'abord pour @J-M-L, j'ai finalement compris que la ligne dht.readTempAndHumidity(temp_hum_val); ne fait que lire les valeurs de température et d'humidité captées par le capteur sans les écrire, d'où dans le code DHTTest le if (!dht.readTempAndHumidity(temp_hum_val)) { peut littéralement être traduit par "si quelque chose est lu" ou "si une info est captée par le capteur". C'est bien ça ? Si je traduis ce paragraphe ça fait donc :

float temp_hum_val[2] = {0}; /// mets les variables du DHT22 à 0

 if (digitalRead(bouton_temp) == HIGH){ //Si du courant est captée en D3
  dht.readTempAndHumidity(temp_hum_val); //Lire la température et l'humidité
  lcd.backlight(); //Allumer l'écran
  lcd.setCursor(0,0); //Postioner le curseur en (0,0)
  lcd.print("temperature"); //Ecrire "température" sur l'écran
  lcd.setCursor(0,1);  //Postioner le curseur en (0,1)
  lcd.print(temp_hum_val[1]); //Ecrire "température" sur l'écran
  delay(2000); // Attendre 2 secondes.
  }

Au moment de traduire cette partie de mon code, j'ai rajouté à la fin un lcd.clear() car je me suis dis qu'à la fin des deux secondes ça serait bien d'effacer ce qui est affiché sur l'écran. Ce que l'écran fait maintenant c'est que, en appuyant sur aucun bouton, l'écran affiche "température (la valeur de temp)", efface ce qui est affiché et affiche encore une fois "température (la valeur de temp)", tout cela à l'infini.... Néanmoins, si je maintiens le bouton d'humidité, il affiche "humidité (la valeur de hum)".... Si je maintiens le bouton, l'écran continue d'afficher "humidité (la valeur de hum)" et dès que je le lâche le bouton l'écran affiche "température (la valeur de temp)".

Donc j'en viens à répondre à @fdufnews , j'ai fais ce que vous m'avez dis de faire c'est à dire enlever le 5V des boutons, brancher sur la broche 1 le GND de la carte et la broche 4 du bouton la relier soit à D3 soit à D4 selon le bouton mais je pense qu'il y a quelque chose qui va pas avec ce que j'ai pu expliquer là-haut.

Comme les entrées sont configurées en INPUT_PULLUP, elles sont au niveau haut lorsque les boutons ne sont pas appuyés. Donc cette condition est toujours vrai lorsque le bouton est au repos.
Je pense qu'il faudrait que tu changes HIGH par LOW pour tester un appui.

Non, elle les écrit bien. Je voulais vous faire exprimer que la fonction prend un nom de tableau en paramètre ce qui est un pointeur en mémoire vers deux nombres décimaux et que la fonction remplit les 2 cases du tableau puis retourne une valeur (0 ou 1) et si on lit 1 c'est que ça s'est bien passé.

Dans le .h on voit

à la première case du tableau vous avez l'humidité et à la deuxième case vous avez la température.

Oui ça s'est correct. Dans les deux cas la fonction lit les données, mais avec le if() on sait si ça s'est bien passé et donc que l'on a des valeurs cohérentes dans le tableau.

Une fois que vous aurez compris comment fonctionne un bouton (un bon point de départ c'est de lire le tuto d'eskimon sur les boutons - et tous les autres parce que c'est bien fait)

Et pour simplifier votre gestion des boutons, éventuellement utilisez une bibliothèque Button / easyRun ou OneButton ou Toggle ou EasyButton ou Bounce2, ... Il ne manque pas de choix :slight_smile:

@pandaroux007 a écrit un petit [Tutoriel] La bibliothèque OneButton

Perso j'aime bien celle de easyRun, OneButton et Toggle.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.