Выводим температуру и влажность помещения на LCD I2C дисплей. Подключение датчика DHT11 к Arduino UNO

Я продолжаю свое увлечение электроникой. Буквально вчера пришла посылка с моим набором для изучения Arduino UNO — конечно же сразу захотелось что-нибудь собрать.

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

Очень хотелось вывести показания датчика не только на экран монитора, но и на дисплей. Убив несколько часов на поиск и изучение статей по данной теме, я так и не смог заставить все работать нужным образом. Все готовые решения содержали ошибки или недомолвки, либо применялись другие компоненты — дисплей показывал что угодно, но только не температуру и влажность. Поскольку метод «с наскока» не удался, пришлось не просто копировать готовый код, а разбираться в том, как он работает. Но в итоге я все же смог получить нужную программу (ссылка на скачивание в конце статьи) и загрузить ее в микроконтроллер, ура:

Датчики температуры и влажности подключенные к Arduino

Хочу отметить, что я не писал весь код с нуля — часть взята из тестовых файлов входящих в состав библиотек, часть - из найденных статей, что-то переделал я сам. В общем, это некая компиляция, приведенная к работающему состоянию.

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

Ниже я подробно расскажу как повторить данную конструкцию (если кому-то захочется) и приведу текст скетча для Arduino IDE.

Начнем с дисплея:

LCD I2C дисплей

На картинке приведен вид спереди и сзади. Как можно увидеть, мой экземпляр снабжен интерфейсом I2C (маленькая платка на задней стороне). Данный интерфейс очень упрощает подключение дисплея к Arduino — нужно использовать всего 4 контакта:

GRD — минус питания («земля»)
VCC — питание +5V
SDA — линия данных
SLC — линия синхронизации

Без I2C подключение LCD дисплея осуществляется несколько сложнее.

Датчик DH11 так же имеет 4 контакта, при этом один из них вообще не используется. Мой дачик уже расположен на платке, на которой сразу установлен дополнительный резистор (который требуется для нормальной работы датчика) и выведено 3 ножки:

датчик влажности dht11

Левая подписана как S — с нее поступает сигнал, правая — «-», ну а средняя получается «+» на нее подается питание.

Итак, собираем схему:

схема подключения датчиков в Arduino Uno

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

1) Подключаем датчик:

  • S на A0
  • + на +5V
  • —  на GND

2) Подключаем LCD дисплей:

  • SDA на A4
  • SLC на A5
  • VCC на +5V (на Arduino UNO такой pin всего один и там уже обосновался провод питания идущий от датчика, поэтому лучше соединить VCC дисплея с «+» датчика (например джампером) или использовать для одного из устройств внешнее питание)
  • GND на GND Arduino («земли» на UNO как раз две, так что тут никаких проблем)

Сборка на этом закончена, осталось прошить микроконтроллер.
Вот код скетча:

#include <Wire.h> // Добавляем необходимые библиотеки
#include <LiquidCrystal_I2C.h>
#include "DHT.h"
#define DHTPIN A0 // к какому пину будет подключен сигнальный выход датчика
//выбор используемого датчика
#define DHTTYPE DHT11 // DHT 11
//#define DHTTYPE DHT22 // DHT 22 (AM2302)
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
//инициализация датчика
DHT dht(DHTPIN, DHTTYPE);
byte degree[8] = // кодируем символ градуса
{
B00111,
B00101,
B00111,
B00000,
B00000,
B00000,
B00000,
};
LiquidCrystal_I2C lcd(0x27,16,2); // Задаем адрес и размерность дисплея
void setup()
{
lcd.init(); // Инициализация lcd
lcd.backlight(); // Включаем подсветку
lcd.createChar(1, degree); // Создаем символ под номером 1
Serial.begin(9600);
dht.begin();
}
void loop() {
// Добавляем паузы в несколько секунд между измерениями
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
float t = dht.readTemperature();
// Read temperature as Fahrenheit
float f = dht.readTemperature(true);
// Выводим показания влажности и температуры
lcd.setCursor(0, 0); // Устанавливаем курсор в начало 1 строки
lcd.print("Hum = % "); // Выводим текст
lcd.setCursor(7, 0); // Устанавливаем курсор на 7 символ
lcd.print(h, 1); // Выводим на экран значение влажности
lcd.setCursor(0, 1); // Устанавливаем курсор в начало 2 строки
lcd.print("Temp = \1C "); // Выводим текст, \1 - значок градуса
lcd.setCursor(7, 1); // Устанавливаем курсор на 7 символ
lcd.print(t,1); // Выводим значение температуры
}

В данном коде используются библиотеки DHT и LiquidCrystal_I2C, которые не входят в стандартный пакет Arduino IDE. В сети множество разных библиотек с такими же названиями. И несмотря на их схожесть, не со всеми версиями данный код работает. Чтобы вам не тратить свое время и нервы на поиск рабочего варианта, я прикладываю к данной статье архив, в котором содержатся данные библиотеки и сам скетч для Arduino IDE.  Библиотеки надо разархивировать и поместить в папку C:\Program Files (x86)\Arduino\libraries после чего перезапустить программу Arduino IDE.

Я думаю, что опытные разработчики найдут к чему придраться в данном коде (например, здесь нет обработчика ошибок), но на данном этапе, для меня главное, что он работает. Если вы будете применять детали схожие с моими, должно заработать и у вас. Конечно, рекомендую не просто скопировать, но и попытаться понять за что отвечает каждая строчка кода (комментарии в коде сильно в этом помогут).

Быстрые результаты в любом деле это не цель, а всего лишь мотивация, которая должна подталкивать вас копать глубже. Помните об этом! =)

P.S. Статья нашла своих читателей, что меня, как автора, очень радует. Если у Вас что-то не получается, обратите внимание на комментарии, там много полезной информации. Огромное спасибо всем читателям, поделившимся своим опытом!

Комментарии приветствуются! Уже 12 :)

  1. Игорь:

    Спасибо всё заработало. в программе изменил датчик на 22.

  2. Anton Nikolaev:

    Статья отличная, подробная и понятная.

    Но экран был светел и пуст, несмотря на различные шаманства.

    Покрутил регулятор яркости сзади платы, и волшебным образом текст проявился.

    Добавлю, что при обратной крайности регулятора вместо текста видны белые квадраты как в комментарии Григория Щербакова.

    Надеюсь, это сбережёт кому-то время и нервы.

  3. Petr:

    Здравствуйте, у меня ошибка:

    exit status 1

    'DHT' does not name a type

  4. Сергей:

    Все работает, спасибо тебе дружище и процветания

  5. Дима:

    Разобрался! На моем ARDUINO MEGA 2560 надо подключать I2C не на А4 А5 как везде пишут, а на SDA 20 и SCL 21! Может кому поможет. Я 6 часов на это потерял!

  6. Дима:

    На ардуино мега не работает на дисплее просто черные квадратики в линию и все.

    Подскажите в чем дело?

    Все собрал по схеме.

    Код записал все нормально, но почему-то не работает.

  7. Dmitry:

    А ГДЕ ССЫЛКА НА БИБЛИОТЕКУ

    • Михаил Царев:

      Фраза в статье «архив, в котором содержатся данные библиотеки и сам скетч для Arduino IDE.» — это и есть ссылка, она выделена другим цветом — щелкните и начнется закачка архива.

  8. Maksim:

    Спасибо) для пробной версии очень даже хорошо!

  9. Алексей:

    Спасибо.

    • Владимир:

      Так как решить проблему с тем что ничего нет на этом экране???

      • Владимир:

        блин всё дело в контрастности лсд дисплея было не настроено)))

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *