Информационный портал по безопасности » Железо » Сделай Сам » Raspberry Pi: измеряем влажность и температуру с помощью DHT11/DHT22

 

Raspberry Pi: измеряем влажность и температуру с помощью DHT11/DHT22

Автор: admin от 29-01-2013, 03:25, посмотрело: 7 229

Raspberry Pi: измеряем влажность и температуру с помощью DHT11/DHT22На Хабре уже публиковалась статья о подключении датчика температуры DS18B20 к Raspberry Pi. В нашем новом проекте, который строится на Raspberry Pi, понадобилось измерять не только температуру, но и влажность. Я расскажу, как подключить недорогие китайские датчики влажности к Raspberry Pi. Просмотрев несколько вариантов различных датчиков, остановился на двух наиболее массовых на рынке датчиков. Это DHT11, который привлек своей ценой $3 (с доставкой) и датчик DHT22 (около $10 с доставкой).

Основная разница между ними в диапазоне температур и точности измерения:

DHT11


  • Влажность 20-80% +- 5%

  • Температура 0-50 В°С+- 2%

  • Данные считываются в целых единицах.


DHT22


  • Влажность 0-100% +- 5%

  • Температура -40-125 В°С +- 0.5%

  • Данные считываются с точностью до десятых.



Raspberry Pi: измеряем влажность и температуру с помощью DHT11/DHT22
Подключение

Подключение к Raspberry Pi особой сложности не представляет: подключаем + от датчика к +5V на Raspberry Pi, "-" — к земле, и сигнал к одному из GPIO выводов.
Raspberry Pi: измеряем влажность и температуру с помощью DHT11/DHT22

Устанавливаем ПО

Оба датччика используют свой протокол вместо стандартизированного 1 wire, поэтому программное обеспечение для снятия показаний датчика тоже будет отличаться.

Сначала установим библиотеку на С для работы с GPIO www.open.com.au/mikem/bcm2835/index.html
wget http://www.open.com.au/mikem/bcm2835/bcm2835-1.15.tar.gz
tar xzf bcm2835-1.15.tar.gz
cd bcm2835-1.15/
./configure
make
make install


Для чтения данных с датчика за основу был взят файл на С Adafruit_DHT_Driver. Без внесения некоторых изменений работать с DHT22, этот код отказывался, пришлось немного изменить.
Поэтому привожу модифицированную версию.Файл readDHT.c
//  How to access GPIO registers from C-code on the Raspberry-Pi
//  Example program
//  15-January-2012
//  Dom and Gert
//


// Access from ARM Running Linux

#define BCM2708_PERI_BASE        0x20000000
#define GPIO_BASE                (BCM2708_PERI_BASE + 0x200000) /* GPIO controller */


#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

#define MAXTIMINGS 100

#define DHT11 11
#define DHT22 22
#define AM2302 22

int readDHT(int type, int pin);

int main(int argc, char **argv)
{
if (!bcm2835_init())
       return 1;

if (argc != 3) {
       printf("usage: %s [11|22|2302] GPIOpin#n", argv[0]);
       printf("example: %s 2302 4 - Read from an AM2302 connected to GPIO #4n", argv[0]);
       return 2;
}
int type = 0;
if (strcmp(argv[1], "11") == 0) type = DHT11;
if (strcmp(argv[1], "22") == 0) type = DHT22;
if (strcmp(argv[1], "2302") == 0) type = AM2302;
if (type == 0) {
       printf("Select 11, 22, 2303 as type!n");
       return 3;
}

int dhtpin = atoi(argv[2]);

if (dhtpin <= 0) {
       printf("Please select a valid GPIO pin #n");
       return 3;
}


printf("Using pin #%dn", dhtpin);

readDHT(type, dhtpin);
return 0;

} // main


int bits[250], data[100];
int bitidx = 0;

int readDHT(int type, int pin) {
int counter = 0;
int laststate = HIGH;
int j=0;
int i=0;
// Set GPIO pin to output
bcm2835_gpio_fsel(pin, BCM2835_GPIO_FSEL_OUTP);
bcm2835_gpio_write(pin, HIGH);
usleep(100);
bcm2835_gpio_write(pin, LOW);
usleep(20000);
bcm2835_gpio_fsel(pin, BCM2835_GPIO_FSEL_INPT);

data[0] = data[1] = data[2] = data[3] = data[4] = 0;
// read data!

for (i=0; i< MAXTIMINGS; i++) {
    counter = 0;
    while ( bcm2835_gpio_lev(pin) == laststate) {
       counter++;
       nanosleep(1);           // overclocking might change this?
       if (counter == 100)
         break;
    }
    laststate = bcm2835_gpio_lev(pin);
    if (counter == 100) break;
    bits[bitidx++] = counter;

    if ((i>3) && (i%2 == 0)) {
     // shove each bit into the storage bytes
     data[j/8] <<= 1;
     if (counter > 16)
       data[j/8] |= 1;
     j++;
    }
}


#ifdef DEBUG
for (int i=3; i 15);
}
#endif

printf("Data (%d): 0x%x 0x%x 0x%x 0x%x 0x%xn", j, data[0], data[1], data[2], data[3], data[4]);

if ((j >= 39) &&
     (data[4] == ((data[0] + data[1] + data[2] + data[3]) & 0xFF)) ) {
    // yay!
    if (type == DHT11)

printf("Temp = %d *C, Hum = %d %n", data[2], data[0]);
    if (type == DHT22) {
float f, h;
       h = data[0] * 256 + data[1];
       printf ("%sn",h);
       h /= 10;

       f = (data[2] & 0x7F)* 256 + data[3];
       f /= 10.0;
       if (data[2] & 0x80)  f *= -1;
       printf("Temp =  %.1f *C, Hum = %.1f %n", f, h);
    }
    return 1;
}

return 0;
}


Источник: DIY или Сделай Сам

Категория: Железо / Сделай Сам

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Добавление комментария

Имя:*
E-Mail:
Комментарий:
  • bowtiesmilelaughingblushsmileyrelaxedsmirk
    heart_eyeskissing_heartkissing_closed_eyesflushedrelievedsatisfiedgrin
    winkstuck_out_tongue_winking_eyestuck_out_tongue_closed_eyesgrinningkissingstuck_out_tonguesleeping
    worriedfrowninganguishedopen_mouthgrimacingconfusedhushed
    expressionlessunamusedsweat_smilesweatdisappointed_relievedwearypensive
    disappointedconfoundedfearfulcold_sweatperseverecrysob
    joyastonishedscreamtired_faceangryragetriumph
    sleepyyummasksunglassesdizzy_faceimpsmiling_imp
    neutral_faceno_mouthinnocent