Translate

понедельник, 16 июля 2018 г.

Датчик влажности и температуры DHT-22

Ещё один шаг к строительству метеостанции


DHT-22
Помнится, весной я уже писал про датчик DHT-11. Был тогда им немало разочарован, потому что оказалось, что не измеряет он температуру ниже 0 градусов по Цельсию, а метеостанция - это штука, строго говоря, уличная. В общем, пришлось заказывать DHT-22, и вот он наконец приехал. Так что на сегодня все дела с приёмником отложил, решил вернуться к своему старому проекту - метеостанции. Это был тот редкий случай, когда я оказался рад собственному разгильдяйству: проект так и остался собран на макетной плате, осталось только поменять датчик, немного видоизменить код и всё запустить. Горький опыт подключения DHT-11 принёс свои плоды, так что запуск прошёл относительно быстро, хоть и не сразу.

Итак, что же за зверь DHT-22

Я скажу прямо: немного расстроен и разочарован. Я рассчитывал, что удорожание будет нести и повышение точности измерений, однако, результаты с обоих оказались примерно одинаковыми, а шаг измерения составил 0,1 градуса против 0,01 у моего барометра BMP-180, о котором я тоже писал. Конечно, скажете вы: 0,1 градуса - это уже более чем достаточно. Ну и я скажу, что разочарован потому только немного :)

Temp - показания с BMP-180; Temp2 - с DHT-22. Расходятся на 0,6 градуса, не хило так...


Даташит на датчик можно глянуть вот тут: (У меня DHT-22 AM2302)

А если коротко из него самое главное:
Напряжение питания: 3,3 - 6 вольт. (Отлично, обойдёмся одной 18650!)
Измерение влажности: 0 - 100% (Погрешность: 2-5%)
Измерение температуры: -40°C – +80°C (Погрешность: < +/- 0,5°C, какие уж тут 0,01...)
Период чувствительности: 2 секунды.

После подключения просят 1 секунду не обращаться к датчику, подождав период нестабильности в работе, это я отражу в скрипте.

Сравнение DHT-11 и DHT-22


Подключение к метеостанции

Вот так оно пока что собрано. Резисторы к дисплею - все по 10 килоом, кроме вывода CE - туда 1 килоом.

Проект только в начале сборки, так что ещё потребуется время, чтобы его завершить, но сейчас у меня есть датчик давления, температуры и влажности, всё это подключено к Ардуино и выводит информацию на дисплей от Nokia. Неплохо для начала. В принципе, уже можно подключать аккумулятор и вывешивать за окно, но так неинтересно. Я планирую записывать данные с датчиков на SD-карту и потом во время зарядки иметь возможность перекидывать информацию на компьютер для последующей обработки статистики. Как сделаю - напишу, а пока что скетч того, что получилось.

// Это программа метеостанции// Она измеряет температуру, влажность и давление// И выводит результат на дисплей Nokia5110
#include <Adafruit_GFX.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_PCD8544.h>
#include <SFE_BMP180.h>
#include <Wire.h>
#include <DHT.h>
#define DHTPIN 2  // Пин подключения датчика температуры и влажности
#define DHTTYPE DHT22 
DHT dht(DHTPIN, DHTTYPE);  // Указываем параметры работы датчика

// pin 3 - Serial clock out (SCLK)
// pin 4 - Serial data out (DIN)
// pin 5 - Data/Command select (D/C)
// pin 6 - LCD chip select (CS)
// pin 7 - LCD reset (RST) 

Adafruit_PCD8544 display = Adafruit_PCD8544(3, 4, 5, 6, 7);
SFE_BMP180 pressure;
long time_pass; // Переменная таймера

double T,P;


void setup() {

  display.begin();              // Инициализация дисплея
  display.setContrast(60);      // Устанавливаем контраст
  display.setTextColor(BLACK);  // Устанавливаем цвет текста
  display.setTextSize(1);       // Устанавливаем размер текста
  display.clearDisplay();       // Очищаем дисплей
  display.display();
  pressure.begin();             // Инициализация барометра
  dht.begin();                  // Инициализация термогигрометра
  delay(1000);                // Секунду ждём период запуска схемы
  time_pass = millis();


}
void loop()
{
  char status;
  float h, t; // Переменные влажности и температуры
 
 if ((millis() - time_pass) >= 2000)
{

h = dht.readHumidity(); //Читаем влажность
t = dht.readTemperature(); //Читаем температуру
if (isnan(h) || isnan(t)) // Если ошибка чтения сенсора
  {
    // Сюда можно добавить сообщение об ошибке Serial.println
    return;
  }
  float hic = dht.computeHeatIndex(t, h, false);

status = pressure.startTemperature();
  if (status != 0) // Если пришёл не 0
  {
    // Ждём пришедшее число миллисекунд
    delay(status);
    // Записываем значение температуры в T
    // Функция вернёт 1, если чтение успешно, иначе 0

    status = pressure.getTemperature(T);
    if (status != 0) // если не 0 (то есть 1)
    {
     
      // Старт измерения давления
      // Параметр в скобках от 0 до 3 (чем точнее результат, тем дольше ожидание)
      // Если запрос выполнен успешно, возвращается число миллисекунд для ожидания
      // При неудачном исполнении возвращается 0 

      status = pressure.startPressure(3);
      if (status != 0) // если не 0
      {
        // Ожидаем вернувшееся число миллисекунд до завершения измерения
        delay(status);
        // Измеряем давление
        // Значение сохраняем в P, заметим, что для измерения требуется только что полученное T
        // Если температура стабильна, можно измерить её один раз и подставлять дальше, но я бы не стал так делать
        // Функция тоже возвращает 1, если всё успешно, 0, если что-то пошло не так

        status = pressure.getPressure(P,T);
      }
    }
  }
          display.clearDisplay();
       
          // Выведем текст
          display.setContrast(60);      // Устанавливаем контраст
          display.setTextColor(BLACK);  // Устанавливаем цвет текста
          display.setTextSize(1);
          display.setCursor(0,0);
          display.print("Temp:");
          display.print(T,2);
          display.println("oC");
          P = P * 0.750062;  // Перевод в мм ртутного столба
          display.print("Pres:");
          display.print(P,2);
          display.println("mm");
          display.print("Hum:");
          display.print(h,2);
          display.println("%");
          display.print("Temp2:");
          display.print(t,2);
          display.println("oC");
          display.display();
          time_pass = millis();
     
}
       
}

1 комментарий:

  1. Схема может давать сбой, как правило датчики температуры редко выходят из строя. к тому же часто дублируются - для надежности

    ОтветитьУдалить