Accueil > Arduino, Matériel > Sonde de température et consommation d’énergie

Sonde de température et consommation d’énergie

Le but de cet article est de commencer à tester une sonde à partir d’un Arduino pro mini 8 Mhz et d’un capteur de température et d’hygrométrie DHT22; ensuite nous verrons comment baisser la consommation de la sonde.

Pour l’utilisation du capteur DHT22, je me suis appuyé sur la documentation d’Adafruit http://learn.adafruit.com/dht/overview.

Mais attention n’utilisez pas la librairie fournie par Adafruit car elle ne fonctionne pas pour ce modèle de carte. Télécharger la librairie suivante : https://github.com/ringerc/Arduino-DHT22

Le câblage sera le suivant :

image

Pour l’alimentation et le transfert du programme je vais utiliser le convertisseur FTDI de chez DFR Robot qui supporte le 5v et 3.3v.

Pour la partie test, je vais effectuer une mesure toutes les 60 secondes environ.

Le premier programme sans optimisation sera le suivant :

#include <DHT22.h>

#define DHT22_PIN 2 //communication avec le capteur DHT22
#define DHT22_POWER 5 //alimentation du capteur DHT22

DHT22 dht22(DHT22_PIN); //création instance dht

void setup()
{
  pinMode(DHT22_POWER, OUTPUT);
  Serial.begin(9600);
}

void loop ()
{
  digitalWrite(DHT22_POWER, HIGH); //alimente le capteur DHT22
  delay(5000);
  DHT22_ERROR_t errorCode;
  errorCode = dht22.readData();
  switch(errorCode)
  {
    case DHT_ERROR_NONE:
      Serial.print(dht22.getTemperatureC());
      Serial.print("C ");
      Serial.print(dht22.getHumidity());
      Serial.println("%");
      break;
    case DHT_ERROR_CHECKSUM:
      Serial.println("check sum error ");
      break;
    case DHT_BUS_HUNG:
      Serial.println("BUS Hung ");
      break;
    case DHT_ERROR_NOT_PRESENT:
      Serial.println("Not Present ");
      break;
    case DHT_ERROR_ACK_TOO_LONG:
      Serial.println("ACK time out ");
      break;
    case DHT_ERROR_SYNC_TIMEOUT:
      Serial.println("Sync Timeout ");
      break;
    case DHT_ERROR_DATA_TIMEOUT:
      Serial.println("Data Timeout ");
      break;
    case DHT_ERROR_TOOQUICK:
      Serial.println("Polled to quick ");
      break;
  }
  delay(60000);
}

Le capteur est toujours alimenté et la consommation est de 4.3 mA au repos et passe à 5.7 mA lors de la mesure.

Le second programme va désactiver l’alimentation du capteur pendant 60 secondes et l’alimenter juste le temps d’effectuer une mesure :

#include <DHT22.h>

#define DHT22_PIN 2 //communication avec le capteur DHT22
#define DHT22_POWER 5 //alimentation du capteur DHT22

DHT22 dht22(DHT22_PIN); //création instance dht

void setup()
{
  pinMode(DHT22_POWER, OUTPUT);
  Serial.begin(9600);
}

void loop ()
{
  digitalWrite(DHT22_POWER, HIGH); //alimente le capteur DHT22
  delay(5000);
  DHT22_ERROR_t errorCode;
  errorCode = dht22.readData();
  switch(errorCode)
  {
    case DHT_ERROR_NONE:
      Serial.print(dht22.getTemperatureC());
      Serial.print("C ");
      Serial.print(dht22.getHumidity());
      Serial.println("%");
      break;
    case DHT_ERROR_CHECKSUM:
      Serial.println("check sum error ");
      break;
    case DHT_BUS_HUNG:
      Serial.println("BUS Hung ");
      break;
    case DHT_ERROR_NOT_PRESENT:
      Serial.println("Not Present ");
      break;
    case DHT_ERROR_ACK_TOO_LONG:
      Serial.println("ACK time out ");
      break;
    case DHT_ERROR_SYNC_TIMEOUT:
      Serial.println("Sync Timeout ");
      break;
    case DHT_ERROR_DATA_TIMEOUT:
      Serial.println("Data Timeout ");
      break;
    case DHT_ERROR_TOOQUICK:
      Serial.println("Polled to quick ");
      break;
  }
  digitalWrite(DHT22_POWER, LOW); //arrêt de l’alimentation du DTH22
  delay(60000);
}

La consommation est de 4.3 mA au repos. Donc on ne gagne rien en arrêtant l’alimentation du capteur DHT22.

Maintenant je vais m’appuyer sur l’excellent article de Nick Gammon pour optimiser la consommation http://www.gammon.com.au/forum/?id=11497. Je vous conseil de le lire.

Le programme sera le suivant :

#include <DHT22.h>
#include <avr/sleep.h>
#include <avr/wdt.h>

#define DHT22_PIN 2 //communication avec le capteur DHT22
#define DHT22_POWER 5 //alimentation du capteur DHT22

DHT22 dht22(DHT22_PIN); //création instance dht

ISR (WDT_vect)
{
  wdt_disable(); //désactive le watchdog
}

void mywatchdogenable()
{
  MCUSR = 0;
  WDTCSR = _BV (WDCE) | _BV (WDE);
  WDTCSR = _BV (WDIE) | _BV (WDP3) | _BV (WDP0); //délai de 8 secondes
  wdt_reset();
  ADCSRA = 0; //désactive ADC
  set_sleep_mode (SLEEP_MODE_PWR_DOWN);
  sleep_enable();
  MCUCR = _BV (BODS) | _BV (BODSE);
  MCUCR = _BV (BODS);
  sleep_cpu();
  sleep_disable();
}

void setup()
{
  pinMode(DHT22_POWER, OUTPUT);
  Serial.begin(9600);
}

void loop ()
{
  digitalWrite(DHT22_POWER, HIGH); //alimente le capteur DHT22
  delay(5000);
  DHT22_ERROR_t errorCode;
  errorCode = dht22.readData();
  switch(errorCode)
  {
    case DHT_ERROR_NONE:
      Serial.print(dht22.getTemperatureC());
      Serial.print("C ");
      Serial.print(dht22.getHumidity());
      Serial.println("%");
      delay(500);
      break;
    case DHT_ERROR_CHECKSUM:
      Serial.println("check sum error ");
      break;
    case DHT_BUS_HUNG:
      Serial.println("BUS Hung ");
      break;
    case DHT_ERROR_NOT_PRESENT:
      Serial.println("Not Present ");
      break;
    case DHT_ERROR_ACK_TOO_LONG:
      Serial.println("ACK time out ");
      break;
    case DHT_ERROR_SYNC_TIMEOUT:
      Serial.println("Sync Timeout ");
      break;
    case DHT_ERROR_DATA_TIMEOUT:
      Serial.println("Data Timeout ");
      break;
    case DHT_ERROR_TOOQUICK:
      Serial.println("Polled to quick ");
      break;
  }
  digitalWrite(DHT22_POWER, LOW); //arrêt de l’alimentation du DTH22
  for (int i=0; i < 8; i++) //mise en veille pendant 64 secondes
    mywatchdogenable();
}

La consommation est de 0.26 mA pendant la mise en veille de 64 secondes. Bien sûr on pourrait réduire encore la consommation en bidouillant l’Arduino mini pro en faisant en sorte de ne plus alimenter la LED rouge (témoin d’alimentation).

Voici quelques capacités de piles et batteries en mA Heure :

image

En prenant par exemple une batterie Li-Ion de 4400 mA Heure, on pourrait tenir 4400 / 0.26 = 17000 heures soit 705 jours. Je vais certainement partir sur une batterie et un panneau solaire pour alimenter ma sonde. A voir !!!

Publicités
Catégories :Arduino, Matériel Étiquettes : , ,
  1. David
    31/12/2014 à 14:46

    Bonjour, merci pour votre sujet qui me rend un fier service. Débutant dans le domaine, j’ai lu pas mal de choses concernant la mise en veille de nos chers arduinos mais je n’ai pas tout compris.
    Un bon exemple est plus parlant.
    Je vais de ce pas faire des essais !

  2. 15/02/2015 à 18:54

    Bonjour,
    J’ai fait plusieurs essais avec différent programme mais j’ai toujours la même erreur : DHT_ERROR_SYNC_TIMEOUT
    J’utilise une carte arduino nano et un DHT22. Je ne sais pas à quoi correspond cette erreur un problème de fréquence ?
    Merci de votre aide.
    Michel

  3. 16/02/2015 à 13:02

    Bonjour,
    Mon montage fonctionne bien quand j’alimente directement le capteur DHT22 mais pas quand je coupe l’alimentation en branchant le capteur sur l’arduino ?
    Une idée
    Merci
    Michel

  4. Anthony
    25/03/2015 à 15:21

    Bonjour,

    J’ai été très intéressé par cet article et celui en référence de Gammon. J’ai comme projet de fabriquer un très simple capteur T°/H sur pile 9V avec un RTC et enregistrement sur SD. Le tout est destiné à être disposé sur site pendant plusieurs mois. L’économie d’énergie est donc primordiale.

    Gammon dit au début de son article que les optimisations ne sont valables que si on utilise l’Atmega328 seul. Le régulateur de tension 5V semble être à l’origine des plus grosses pertes d’énergie. Evidemment celle-ci est nécessaire pour alimenter avec une pile 9V. Du coup, vaut-il mieux utiliser le régulateur de la carte ou bien un régulateur externe (avec moins de pertes ?) ?

  5. 07/12/2015 à 12:20

    Bonjour,
    Merci pour cet article très intéressant. Faisant mes premiers pas dans l’électronique et ayant entre autres objectifs de bourrer mon logement de capteurs peu énergivores, cet article est une bonne base pour moi ! Une question néanmoins, relative à la conclusion… Cette idée de batterie + cellule photovoltaïque m’avait déjà traversé l’esprit. Mon niveau étant ce qu’il est, je ne sais aujourd’hui pas du tout comment ce système peut être mis en place pour alimenter mes gadgets. Auriez-vous une source d’info accessible aux néophytes sur ce sujet ? Ou même un article publié ici même que je n’aurait pas vu ?

    Merci d’avance
    Seb

  1. No trackbacks yet.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :