Raspberry Pi Pico: датчик температуры и влажности DHT11/DHT22 (Arduino IDE)

В этом руководстве показано, как считывать температуру и влажность с датчиков DHT11 или DHT22 с помощью платы Raspberry Pi Pico в Arduino IDE.

Raspberry Pi Pico с датчиком DHT11 DHT22 температуры и влажности Arduino IDE

Хотите программировать на MicroPython? Ознакомьтесь со следующим руководством: Raspberry Pi Pico: датчик температуры и влажности DHT11/DHT22 (MicroPython).

Необходимые условия

Вам необходимо установить платы Raspberry Pi Pico в Arduino IDE, и вы должны знать, как загружать код на плату. Сначала ознакомьтесь со следующим руководством, если вы ещё этого не сделали:

Знакомство с датчиками DHT11 и DHT22

Датчики DHT11 и DHT22 используются для измерения температуры и относительной влажности. Они очень популярны среди мейкеров и любителей электроники.

Датчики температуры и влажности DHT11 и DHT22

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

DHT11 vs DHT22

DHT11 и DHT22 очень похожи, но отличаются своими характеристиками. В следующей таблице сравниваются некоторые из наиболее важных характеристик датчиков температуры и влажности DHT11 и DHT22. Для более подробного анализа этих датчиков, пожалуйста, ознакомьтесь с техническим описанием (datasheet) датчиков.

DHT11

DHT22

DHT11 DHT22

Диапазон температур

от 0 до 50 °C ±2 °C

от -40 до 80 °C ±0,5 °C

Диапазон влажности

от 20 до 90% ±5%

от 0 до 100% ±2%

Разрешение

Влажность: 1%, Температура: 1 °C

Влажность: 0,1%, Температура: 0,1 °C

Рабочее напряжение

3 – 5,5 В постоянного тока

3 – 6 В постоянного тока

Потребляемый ток

0,5 – 2,5 мА

1 – 1,5 мА

Период опроса

1 секунда

2 секунды

Цена

от $1 до $5

от $4 до $10

Датчик DHT22 имеет лучшее разрешение и более широкий диапазон измерения температуры и влажности. Однако он немного дороже, и запрашивать показания можно только с интервалом в 2 секунды.

DHT11 имеет меньший диапазон и менее точен. Однако вы можете запрашивать показания датчика каждую секунду. Он также немного дешевле.

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

Распиновка DHT

Датчики DHT имеют четыре вывода, как показано на следующем рисунке. Однако, если вы приобретаете датчик DHT на плате-модуле (breakout board), он поставляется только с тремя выводами и внутренним подтягивающим резистором на выводе 2.

Распиновка датчика температуры и влажности DHT22

В следующей таблице показана распиновка DHT22 и DHT11. Когда датчик обращён к вам, нумерация выводов начинается с 1 слева направо.

Вывод DHT

Подключение

1

3,3 В

2

Любой цифровой GPIO; также подключите подтягивающий резистор 4,7 кОм

3

Не подключать

4

GND

Плата-модуль датчика DHT

Если у вас есть датчик DHT11 или DHT22 на плате-модуле (breakout board), он поставляется только с тремя выводами и имеет встроенный подтягивающий резистор на выводе данных.

Датчик DHT22 на плате-модуле

В этом случае подключение ещё проще, и вам не нужно подключать внешний резистор. Платы-модули DHT обычно имеют маркировку на выводах: GND, VCC и DATA.

Вывод DHT

Подключение

GND

GND

VCC

3V3(OUT)

DAT

GPIO 22 (или любой другой цифровой вывод)

Необходимые компоненты

Raspberry Pi Pico с датчиком DHT

Вот список компонентов, необходимых для сборки схемы (если у вас нет платы-модуля DHT, вам понадобится резистор 4,7 кОм):

  • Raspberry Pi Pico

  • Датчик температуры и влажности DHT11 или DHT22

  • Резистор 4,7 кОм или аналогичного номинала (не нужен, если у вас есть плата-модуль DHT)

  • Макетная плата (breadboard)

  • Соединительные провода (jumper wires)

