MODOP – Mise en Veille Atmega328P

#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();
}

Views: 5

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *