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).
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.
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?
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.
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....
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 ...).
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?!?
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();
}
}
}