Circuit basse consommation

Je voudrais utiliser tout le temps un circuit Arduino que j'ai conçu mais il faudrait que le circcuit puisse
s'activer et se désactiver quasiment completement.

Sur un LCD l'heure est affichée, la température et l'humidité aussi. Avec des boutons poussoirs on peut régler et activer une minuterie qui sonnera avec un buzzer. Un autre bouton poussoir permet d'enregistrer une température et d'afficher la différence par rapport à la température actuelle

Comment faire pour arreter de lire et d'envoyer des données ?

voir code ci dessous: Si "actDesact" fait 0 et ce que l'arduino dépensera de l'énergie à lire "boutonM"?

if (actDesact ==1) {
if (digitalRead(boutonM) ==1) {
 (instructions)
}

Peut on lire des boutons poussoirs dans des analogs?
Un arduino pro mini est il adapté pour ce genre de circuit?

Le code entier:

#define DHT11PIN 5 //capteur DHT11

#include <dht11.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 8, 9, 10,11,12);  //écran LCD
dht11 DHT11;
int tempEnregistree;  
int actualAugmentation=0;
boolean flag;
int boutonTemp=6;  //bouton poussoir pour enregistrer une temperature
int heuresM;       //heure à laquelle sonnera la minuterie
int minutesM;     //mintute à laquelle sonnera la minuterie
int minutes;      // minutes actuelles
int heures;          //heure actuelle
int boutonAppel=13;      //bouton pour activer la minuterie
int boutonMinutes=2;     // réglage des minutes de la minuterie
int boutonHeures=3;      //réglage des heures de la minuterie
int allumage=0;          //1 ou 0 si minuterie est activée ou pas
unsigned long Depart;


void setup() {
 flag=0;               // minuterie désactivée
 Serial.begin(9600);
 pinMode(boutonMinutes, INPUT_PULLUP);  // boutons poussoirs
pinMode(boutonAppel, INPUT_PULLUP);
pinMode(boutonHeures, INPUT_PULLUP);   
pinMode (boutonTemp, INPUT_PULLUP);
 
 minutes=03 ; //réglage des minutes et de l'heure avant de téléverser
 heures=18;
 

 lcd.begin(16, 2);   

 lcd.setCursor(3, 0);
 lcd.print(":");       // deux points pour séparer heures et minutes (ex: 01:45)

uint8_t chk = DHT11.read(DHT11PIN);
  lcd.setCursor(7, 0);
  lcd.print(DHT11.temperature, DEC);

  lcd.setCursor(9, 0);
  lcd.print("C");          //prise de temperature et d'humidité et affichage sur LCD

  lcd.setCursor(11, 0);
  lcd.print(DHT11.humidity, DEC);
  lcd.print("%");


 
 Depart=millis();

}

void loop() {
 

  if((millis()-Depart)>=60000) { //toutes les minutes
    
    minutes=minutes+1;           //minutes+1
      uint8_t chk = DHT11.read(DHT11PIN);
  lcd.setCursor(7, 0);
  lcd.print(DHT11.temperature, DEC);

  lcd.setCursor(9, 0);
  lcd.print("C");                //prise de temperature et humidité toutes les minutes + affichage

  lcd.setCursor(11, 0);
  lcd.print(DHT11.humidity, DEC);
  lcd.print("%");
    
   Depart=millis();  //etc
  }
  


  

  if (minutes <=9) {
    lcd.setCursor(4, 0);
    lcd.print("0");       //affichage des minutes propre (14:08 et pas 14:8)
    lcd.setCursor(5, 0);
    lcd.print(minutes);

  
  }
   else  {
    lcd.setCursor(4,0);
    lcd.print(minutes);
   }
  
  if (heures <=9) {
    lcd.setCursor(1, 0);
    lcd.print("0");        //affichage des heures plus propre
    lcd.setCursor(2, 0);
    lcd.print(heures);
  }

  else {
    lcd.setCursor(1,0);
    lcd.print(heures);
  }




  if (minutes ==60) {   //si 60 minutes se sont écoulées
    minutes=0;         // minutes reviennent à 0
    heures=heures+1;   //les heures augmentent de 1
  }

  if (heures==24){   //pareil pour les heures
    heures=0;
    
}


if (minutesM ==60) {  //pareil que pour l'heure normale même chose pour tout
    
    minutesM=0;
  }

  if (heuresM==24){
    heuresM=0;
    
  }
 
 
 if (minutesM <=9) {
    lcd.setCursor(3, 1);
    lcd.print("0");
    lcd.setCursor(4, 1);
    lcd.print(minutesM);

  
  }
   else  {
    lcd.setCursor(3,1);
    lcd.print(minutesM);
   }
  
  if (heuresM <=9) {
    lcd.setCursor(0, 1);
    lcd.print("0");
    lcd.setCursor(1, 1);
    lcd.print(heuresM);
  }

  else {
    lcd.setCursor(0,1);
    lcd.print(heuresM);
  }
 if (digitalRead(boutonMinutes)==LOW) {      
  if (minutesM<1000) minutesM++;            //augmente les minutes de la minuterie à chaque appuie de bouton puis relaché
  while((digitalRead(boutonMinutes)==LOW));
 }
 
 if (digitalRead(boutonAppel) ==0){
  allumage=1;                         //activation de la minuterie
  
 }


if (digitalRead(boutonHeures) ==LOW){
if (heuresM<32767) heuresM++;            //heures +1
while((digitalRead(boutonHeures)==LOW));
}
if (allumage==1) {              //si la minuterie est activée
 if (heuresM==heures) {         // si l'heure pour la minuterie est égale à celle de l'heure actuelle
  if (minutesM==minutes) {      // si les minutes pour la minuterie sont égales à celles des minutes actuelles
    allumage=0;                 //minuterie désactivée
    digitalWrite(4, HIGH);
    delay(300);
    digitalWrite(4, LOW);      //sonnerie avec un buzzer
    delay(300);
    digitalWrite(4, HIGH);
    delay(300);
    digitalWrite(4, LOW);
    delay(300);
    digitalWrite(4, HIGH);
    delay(300);
    digitalWrite(4, LOW);
    delay(300);
    digitalWrite(4, HIGH);
    delay(300);
    digitalWrite(4, LOW);
    delay(300);
    allumage==0;
  }
 
  
 
 }

}

if (digitalRead(boutonTemp) ==0) {
  tempEnregistree=DHT11.temperature;
  flag= !flag;                            //enregistrement des tempéraures 
  if (flag==1) {
    DHT11.temperature=tempEnregistree;
    lcd.setCursor(7,1);
    lcd.print("+");
 
  }

  if (flag==0) {
    lcd.setCursor(7,1);   //ne plus afficher la différence si la personne rappuie sur le bouton
    lcd.print("   ");
  }
while((digitalRead(boutonTemp) ==0));
}


if (flag==1) {
  actualAugmentation=(DHT11.temperature)-tempEnregistree;
  lcd.setCursor(8,1);                                          //affichage de la température actuelle moins la température enregistrée 
  lcd.print(actualAugmentation);
}

}

Est ce que c'est assez clair ? Vous comprenez?

Peut on lire des boutons poussoirs dans des analogs?

Une pin analogique peut être utilisée comme pin digitale.

digitalRead(A0);

Un arduino pro mini est il adapté pour ce genre de circuit?

Pour quoi faire ? A partir du moment où tu utilises un LCD, c'est un peu foutu d'un point de vue énergie.
Quelle alimentation ?
Quelle autonomie espères-tu ?

En fait le LCD devrait être allumer très peu, je voudrait qu'il y ait un bouton poussoir qui l'active (avec aussi le DHT11 et les autres boutons poussoirs) du coup le lcd ne sera que allumé quelque secondes quand la personne voudra regarder l'heure...
Normalement ça ne devrait pas consommer beaucoup mais je sais pas comment faire ( questions que j'ai posées)

Il faut utiliser le low-power. Le plus simple est d'utiliser cette librairie :

Ensuite il faut activer une interruption sur la pin bouton qui sert à réveiller l'ARDUINO.

De la lecture sur la PRO MINI : arduino-pro-mini-basse-consommation

Mais encore une fois avec un LCD, aucune chance de faire du low-power.
Il faudrait couper son alimentation et son backlight.

Ensuite si tu réponds aux questions précédentes ça ira mieux pour aider.

Pour l'alimentation je pense utiliser une pile 4,5 V.
Pour bloquer l'alimentation un transistor devrait faire l'affaire.
Et pour l'autonomie, si ça peut tenir plusieurs mois...

Comment fait on pour l'éveiller à nouveau ?

Est ce que cette fonction bloquera la sonnerie du buzzer ou ne fera pas marcher l'heure actuelle ?

Comment fait on pour l'éveiller à nouveau ?

powerDownWakeExternalInterrupt.ino

Le sleep mode affecte l'horloge du processeur, donc millis().
De toutes façons tu ne peux pas sérieusement compter sur l'horloge interne pour gérer l'heure. La dérive est trop importante.
Il te faut un RTC : DS3231.

OK c'est fait, j'utilise un DS1307, tout marche, merci à toi.

hbachetti:
powerDownWakeExternalInterrupt.ino

Je nais pas bien compris? Juste a mettre ce code et relier un bouton en pin 2 ?

En combien de temps va se décharger une pile de 4,5 v si on alimente seulement un RTC?
Faut il déconnecter la LED?
Si on le laisse marcher avec sa pile seulement, en combien de temps se déchargera t-elle?

Je nais pas bien compris? Juste a mettre ce code et relier un bouton en pin 2 ?

Oui. La fonction LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF); endort la processeur et il sera réveillé par l'interruption.

Un RTC ne consomme pas grand chose si tu le laisse tranquille la plupart du temps.
DS1307 : 200µA en stand-by.

La LED de la PRO MINI doit être virée (0.5mA de moins en conso).

PRO-MINI (8MHz, 3.3V) :
500µA si tu laisses la LED
70µA si tu laisses le régulateur
1.5µA si tu enlèves les deux

Pile 4.5V : dépend de la capacité. Cela peut aller jusqu'à > 6000mAH.
Avec 4.5V le montage consommera plus qu'avec 3.3V.

Mais 4.5V est la tension mini du DS1307. Mauvais choix.
Un DS3231 fonctionne avec 2.3V, il est plus précis et il consomme moins.

Avec une PRO MINI + DS3231 : une batterie LITHIUM-ION 3.7V serait idéale, et beaucoup moins grosse.

Le LCD, le DHT11 et le buzzer peuvent etre alimentés en 3.3 volts?

Du coup tu me conseille aussi de prendre un DS 3231 ?

DHT11

Buzzer : probablement mais il vaut mieux essayer.

LCD : probablement pas. Tout dépend du modèle. En général le contraste n'est pas réglable de manière optimale en 3.3V.

Un petit OLED serait certainement plus adapté :

Sur mon LCD, quand on deconnecte le +5v et le GND , tout s'éteind (c'est normal) mais quand je les remets le lcd mets des points d'interrogation qui défilent... On appuie sur reset et ça remarche.
Est ce que ça fera la même chose sur un OLED ?