Подключение DHT11/DHT22 к Raspberry Pi Pico

Подключите датчик DHT22 или DHT11 к Raspberry Pi Pico, как показано на следующей схеме. Если у вас есть плата-модуль DHT, не обращайте внимания на резистор.

Схема подключения Raspberry Pi Pico с датчиком DHT (Fritzing)

В этом примере мы подключаем вывод данных DHT к GPIO 22. Однако вы можете использовать любой другой подходящий цифровой вывод.

Вам также может быть полезно ознакомиться с руководством: Распиновка Raspberry Pi Pico и Pico W: описание GPIO.

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

Для считывания данных с датчика DHT мы будем использовать библиотеку DHT от Adafruit. Для использования этой библиотеки вам также необходимо установить библиотеку Adafruit Unified Sensor. Выполните следующие шаги для установки этих библиотек.

Откройте Arduino IDE и перейдите в Sketch > Include Library > Manage Libraries. Откроется менеджер библиотек.

Введите «DHT» в поле поиска и установите библиотеку DHT от Adafruit.

Установка библиотеки датчика DHT в Arduino IDE

Появится сообщение с предложением также установить библиотеку «Adafruit Unified Sensor». Установите эту библиотеку. Если такое сообщение не появилось, установите библиотеку вручную. Введите «Adafruit Unified Sensor» в поле поиска. Прокрутите вниз, найдите библиотеку и установите её.

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

После установки библиотек перезапустите Arduino IDE.

Raspberry Pi Pico с датчиком DHT — Код

Откройте новый файл в Arduino IDE и скопируйте следующий код.

/*********
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com/raspberry-pi-pico-dht11-dht22-arduino/
  Example testing sketch for various DHT humidity/temperature sensors - Adapted from the Adafruit DHT examples written by ladyada
  REQUIRES the following Arduino libraries:
  - DHT Sensor Library: https://github.com/adafruit/DHT-sensor-library
  - Adafruit Unified Sensor Lib: https://github.com/adafruit/Adafruit_Sensor
*********/

#include "DHT.h"

#define DHTPIN 22     // Digital pin connected to the DHT sensor

// Uncomment whatever type you're using!
//#define DHTTYPE DHT11   // DHT 11
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(115200);
  Serial.print("Testing DHT sensor");
  dht.begin();
}

void loop() {
  // Wait a few seconds between measurements.
  delay(2000);

  // 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(F("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(F("Humidity: "));
  Serial.print(h);
  Serial.print(F("%  Temperature: "));
  Serial.print(t);
  Serial.print(F("°C "));
  Serial.print(f);
  Serial.print(F("°F  Heat index: "));
  Serial.print(hic);
  Serial.print(F("°C "));
  Serial.print(hif);
  Serial.println(F("°F"));
}

Просмотреть исходный код

Продолжите чтение, чтобы узнать, как работает код, или перейдите к разделу Демонстрация.

Как работает код

Сначала необходимо подключить библиотеку DHT:

#include "DHT.h"

Затем определите цифровой вывод, к которому подключён вывод данных датчика DHT. В данном случае он подключён к GPIO 22.

#define DHTPIN 22     // Digital pin connected to the DHT sensor

Далее необходимо выбрать тип используемого датчика DHT. Библиотека поддерживает DHT11, DHT22 и DHT21. Раскомментируйте строку с типом вашего датчика и закомментируйте все остальные. В данном случае мы используем датчик DHT22.

//#define DHTTYPE DHT11   // DHT 11
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

Создайте объект DHT с именем dht на указанном выводе и с выбранным ранее типом датчика.

DHT dht(DHTPIN, DHTTYPE);

В функции setup() инициализируйте последовательный порт для отладки со скоростью 115200 бод и выведите сообщение в монитор порта.

