Подключение цифрового датчика влажности/температуры AM2301(DHT21) к Arduino.

Добрый день друзья. В первой статье мы познакомились с микроконтроллером Arduino.Теперь пришло время второго урока по Arduino. Сегодня нашим подопытном будет цифровой датчик температуры/влажности DHT21\DHT11. В моем случае это AM2301 в черном корпусе и всей нужной обвязкой.

Характеристики измерения относительной влажности (RH)
Предел измерения: 0..99.9%;
Погрешность измерения: ± 3%;
Разрешение: 1%;

Характеристики измерения температуры
Предел измерения: -40° ~ + 80°C;
Погрешность измерения: ±0.5°C;
Разрешение: 0.1°C;

Прочие характеристики
Питание: 3.3-5.2В;
Размеры датчика: 59 х 26 х 14 мм;
Масса: 14 г;

Очень простой и дешевый датчик, для вывода данных использует протокол 1-Wire . Не вдаваясь в подробности данные передаются по одному проводу, который так же может быть и проводом питания датчика. В стандартной схеме подключения выход Дата подтягивается к +5(питанию) резистором 1-5 кОм. В моем случае это уже сделано, мне осталось только подключить датчик к контролеру.

Датчик опрашивается  не чаще чем раз в 2 секунды, во всяком случае так написано в Datasheet .

Подключение датчика:
Черный — GND;
Красный — VCC; +5 или +3.3
Желтый — DATA OUT ножка D2

Конечно можно использовать и датчики DHT11 и DHT22. Принцип работы и код не отличается.

Код:

Проект Arduino удобен начинающим тем что вам не нужно сильно вдаваться в технические особенности протокола и т.д. Вы можете найти в сети уже готовые библиотеки для работы со всеми известными и популярными датчиками. Если бы вы взяли просто микроконтроллер AVR фирмы Atmel вам бы пришлось писать библиотеку самим. Конечно если вы хотите повысить свои знания и разобраться подробно как это работает в даташипе указаны все команды и временные интервалы для работы с датчиком.

Нам потребуется две библиотеке которые можно скачать с GitHab:

Что бы добавить библиотеки в Arduino IDE просто скопируем папки в C:\Users\admin\Documents\Arduino\libraries . Ну а для примера используем готовый скетч из библиотеке DHT :

// Example testing sketch for various DHT humidity/temperature sensors
// Written by ladyada, public domain

#include "DHT.h" //Подключаем библиотеку.

#define DHTPIN 2 // what digital pin we're connected to(Вывод к которому подключен датчик, в данном случае  пин D2)

// Uncomment whatever type you're using!
//#define DHTTYPE DHT11 // DHT 11
//#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321 
#define DHTTYPE DHT21 // DHT 21 (AM2301) //Здесь выбираем какой у нас датчик.

// Connect pin 1 (on the left) of the sensor to +5V
// NOTE: If using a board with 3.3V logic like an Arduino Due connect pin 1
// to 3.3V instead of 5V!
// Connect pin 2 of the sensor to whatever your DHTPIN is
// Connect pin 4 (on the right) of the sensor to GROUND
// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor

// Initialize DHT sensor.
// Note that older versions of this library took an optional third parameter to
// tweak the timings for faster processors. This parameter is no longer needed
// as the current DHT reading algorithm adjusts itself to work on faster procs.
DHT dht(DHTPIN, DHTTYPE); 

void setup() {
 Serial.begin(9600); 
 Serial.println("DHTxx test!");

dht.begin(); 
}

void loop() {
 // Wait a few seconds between measurements.
 delay(10000); // Задержка перед опросом датчика. Минимум 2000(2 секунды)

// Reading temperature or humidity takes about 250 milliseconds!
 // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
 float h = dht.readHumidity(); //читаем влажность
 // Read temperature as Celsius (the default)
 float t = dht.readTemperature(); // читаем температуру 
 // Read temperature as Fahrenheit (isFahrenheit = true)
 float f = dht.readTemperature(true); 

// Check if any reads failed and exit early (to try again).
 if (isnan(h) || isnan(t) || isnan(f)) {
 Serial.println("Failed to read from DHT sensor!"); //Проверка подключен ли датчик
 return;
 }

// Compute heat index in Fahrenheit (the default)
 float hif = dht.computeHeatIndex(f, h);
 // Compute heat index in Celsius (isFahreheit = false)
 float hic = dht.computeHeatIndex(t, h, false);

Serial.print("Humidity: "); // печатаем полученные данные.
 Serial.print(h);
 Serial.print(" %\t");
 Serial.print("Temperature: ");
 Serial.print(t);
 Serial.print(" *C ");
 Serial.print(f);
 Serial.print(" *F\t");
 Serial.print("Heat index: ");
 Serial.print(hic);
 Serial.print(" *C ");
 Serial.print(hif);
 Serial.println(" *F");
}

В Arduino мы можем воспользоваться для вывода данных удобной функцией Монитор порта . Здесь нам надо остановиться немного подробней. 

Serial
Набор функций Serial служит для связи устройства Ардуино с компьютером или другими устройствами, поддерживающими последовательный интерфейс обмена данными. Все платы Arduino имеют хотя бы один последовательный порт (UART, иногда называют USART). Для обмена данными Serial используют цифровые порты ввод/вывода 0 (RX) и 1 (TX), а также USB порт. Важно учитывать, что если вы используете функции Serial, то нельзя одновременно с этим использовать порты 0 и 1 для других целей.

Serial.begin()
Инициирует последовательное соединение и задает скорость передачи данных в бит/c (бод). Для обмена данными с компьютером используйте следующие значения: 300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600 или 115200. При соединение через порты вход/выхода 0 и 1 могут быть использованы другие значения скорости, требуемые устройством с которым будет осуществляться обмен данными.

Serial.print()
Передает данные через последовательный порт как ASCII текст. Эта функция может принимать различные типы данных. Так целые числа выводятся соответствующими им символами ASCII.

Serial.println()
Передает данные через последовательное соединение как ASCII текст с следующим за ним символом переноса строки (ASCII символ 13 или ‘\r’) и символом новой строки (ASCII 10 или ‘\n’). Пераметры и типы данных для этой функции такие же, как и для Serial.print().