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

Задача: измерить температуру и влажность с помощью Raspberry Pi и датчиков DHT11 или DHT22. Инструментарий. Нам понадобится:

  • Raspberry Pi
  • Уже установленный Raspbian
  • Датчик DHT11 или DHT22. Также можно использовать DHT21 (AM2301).

Что выбрать - DHT11 или DHT22?

Разница между ними в точности измерения и диапазоне температур и влажности. Также замечу, что потребление тока у DHT21 заменто выше. Использовать его имеет смысл в жестких условиях(например на улице). Например на улице.

DHT11 DHT22 DHT21
Влажность 20-90% +-5% 0-100% +-5% 0-100% +-3%
Температура 0-60 °С +-2% -40-125 °С +-0.5% -40-80 °С °С +-0.5%
Формат данных Целые Плавающий, 1 знак после запятой
Вес, г 1 2.2 11
Потребляемый ток, мА 0.1 0.1 1.36

Обратите внимание: Расположение ножек у датчиков не аналогичное - на DHT11 сигнал идет по крайнему левому контакту, а на DHT22 - по среденму.

Подключение

Тут все просто: подключаем +(красный, VCC ) от датчика к +5V на Raspberry Pi, -(черный,GND) к земле, и S(желтый, DATA OUT) к одному из GPIO выводов(например, к 4). Все.

Устанавливаем необходимое программное обеспечение

Установка библиотек

Оба датчика используют свой протокол вместо стандартизированного 1wire, поэтому программное обеспечение для снятия показаний датчика тоже будет отличаться. Установим библиотеку на С для работы с GPIO www.open.com.au/mikem/bcm2835/index.html.

wget http://www.open.com.au/mikem/bcm2835/bcm2835-1.15.tar.gz # или wget http://www.ansealk.ru/files/bcm2835-1.15.tar.gz
tar xzf bcm2835-1.15.tar.gz
cd bcm2835-1.15/
./configure 
make 
make install 

Сборка и использование из консоли

  1. Загружаем исходиный код программы на С++ по этой или этой ссылке.
  2. Cобираем ее командой
    gcc dht.c -lbcm2835 -lrt -o DHT

    В результате сборки в текущем каталоге появится исполняемый файл DHT

  3. Чтобы получить данные с датчика выполним
    sudo ./DHT <имя_датчика> <порт_GPIO>

    ,например

    sudo ./DHT 11 4

    значит, что используется датчик DHT11 на GPIO номер 4.

Что можно сделать с полученными данными

Да что угодно)

Zabbix

Например, настроить zabbix-agent на считывание этих датчиков раз в некоторое количество времени. Для этого добавим в /etc/zabbix/zabbix-agentd.conf в конец файла следующие строки:

UserParameter=probe.Humidity,echo $((`sudo /opt/probes/DHT 11 4|grep "^Data"|awk -F ':' '{print $2}'|awk -F ' ' '{print $1}'`))
UserParameter=probe.Temperature,echo $((`sudo /opt/probes/DHT 11 4|grep "^Data"|awk -F ':' '{print $2}'|awk -F ' ' '{print $3}'`))

Google Docs

А можно и сохранять данные в таблицу Google docs)

  1. Подготовим Google docs. Создадим новую таблицу и дадим ей имя. Дадим имена колонкам первой datetime, второй temperature, третей humidity. Из адресной строки скопируем id нашей таблицы, по нему будет производиться обращение к таблице.
  2. Устанавливаем php:
    sudo apt-get php5 php5-curl unzip 
  3. Создаем папку для нашего проекта:
    mkdir /home/pi/dht 
  4. Загружаем и распаковываем Zend Framework:
    mkdir /home/pi/dht/library
    cd /home/pi/dht/library 
    wget http://packages.zendframework.com/releases/ZendFramework-1.12.0/ZendFramework-1.12.0-minimal.zip
    unzip ZendFramework-1.12.0-minimal.zip
    ln -s ZendFramework-1.12.0-minimal/library/Zend Zend 
  5. Создаем файл
    DHTtoGoogleDocs.php
    <?php
     
    ini_set("include_path",get_include_path().':/home/pi/dht/library');
     
    require_once 'Zend/Loader.php';
    Zend_Loader::loadClass('Zend_Gdata_Spreadsheets');
    Zend_Loader::loadClass('Zend_Gdata_ClientLogin');
     
    define('GDATA_USER','googleusername');
    define('GDATA_PASSWORD','google user password');
    define('GDATA_SPREADSHEET_KEY','spreadsheetkey from url');
    define('GDATA_WORKSHEET_ID','od6');
     
    try {
     
      $t = new Temperature_DHT();
      // get data from sensor
      $data = $t->getData(11,4);
     
      $service = Zend_Gdata_Spreadsheets::AUTH_SERVICE_NAME;
      $client = Zend_Gdata_ClientLogin::getHttpClient(GDATA_USER, GDATA_PASSWORD, $service);
      $service = new Zend_Gdata_Spreadsheets($client);
     
      // add row to spreadsheet
      $row = array(
              'datetime'=>date("Y-m-d H:i:s"),
              'temperature'=>$data[0],
              'humidity'=>$data[1],
      );
      $service->insertRow($row, GDATA_SPREADSHEET_KEY, GDATA_WORKSHEET_ID);
     
    } catch (Exception $e) {
      die( $e->getMessage() );
    }
     
     
     
    class Temperature_DHT
     
    {
           private $_maxFailCount=5;
     
           public function getData($type, $pin)
           {
     
                   $count = 0;
     
                   while ($count<=$this->_maxFailCount)
                   {
                           $count++;
                           $filename = '/opt/probes/DHT';
     
                           $out = exec   ("sudo $filename $type $pin");
                           if(preg_match("'^Temp = ([0-9\.]+) \*C, Hum = ([0-9\.]+) %'", $out,$result))
                           {
     
     
                                   return array($result[1],$result[2]);
                           }
     
                   }
     
           }
    }
  6. Запускаем
    php DHTtoGoogleDocs.php

    Не забываем добавить этот вызов в cron

izmerjaem_temperaturu_i_vlazhnost_s_pomoschju_dht11_dht22.txt · Последние изменения: 2014/10/13 18:24 (внешнее изменение)
GNU Free Documentation License 1.3
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0 Яндекс.Метрика