Serial.begin(115200);
Serial.println(F("DHTxx test!"));

Наконец, инициализируйте датчик DHT.

dht.begin();

Цикл loop() начинается с задержки 2000 мс (2 секунды), потому что максимальный период опроса DHT22 составляет 2 секунды. Таким образом, мы можем получать показания только каждые две секунды.

delay(2000);

Температура и влажность возвращаются в формате float. Мы создаём переменные типа float: h, t и f для сохранения влажности, температуры в градусах Цельсия и температуры в градусах Фаренгейта соответственно.

Получение влажности и температуры так же просто, как использование методов readHumidity() и readTemperature() объекта dht, как показано ниже:

float h = dht.readHumidity();
// Read temperature as Celsius (the default)
float t = dht.readTemperature();

Если вы хотите получить температуру в градусах Фаренгейта, необходимо передать параметр true в качестве аргумента метода readTemperature().

float f = dht.readTemperature(true);

Также есть оператор if, который проверяет, вернул ли датчик корректные показания температуры и влажности.

if (isnan(h) || isnan(t) || isnan(f)) {
  Serial.println(F("Failed to read from DHT sensor!"));
  return;

После получения влажности и температуры библиотека предоставляет метод, который вычисляет индекс тепла (heat index). Вы можете получить индекс тепла как в градусах Цельсия, так и в градусах Фаренгейта, как показано ниже:

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

Наконец, выведите все показания в монитор порта с помощью следующих команд:

Serial.print(F("Humidity: "));
Serial.print(h);
Serial.print(F("%  Temperature: "));
Serial.print(t);
Serial.print(F("°C "));
Serial.print(f);
Serial.print(F("°F  Heat index: "));
Serial.print(hic);
Serial.print(F("°C "));
Serial.print(hif);
Serial.println(F("°F"));

Загрузка кода на Raspberry Pi Pico

Чтобы иметь возможность загружать код на Raspberry Pi Pico, плата должна находиться в режиме загрузчика (bootloader mode).

Если на Raspberry Pi Pico в данный момент установлена прошивка MicroPython, необходимо вручную перевести его в режим загрузчика. Для этого подключите Raspberry Pi Pico к компьютеру, одновременно удерживая кнопку BOOTSEL.

Режим загрузчика Raspberry Pi Pico

Для последующих загрузок через Arduino IDE плата должна автоматически переходить в режим загрузчика без необходимости нажимать кнопку BOOTSEL.

Теперь выберите ваш COM-порт в Tools > Port. Может случиться так, что COM-порт неактивен (серого цвета). Если это так, не беспокойтесь — порт будет найден автоматически, как только вы нажмёте кнопку загрузки.

Raspberry Pi Pico - COM-порт не отображается в Arduino IDE

Загрузите код.

Кнопка загрузки Arduino 2.0

Вы должны получить сообщение об успешной загрузке.

Успешная загрузка кода на Raspberry Pi Pico в Arduino IDE

Демонстрация

Откройте монитор порта (Serial Monitor) на скорости 115200 бод. Вы должны получать новые показания температуры и влажности, а также индекс тепла каждые две секунды.

Показания DHT22 на Raspberry Pi Pico в Arduino IDE

Устранение неполадок

Если ваш датчик DHT не может получить показания, прочитайте наше руководство по устранению неполадок DHT, чтобы помочь вам решить проблему.

Заключение

В этом руководстве вы узнали, как подключить датчики температуры DHT11 и DHT22 к Raspberry Pi Pico и как получить показания температуры и влажности с помощью Arduino IDE.

Мы показали вам, как использовать библиотеку Adafruit DHT для получения показаний температуры, влажности и индекса тепла — вам нужно лишь использовать методы readTemperature(), readHumidity() и computeHeatIndex() объекта DHT.

У нас есть другие базовые руководства по Raspberry Pi Pico, которые могут вас заинтересовать: