v žití ze mě občas vypadne i to, z čeho mohou mít užitek i jiní a tady Vám to chci dát

DHT11 code for Arduino

January 06, 2017 v HAM, Elektro od Michal

Doma celkem zápasím s vlhkostí a na začátku je vždy dobré poznat svého nepřitele. V mém případě ho změřit a to po celém bytě. Pro to jsem si koupil hromádku teplotních sensorů s měřením vlhkosti DHT11. Abych měl za málo peněz hodně legrace, zvolil jsem pro měření modulek Arduino Pro Mini.

Abych neobjevoval znovu Ameriku, zagooglil jsem abych zjistil jestli už něco neexistuje. A ono existuje od Sunfoundera verze pro Rapsbery-Pi. Zaradoval jsem se a kód šel po malém štouchnutí hned přeložit a spustit, jenže to bylo asi tak vše. Při kouknutí na metodu měření vyšlo najevo že tento algoritmus může běžet s MCU cca na 80 Mhz a výše (což je pro Raps.-Pí s 1,2 Ghz úplná malina), ale pro Arduino s 8 Mhz tudy cesta nevede.

Bez kecání ten správný způsob je tady. Lze použít libovolný datový pin, takže k jednomu Pro-Mini lze připojit zároveň klidně 10 sensorů DHT11

/* DHT11 sensor library */

/* MF 2017 www.emuf.cz  */

void setup() {

  // put your setup code here, to run once:

  Serial.begin(9600);

}

 

#define DHTPIN  9 /* Data pin of DHT11 */

 

void loop() {

  // put your main code here, to run repeatedly:

  long int data;

  Serial.println( "DHT11 Temperature a humidity app" );

  while ( 1 )

  {

    delay( 2000 ); /* wait 1sec to refresh */

    if ((data = dht11_get_data(DHTPIN)) != 0)

      dht11_print_data(data);

    else

      Serial.println("Sensor is not responding");

    delay( 2000 ); /* wait 1sec to refresh */;

  }

}

 

/* Returned data dormat of data is per 8bits [ humidity_decimal, humidity_integral, temp_decimal, temp_integral ] */

long int dht11_get_data(uint8_t dht_pin)

{

  #define MAXPULSES_COUNT 45

  long int data;

  uint8_t pulses_time[MAXPULSES_COUNT];

  uint8_t crc;

  int pulse_time;

  uint8_t pulse_id = 0;

  uint8_t valid_pulses = 0, i = 0;

 

  /* Set pin  to output */

  pinMode( dht_pin, OUTPUT );

  /* Grab the line to wake up DHT11 */

  digitalWrite( dht_pin, LOW );

  /* Hold line down 18ms by the spec */

  delay( 18 );  

  /* switch pin to input with pullup resistor */

  pinMode( dht_pin, INPUT_PULLUP );

  /* To be be sure that DHT take contol over line (takes about 12us) */

  delayMicroseconds( 20 );

 

  /* Measuse incoming pulses withs for pulses */

  while ((pulse_time = pulseIn( dht_pin, HIGH, 200)) > 0 && pulse_id < MAXPULSES_COUNT)

  {

    /* All code here must be executed within 50us (pulseIn fucntion included) 

       => do not add any extra code in this loop  */    

    pulses_time[pulse_id] = pulse_time;

    pulse_id++;

  }

  /* Process measured data */

  if (pulse_id > 0)

  { /* proccess pulses */

    while ( i++ < (pulse_id - 1)) /* i++ to skip the first */

    {      

      pulse_time = pulses_time[i];

      if (i <= 32)

      { /* pulse belongs to data */

        data <<= 1;

        data |= ( pulse_time > 50 && pulse_time < 100 )?1:0;

        valid_pulses++;

      }

      else

      { /* pulse belongs to CRC */

        crc <<= 1;

        crc |= ( pulse_time > 50 && pulse_time < 100 )?1:0;

        valid_pulses++;

      }

    }

    /* Check CRC and validity */

    if ( (valid_pulses == 40)

         && (crc == ( ((data >> 24) & 0xff) + ((data >> 16) & 0xff) + ((data >> 8) & 0xff) + (data & 0xff)))

       )

    { /* data valid */

      return data;

 

    } else  {

      /* data invalid */

      return 0;

    }

  }

  else

  { /* dht11 is not responding */

    return 0;

  }

}

void dht11_print_data(long int data)

{

      Serial.print( "Vlhkost:" );

      Serial.print(data >> 24); Serial.print('.'); Serial.print((data >> 16) & 0xff);      

      Serial.print( " teplota:" );

      Serial.print((data >> 8) & 0xff); Serial.print('.'); Serial.println(data & 0xff);      

}


 

Odpovědět

Neboj se a klidně sděl svůj názor ...

Přezdívka
Email
Web
Aktuální rok plus dva (RRRR)
Komentář