Alimentation LCD par port numerique

Bonjour

Je pose une question bête peut être car je débute dans ce paradis de l’électronique qu'est l'Arduino
mais j'aimerais savoir si on peut alimenter un LCD via port numérique (puisqu'il délivre du 5V)?
Pourquoi? Parce que j'aimerais activer un LCD en poussant un bouton. Ce bouton passerait à l'état
haut un pin quelconque pour alimenter l’électronique du LCD + son rétroéclairage (tout ça par soucis
d'économie car ma carte sera alimentée par pile ou petit panneau solaire).

Merci à tous!

Bonjour,

L'intensité que peut délivrer une sortie est limitée à 20mA. La consommation de ton LCD avec son rétroéclairage doit excéder 20mA donc tu ne peux l'alimenter directement par une sortie.
Par contre tu peux couper l'alimentation avec un transistor.

Haha? par transistor connecté au 5V de l'arduino? tu aurais un exemple de câblage et de code stp?

Regarde ici par exemple (mais tu trouveras d'autres exemples sur le net)
Tu peux diminuer la résistance de 10K et mettre 4.7K voire 2.2K

Bonjour a tous et merci encore pour votre aide.

Question : existe t il une façon simple de calculer la résistance de base d'un transistor?

J'ai été la dessus mais pas facile ELECTRONIQUE 3D - Le Transistor bipolaire - Calcul polarisation du transistor .

Pour le calcul je dois prendre en compte la consommation du LCD j'imagine, quoi d'autre?

Je ne fabriquerais jamais de circuit à fort courant et toujours autour de l'Arduino, donc je peux toujours appliquer une 10k sans trop me poser de question? voir moins comme le précise la réponse de kamill?

Bonjour,

Personnellement pour des transistors courants tels que 2N2222 ou 2N3904, je prend un gain de 20 pour les calculs.
Supposons que ton LCD consomme 40mA, il faut donc faire passer 40/20=2mA dans la base.
Je néglige la tension emetteur base ce qui me donne une résistance de 5V/0.002A=2500Ω.
Je prend la résistance inférieure ou égale que j'ai à ma disposition.

voilà! CA c'est une règle simple!!! :slight_smile: merci!

Encore moi et mes questions faciles. Mon arduino sera alimenté par pile (car aucune source d'alimentation proche), donc je souhaite consommer le moins possible (d'où nécessité de couper l'alimentation du LCD quand pas utile).
La routine loop contient un delay(60000) car pas utile d'être exécuté plus d'une fois pas minute.
La question que je me pose est : est ce que le delay suffit à économiser un peu d’énergie ou dois je mettre en place le sleep? car dans mon cas, je dois faire une sortie de veille temporisée et donc utiliser un watchdog si j'ai bien compris? Et le watchdog, pas évident à mettre en place et à comprendre....

Tu économisera beaucoup plus la pile si tu mets ta carte en sleep. Avec un delay tu ne baisseras pas la consommation de ta carte.

je pensais aussi... mais du coup as tu déjà mis en place du sleep? as tu un exemple simple?

Il y a les tutos d'hbachetti dans le sous forum Tuto et Cours.

Il y a aussi la bible (en anglais) :

et aussi le moteur de recherche du forum --> icone loupe en haut à droite.
Le sujet à été traité plusieurs fois.

chaud le sleep + watchdog!

super merci encore!

Pour te faciliter la vie tu peux utiliser la librairie low-Power.
Vois l'exemple idleWakePeriodic.

Le temps de sleep maximum avec reveil par le watchdog est de 8s. Il te faut donc l'appeler plusieurs fois.

oui je l'ai vu passer aussi celui là, apparemment bien optimisé en terme de consommation

merci

Oui, mais c'est la carte UNO qui n'est pas optimisée pour la consommation. Le processeur va être mis en veille, mais tout le reste de la carte fonctionne et consomme (régulateur, interface usb, leds ...).

Bonjour

Encore moi et mon loooonnnng projet qui dure et qui traine (ba ouais, j'débute j'ai un peu d'mal ou alors
je me pose trop de questions....).

Je suis sur Arduino nano non officielle (copie Elegoo) et quand j'execute mon loop, je vois
que ma commande delay n'est pas prise en compte, il ne fait aucune tempo. J'ai un delay(5000)
qui ne dure donc pas 5 secondes, elle ne dure rien en fait, il execute mais il n'attend pas, il
continue direct.... une idée du pourquoi?!?

Merci à tous les Arduinistes!

Peut-être qu'en mettant ton code sur le forum ce serait plus facile de comprendre le problème

voici... bon c'est tout con, c'est un capteur DHT11 qui fait clignotter une LED si seuil dépassé
et une interruption via bouton pour envoyer l'info sur LCD 16x2 et dans c'est le delay(5000)
apres le fin_affichage: qui n'est pas pris en compte, je vois bien sur le serial print que ça défile
sans s'arrêter. Pourtant le delay pour le clignottement de la LED, il le prend bien, 1 seconde allumée, 2 secondes éteinte.

/* Capteur d humidite et temperature pour serre a cactus
   declenchement d alerte temperature a moins de +15 degres et a plus de +20 degres
   declenchement d alerte humiditie a + de 90 pourcent
   Cedrik76 05/01/19 */

// Bibliotheque pour capteur et LCD
#include <SimpleDHT.h>
#include <LiquidCrystal.h>

/* Connection du capteur d humidite et temperature
   VCC: 5V or 3V
   GND: GND
   DATA: pin 4 */
int pinDHT11 = 4;
SimpleDHT11 dht11;

// port pour transistor 2N2222
int pin2N2222 = 6;

// declaration variable diverses
int timer1 = 20;      // variable pour duree de clignotement LED en cas d alerte (X3 pour faire 1 minute)
int count = 0;

// Connection de la LED sur le pin 3
int pin_LED = 3;

// Connection du bouton sur le pin 2 (interruption 0 capte signal sur PIN 2)
int bouton = 2;
int boutonInt = 0;

// initialisation des variables du capteur DHT11
byte temperature = 0;
byte humidity = 0;
byte data[40] = {0};

/* Connection de l ecran LCD:
   LCD RS pin to digital pin 7
   LCD Enable pin to digital pin 8
   LCD D4 pin to digital pin 9
   LCD D5 pin to digital pin 10
   LCD D6 pin to digital pin 11
   LCD D7 pin to digital pin 12
   LCD R/W pin to ground
   LCD VSS pin to ground
   LCD VCC pin to 5V
   10K resistor:
   ends to +5V and ground
   wiper to LCD VO pin (pin 3) */
// initialisation des broches utilisees par le LCD
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

void setup() {
  Serial.begin(9600);
  // parametrage du format du LCD
  lcd.begin(16, 2);

  // parametrage du bouton en mode sortie
  pinMode(bouton, INPUT);

  /* parametrage du mode de declenchement (changement d etat du pin 2)
  RISING = detection d un etat bas a l etat haut
    premier parametre a 0 signifie port 2 donc bouton */
  attachInterrupt(boutonInt, affichage, RISING);

  // initiation du port 13 (transistor) +  extinction du LCD
  pinMode(pin2N2222, OUTPUT);
  digitalWrite(pin2N2222, LOW);
  // Initialisation de la LED a l etat bas
  pinMode(pin_LED, OUTPUT);
  digitalWrite(pin_LED, LOW);
}

void affichage() {
  // interruption affichage quand appuie sur bouton poussoir

  Serial.print ("interruption ");

  // extinction LED rouge
  digitalWrite(pin_LED, LOW);

  // alimentation LCD
  digitalWrite(pin2N2222, HIGH);
  lcd.clear();

  //  affichage erreur si probleme de lecture sur le DHT
  byte temperature = 0;
  byte humidity = 0;
  byte data[40] = {0};
  if (dht11.read(pinDHT11, &temperature, &humidity, data)) {
    lcd.clear();
    lcd.setCursor(1, 0);
    lcd.print("Erreur lecture");
    lcd.setCursor(4, 1);
    lcd.print("capteur");
    Serial.print ("Erreur ");
    goto fin_affichage;
  }

  dht11.read(pinDHT11, &temperature, &humidity, data);
  lcd.setCursor(0, 0);
  lcd.print("Temp : ") + ((int)temperature) + " °C";
  lcd.setCursor(0, 1);
  lcd.print("Humi : ") + ((int)humidity) + " %";
  Serial.print ("affichage temp ");

fin_affichage:
  // Tempo d affichage de 5 secondes
  delay(5000);
  Serial.print ("tempo ");

  // effacement LCD + exctinction
  lcd.clear();
  digitalWrite(pin2N2222, LOW);
  Serial.print ("clear lcd ");
}

void Blinking_Red() {
  digitalWrite(pin_LED, HIGH);
  delay(1000);
  digitalWrite(pin_LED, LOW);
  delay(2000);
  Serial.print(temperature);
  Serial.print(humidity);
  count++;
}

void loop() {

  // lecture temperature et humidite
  dht11.read(pinDHT11, &temperature, &humidity, data);

  // releve de valeur du capteur
  // test condition si temperateur inferieure a 15 degres
  if (temperature < 15 ) {
    count = 0;
    while (count < timer1) {
      Blinking_Red();
    }
  }

  // test condition si temperateur superieur a 20 degres
  if (temperature > 20 ) {
    count = 0;
    while (count < timer1) {
      Blinking_Red();
    }
  }

  // test condition si humidite superieure a 90 pourcent
  if (humidity >= 90) {
    count = 0;
    while (count < timer1) {
      Blinking_Red();
    }
  }

  // test condition si capteur remonte les valeurs 0
  if (dht11.read(pinDHT11, &temperature, &humidity, data)) {
    count = 0;
    while (count < timer1) {
      Blinking_Red();
    }
  }

}

Bonjour,

Tu fais l'affichage en interruption. Les interruptions sont masquées, donc millis() et delay() ne fonctionnent pas.

en fait ça fonctionne si je mets un delais genre 200 000.... là ça tient 5 ou 6 secondes.

Du coup, comment faire du delay lors d'une interruption? c'est quoi la solution?