Allumer/Éteindre une écran lcd (LCM1602C)

Bonjour à tous, bon c’est mon premier post sur ce forum même si c’est pas la première fois que j’y vais pour glaner quelques infos :slight_smile:

Donc je vous explique, j’ai pour objectif de créer une sorte de petite station météo (oui c’est très original) et là j’ai déjà le montage et le code pour avoir la température et l’humidité.
mais j’aimerais pouvoir grâce à un bouton poussoir pouvoir éteindre ou allumer mon système.
Le truc c’est que je sais pas trop sur quel pin brancher le bouton.

J’ai mis un schéma de mon montage en pièce jointe.

Et voici le code que j’ai bricolé, bon c’est certainement pas propre mais c’est fonctionnel, j’aimerais savoir ou doit rentrer la partie du code pour le bouton, dans le setup ou le loop?
Il y’a quelques parties du code à ignorer ( entre ./* et .*/ ) c’est des essais infructueux que j’ai fais.

#include <DHT.h>
#define DHTPIN 8
#define DHTTYPE DHT22
#include <LiquidCrystal.h>
// Initialisation du capteur
DHT dht(DHTPIN, DHTTYPE);


// Réglage du LCD
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

/*const int switchPin = 6;
int switchState = 0;
int prevSwitchstate = 0;*/

// Réglage constantes
int const sensorPin = A0;
int sensorVal;
//int switchState = 0;

// Partie configuration
void setup() {

  /*config bouton
  pinMode(6,INPUT);

   //partie bouton
  switchState = digitalRead(6);
  if (switchState == LOW) {
   lcd.noDisplay();  
  }
  else { 
    lcd.display();
  }*/


  //démarrage du DHT
  dht.begin();

  // Nombres de colonnes et lignes du LCD
  lcd.begin(16, 2);
 
  // Au démarage
  lcd.clear();
  lcd.setCursor(3,0);
  lcd.print("BIENVENUE");
  delay(3500);
  lcd.clear();
  lcd.setCursor(1,0);
  lcd.print("INITIALISATION");
  lcd.setCursor(2,1);
  lcd.print("Patientez...");
  delay(4250);
  lcd.clear();
}

void loop() {

  
  
  delay(2000);
  float h = dht.readHumidity();
  float t = dht.readTemperature(); 
  //float f = dht.readTemperature(true);
  if (isnan(h) || isnan(t) /*|| isnan(f)*/) {
    lcd.print("ERREUR CAPTEUR");
    return;
  }

  
  lcd.setCursor(0,0);
  lcd.print("Humi: ");
  lcd.print(h);
  lcd.print(" %");
  lcd.setCursor(0,1);
  lcd.print("Temp: ");
  lcd.print(t);
  lcd.print(" C*");   
}

Voilà voilà, merci d’avance à ceux qui pourront m’aider!

Quand vous dites éteindre, je suppose que c’est éteindre juste l’écran - sinon suffit d’enlever la prise de votre arduino :slight_smile:

donc si vous voulez pouvoir cesser d’alimenter le LCD, il faut que ça puisse se faire à tout moment et donc ça doit être dans la boucle (bien sûr avec déclaration du bouton dans le setup() et plutôt en INPUT_PULLUP). Il vous faudra une variable d’état pour vous souvenir éventuellement si l’écran est allumé ou éteint et décider à l’appui du bouton quoi faire (mais en pratique vous pouvez vos en passer puisqu’il suffit d’inverser la valeur d’une PIN de commande).

ensuite vous jouez avec soit Vcc, soit Enable. vous pouvez aussi simplement jouer sur le rétro-éclairage

votre code a un bug que vous découvrirez si la température est à 10 degrés et tombe à 9 ou idem si l’humidité passe de 100% à 90% ou de 10% à 9% → vous aurez un caractère parasite (* ou %) qui va trainer à l’écran.

petite recommandation, ce n’est pas la peine de lire la température 200 fois par secondes, ça va faire clignoter votre LCD pour pas grand chose… prévoyez une tempo (en utilisant millis() pas avec un delay()) pour faire la mise à jour toute les 5 secondes par exemple.

et puisque que vous écrivez toujours "Humi: " et "Temp: " au même endroit, vous pourriez ne les écrire qu’une fois dans le setup et placer le curseur plus loin pour écrire la valeur. ça ira plus vite et moins de sensation de clignotement

Il suffit peut-être de faire un "clear()" pour faire semblant d'éteindre l'écran s'il s'agit seulement de ne plus rien afficher (?)

S'il s'agit d'éteindre uniquement le rétro-éclairage (la lumière qui éclaire l'écran) il faut prévoir de pouvoir couper l'alimentation de la diode associée (PINs A/K du connecteur). Dans ce cas, et vu que c'est une diode, au lieu de l'alimenter directement par le +5V tu peux utiliser une sortie numérique sur l'anode (A) et contrôler ainsi le retro-éclairage. Le mieux étant tout de même de passer par un transistor qui jouerait le rôle de "relais de puissance" pour commander l'alimentation de cette LED.

Sinon, comme le suggère J-M-L, un interrupteur au niveau de l'alimentation de l'arduino permettra de l'éteindre "pour de vrai".

Enfin, pour rejoindre ce que J-M-L tente de t'expliquer, dans ce tutoriel tu trouveras comment gérer un affichage partiel où seulement les valeurs sont mises à jour plutôt que tout l'affichage.

Bonsoir !
Merci beaucoup pour ces réponses rapides, avec seulement 2 messages je vois que j'ai pas mal de truc à améliorer ce qui est super bien. :smiley:
Je vais donc essayer d'avancer et de résoudre mes problèmes avec ces infos et si je bloque vraiment, je reviendrais ici.

Bonsoir, me revoilà!

Bon alors avec vos messages, j’ai surtout modifié le “*” en “°” pour que ce soit plus clair pour les Celsius, mais je n’ai pas changé le delay() parce que je n’ai aucun clignotement (bizarre?).
J’ai aussi décidé de ne pas traquer le bug avec les caractère parasite, car il y’a peu de chance que ces conditions soient remplis là ou j’habite ( mais j’essaierais tout de même de le résoudre plus tard).

D’après vos messages, je pense que je préférais utiliser un bouton poussoir plutôt qu’un transistor.
C’était la première fois qu’on me parlait de transistor comme bouton et donc je me suis renseigné et si j’ai bien compris, il n’y a pas d’interface tangible, c’est que par le code non?

Ensuite je me demande ou placer le bouton, j’ai essayé de le brancher au A du lcd, celui-ci devient sombre (rétroéclairage éteint) mais les caractères se voyaient encore, j’ai donc combiné ça avec un display() et noDisplay() et là ça fonctionne. Je me demandais donc si il n’y avait pas une manière de regrouper les deux.

Le bouton que j’ai mis fonctionne mais il y’a plusieurs problèmes :

  1. Il est long à réagir, environ 0.75s.
  2. Je voudrais que une fois que j’ai appuyé sur le bouton l’écran s’éteigne et qu’un nouvel appui l’allume. Parce que pour l’instant je suis obligé de rester appuyé pour agir sur le lcd.

Voici mon code :

#include <DHT.h>
#define DHTPIN 8
#define DHTTYPE DHT22
#include <LiquidCrystal.h>
// Initialisation du capteur
DHT dht(DHTPIN, DHTTYPE);


// Réglage du LCD
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);



// Réglage constantes
int const sensorPin = A0;
int sensorVal;
int switchState = 0;