Pour info, le buzzer marche en 3.3 volt mais le lcd grésille, des chiffres inutiles apparaissent...

Sur mon LCD, quand on deconnecte le +5v et le GND , tout s'éteind (c'est normal) mais quand je les remets le lcd mets des points d'interrogation qui défilent... On appuie sur reset et ça remarche.

Il faut probablement le réinitialiser : lcd.begin(16, 2);

Est ce que ça fera la même chose sur un OLED ?

Certainement. La solution pour s'en sortir est la même.

Sincèrement, étant donné la facilité de mise en œuvre d'un OLED I2C et sa capacité à fonctionner avec des processeurs 3.3V ou 5V (mais toujours alimenté en 3.3V), je ne me poserais pas la question.

Jette un œil ici : RitonDuino: Afficheur OLED SSD1306 : comparons

Rien que le petit indicateur de charge batterie fait la différence :

Le LCD alphanumérique appartient au passé, et c'est très moche.

Je vais plutôt utiliser un LCD 3,3 v, je suis encore débutant et ça a l'air assez compliqué à programmer.

J'ai vu que l'arduino pro mini avait besoin d'un FTDI, ce produit là conviendrais-il?

Sur le forum on a en général moins de problèmes avec les OLED qu'avec les LCD alphanumériques.
Mais à ta guise si tu trouves un modèle 3.3V. Je n'en connais pas.

