Набор датчиков температуры и влажности DHT11 и DHT22 для Raspberry Pi и Arduino
Компоненты и материалы
| Компонент | Количество | Примечание |
|---|---|---|
| Датчик температуры и влажности DHT11 (4 пина) | 1 | |
| Raspberry Pi 2 Model B | 1 | |
| Arduino UNO | 1 | |
| Провода «папа-папа» (Male-to-Male Jumper Wire) | 3 | |
| Беспаечная макетная плата (Breadboard) | 1 | |
| Резистор 4,7 кОм | 1 | Подтягивающий резистор для линии данных |
| Набор Cobbler Breakout (для Raspberry Pi) | 1 | Для удобного подключения к GPIO |
Программное обеспечение и онлайн-сервисы
- Microsoft Windows 10 IoT Core — ОС для Raspberry Pi
- Arduino IDE — среда разработки для Arduino
- Raspberry Pi Raspbian — ОС для Raspberry Pi (Linux)
- Microsoft Visual Studio 2015 — для разработки под Windows 10 IoT Core (C#/C++)
- WinSCP — для копирования файлов на Raspberry Pi (по SSH)
- PuTTY — SSH-клиент для управления Raspberry Pi
О проекте
Введение
Проект посвящён работе с датчиком DHT11 на платформах Raspberry Pi (Windows 10 IoT Core, Raspbian) и Arduino UNO. Цель — создать библиотеку для C# в Windows 10 IoT Core, позволяющую надёжно считывать данные с датчика, используя пример от Microsoft на C++ как базу.
Основы датчика DHT11
DHT11 — 4-пиновый датчик (один пин не используется), измеряющий влажность 20–90% и температуру 0–50 °C. Питание 3–5,5 В DC. Обмен данными происходит по проприетарному протоколу OneWire, требующему очень точного тайминга. Биты кодируются длительностью высокого уровня сигнала. Полное чтение занимает до 23,4 мс (включая 18 мс задержки запуска и до 5,4 мс на передачу данных). Отдельные импульсы длятся 20–80 мкс.
При выходе Windows 10 IoT Core я попытался использовать DHT11 на C# и обнаружил, что C# в IoT Core недостаточно быстр для точного тайминга. На форуме Microsoft обсуждали эту проблему. Позже Microsoft опубликовал пример реализации OneWire для DHT11 на C++ для Windows 10 IoT Core. Этот проект адаптирует тот пример в библиотеку для C#.
Библиотека
Библиотека — простая рефакторинг кода от Microsoft, поэтому заслуга за чтение датчика принадлежит им.
Библиотека предоставляет класс Dht11 в пространстве имён Sensors.Dht. Создание объекта в C#:
using Sensors.Dht;
GpioPin pin = GpioController.GetDefault().OpenPin(4, GpioSharingMode.Exclusive);
Передаём пин в конструктор с указанием режима драйвера GPIO (позволяет решить, добавлять ли свой подтягивающий резистор):
Dht11 dht11 = new Dht11(_pin, GpioPinDriveMode.Input);
Получение показаний:
DhtReading reading = await dht11.GetReadingAsync().AsTask();
Есть перегрузка с параметром максимального числа попыток (по умолчанию 20). Структура DhtReading:
public value struct DhtReading {
bool TimedOut;
bool IsValid;
double Temperature;
double Humidity;
int RetryCount;
};
Наблюдения
Даже в C++ датчик не всегда выдаёт показание с первой попытки, поэтому нужен механизм повторных попыток (это часть примера Microsoft). Я сравнил производительность на трёх платформах: Raspberry Pi 2 на Windows 10 IoT Core (C#), Raspberry Pi 2 на Raspbian (C) и Arduino UNO. Код для всех платформ есть в GitHub-репозитории. Видео в проекте демонстрирует и сравнивает результаты.
Начало работы
Сборка схемы для Raspberry Pi 2
Используйте схему внизу страницы (цвета проводов опциональны, выбраны для наглядности).
- Установите T-образный Cobbler на левом конце полуразмерной макетной платы (нумерация с 1). Два левых пина в E1 и F1, два правых — в E20 и F20.
- Установите резистор 4,7 кОм между A4 и 3V3.
- Соедините оранжевый провод между B4 и F28.
- Соедините красный провод между F29 и 3V3.
- Соедините чёрный провод между F30 и GND.
- Установите датчик DHT11 в J30 (-), J29 (+), J28 (сигнал).
- Подключите шлейф кабеля к Cobbler и Raspberry Pi.
Сборка схемы для Arduino
- Установите резистор 4,7 кОм между E12 и E13.
- Соедините белый провод между D13 и Pin 5 Arduino.
- Соедините красный провод между D12 и 5V Arduino.
- Соедините чёрный провод между D11 и GND Arduino.
- Установите датчик DHT11 в A11 (-), A12 (+), A13 (сигнал).
- Подключите USB-кабель от компьютера к Arduino.
Ниже фото собранных схем.
Запуск приложения на Raspberry Pi (Windows 10 IoT Core)
- Выберите конфигурацию Debug, ARM, Remote Machine.
- Правый клик на проекте → Properties → вкладка Debug.
- В поле Remote machine введите IP-адрес Raspberry Pi 2, снимите галочку Use authentication.
- Нажмите F5. Приложение развернётся на устройстве (первый раз может занять несколько минут).
Запуск приложения на Arduino
Скетч доступен в GitHub в файле Dht11_Speed. Откройте его в Arduino IDE, загрузите в Arduino (Ctrl+U), откройте Serial Monitor (Ctrl+Shift+M). Видео ниже показывает процесс.
Запуск приложения на Raspbian
C-код для Raspberry Pi доступен в GitHub в файле Dht11.c. Исходник нужно скопировать на Pi и скомпилировать там. Я использую WinSCP для копирования. Требуется установленный wiringPi.
Команда компиляции:
gcc -o Dht11_Speed Dht11_Speed.c -L/usr/local/lib -lwiringPi -std=c99 -lm
Запуск:
sudo ./Dht11_Speed 1000 10
Где 1000 — задержка между измерениями в мс (1 сек), 10 — количество измерений.
Видео подробно показывает копирование и компиляцию. Установка Raspbian: raspberrypi.org/downloads/raspbian/.
Видео
Демонстрация работы приложения на всех трёх платформах. Рекомендую смотреть в YouTube в режиме «Театр» для лучшего качества.
Исходный код
Visual Studio 2015 C#/C++ Source Code
https://github.com/porrey/dht.git
Схемы (Fritzing)
Dht11_RPi2.fzz — схема для Raspberry Pi 2


Dht11_Arduino.fzz — схема для Arduino

Производственный процесс
- Сборка логгера температуры на Raspberry Pi с $5 I2C датчиком
- ИК-датчик температуры TMP006 с Raspberry Pi: библиотека Python и руководство по настройке
- Создание удалённого датчика температуры на Raspberry Pi и Python — пошаговое руководство
- Как подключить однопроводный датчик температуры DS1820 к Raspberry Pi через GPIO
- Подключение цифрового термометра DS18B20 1-Wire к Raspberry Pi — пошаговое руководство
- Создание многодатчиковой системы мониторинга температуры и света с Raspberry Pi и DS18B20
- Создайте домашний монитор температуры на Raspberry Pi с MCP9808, InfluxDB и Grafana
- Подключение Raspberry Pi 3 к датчику DHT11 и загрузка данных в облако ThingsIo.ai
- Точный датчик температуры подшипников: обнаружение и мониторинг
- Точное инфракрасное температурное измерение для цветозависимых процессов