// Partie configuration
void setup() {

  pinMode(6, INPUT);                 //TRAVAIL ICI
  pinMode(7, OUTPUT);
 //démarrage du DHT
    dht.begin();

  // Nombres de colonnes et lignes du LCD
  lcd.begin(16, 2);
  digitalWrite(7, HIGH); // allumage du rétro-éclairage au début
  // Au démarage
  lcd.clear();
  lcd.setCursor(3,0);
  lcd.print("BIENVENUE");
  delay(3500);
  lcd.clear();
  lcd.setCursor(1,0);
  lcd.print("INITIALISATION");
  lcd.setCursor(2,1);
  lcd.print("Patientez...");
  delay(4250);
  lcd.clear();
}

void loop() {

  switchState = digitalRead(6);              // ET ICI
  if (switchState == LOW) {
    digitalWrite(7, HIGH); 
    lcd.display();  }
   else {
    digitalWrite(7, LOW);
     lcd.noDisplay(); }
  
  delay(2000);
  float h = dht.readHumidity();
  float t = dht.readTemperature(); 
  //float f = dht.readTemperature(true);
  if (isnan(h) || isnan(t) /*|| isnan(f)*/) {
    lcd.print("ERREUR CAPTEUR");
    return;
  }

  
  lcd.setCursor(0,0);
  lcd.print("Humi: ");
  lcd.print(h);
  lcd.print(" %");
  lcd.setCursor(0,1);
  lcd.print("Temp: ");
  lcd.print(t);
  lcd.print(" C");   
  lcd.write(223);
}

Voilà voilà, je vous remercie de votre aide ! :slight_smile:

Pour apprendre à gérer un bouton c'est par ici

Sinon, lorsque je parlais de transistor ce n'était pas pour l'utiliser comme un bouton mais pour l'utiliser comme un "relais de puissance".

Sinon, pour couper le jus/alimentation, on parle plutôt d'interrupteur que de bouton et c'est en amont qu'il est branché, sans une gestion particulière par l'Arduino.

Ah d'accord, donc du coup pour allumer/éteindre ma carte et mon lcd je peux me servir d'une prise avec interrupteur, tout simplement?

Un truc comme ça : Renkforce 778994 Prise intermédiaire commutable 1 pôle argent | Conrad.fr

oui, ca va marcher une prise comme ca, en effet.

Bon bah la solution était vraiment simple en fait, je sais pas pourquoi j'ai voulu me casser la tête avec des boutons etc ...

Merci beaucoup pour votre aide en tous cas !

Bonne soirée :slight_smile:

"Eteindre un écran" ce peut vouloir dire plein de choses, dont "éteindre tout", mais pas forcément...
Lorsque tu poses une question il faut être certain que de l'autre coté on peut bien comprendre ce que tu veux dire, sinon nous allons analyser toutes les possibilités et donc ca va être difficile pour toi même de faire le tri... :wink:

C'était déjà la question / réponse que je faisais dans la réponse #1

J-M-L:
C'était déjà la question / réponse que je faisais dans la réponse #1

Je sais bien, mais visiblement ca n'a pas été compris comme ca... :confused:

Hello there!
Bon je fais une réponse bien tardive, mais éteindre un LCD m’intéressait également pour mon projet actuel (du délestage solaire… bref) et je voulais donc apporter ma petite contribution.

Pour ma part, je ne souhaitais pas couper l’alimentation du système complet mais juste celle de l’écran. Et chose surprenante, si je coupe l’alimentation du LCD uniquement, ça reset l’attiny (puisque j’utilise un attiny85, mais c’est le même bin’s.)
Bref, tout ça pour dire qu’en faisant un `

Non seulement j’éteins mon écran et je garde mon système actif comme souhaité, mais également les données qui étaient à l’écran avant extinction! (c’est peut-être un cas particulier mais je n’ai pas mis de commande qui permettent de réafficher ce qui était à l’écran avant extinction)

pour réactiver l’affichage, c’est comme dans le code de SamRow

Et s’il veut en plus réactiver l’éclairage

Attention les commandes peuvent légèrement varier suivant les librairies…

L’avantage, c’est que je peux allumer/éteindre mon écran avec un évènement (bouton poussoir ou alerte charge haute) ou un timer.

Bref, si ça peut en aider d’autre…

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