J'ai vu que l'arduino pro mini avait besoin d'un FTDI, ce produit là conviendrais-il?

N'importe lequel pourvu qu'il soit compatible 5V 3.3V.

Personnellement je le trouve plutôt cher.

AMAZON

ALIEXPRESS

Je le prenais plutot en fait car il avait une prise USB, mais comme je vais acheter un arduino nano il semble que c'est le meme fil pour relier à l'ordinateur, je vais prendre celui que tu me propose.

Le LCD j'ai trouvé sur Ebay

LCD :

  • Tension de travail: 3,3 V; contraste réglable avec un potentiomètre 50K à l'intérieur
  • VDD: connecté à une alimentation + 5V

C'est ambigu ...

Bonjour

Au vu de la face arrière de l'afficheur (si la photo correspond réellement au produit vendu) il est peu probable qu'on voie quelque chose avec une alimentation de 3,3V !!
L'afficheur accepte des niveaux 3,3V sur ses entrées de données et de contrôle, c'est tout.

Pour cela il faudrait que le circuit intégré ICM 7660 (flèche sur la photo) soit câblé en U3 pour créer localement une petite tension négative pour le contraste.
pas 3V3.png
Sans cette tension le contraste n'est pas suffisant pour assurer la visibilité de ce type d'afficheur LCD alphanumérique 1602 alimenté sous 3,3V
Le panneau LCD a besoin de signaux d'amplitude 5V mini pour une visibilité correcte,
par exemple Vdd- Vss = 5V -0V ou 3,3V - (-1,7V)
décalage.png

pas 3V3.png

décalage.png

Voilà un modèle réellement équipé pour donner quelque chose de visible sous 3,3V
https://fr.aliexpress.com/item/32841179402.html?spm=a2g0o.productlist.0.0.1391c750RPwstx&algo_pvid=0c23175d-0dd6-4a05-983e-ee19b5820923&algo_expid=0c23175d-0dd6-4a05-983e-ee19b5820923-7&btsid=824f4da9-88fa-4244-91a1-88232a41b4d4&ws_ab_test=searchweb0_0,searchweb201602_10,searchweb201603_55
ok3V3.png

ok3V3.png