Код для поиска

Урок 20/31: Отображение температуры и влажности с DHT11 на ЖК-экране

Урок 20/31: Отображение температуры и влажности с DHT11 на ЖК-экране

В этом руководстве демонстрируется, как объединить датчик температуры и влажности DHT11 с дисплеем LCD1602 с поддержкой I2C для создания компактной станции мониторинга окружающей среды. Вместо чтения необработанных данных с датчика из последовательного монитора вы научитесь отображать текущие показания температуры и влажности на символьном экране 16x2. Этот проект идеально подходит для создания настольной метеостанции, небольшого монитора для теплицы или добавления локального дисплея в любой проект домашней автоматизации. Интерфейс I2C упрощает подключение, что делает этот проект доступным для новичков и быстрым дополнением для опытных мастеров.

LCD_sunFounder

Вот несколько практических идей, что можно создать, используя эти знания:

  • Настольная метеостанция, показывающая текущие условия в комнате.
  • Компактный дисплей для террариума с рептилиями или растениями.
  • Локальный дисплей для серверной или мастерской.
  • Базовый модуль для более сложной системы домашней автоматизации.

Аппаратное обеспечение и компоненты

Для создания этого проекта вам понадобятся следующие компоненты:

  • Arduino Uno (или совместимая плата)
  • Дисплей LCD1602 с модулем интерфейса I2C
  • Датчик температуры и влажности DHT11
  • Подтягивающий резистор 4,7 кОм или 10 кОм (при использовании датчика DHT11 без модуля)
  • Соединительные провода
  • Макетная плата (необязательно, для удобства подключения)

Понимание I2C LCD1602

LCD1602 — это распространенный символьный дисплей с 16 столбцами и 2 строками. Модуль «I2C», припаянный к задней части дисплея, является ключом к его простоте. Этот модуль преобразует параллельный интерфейс ЖК-дисплея в последовательный интерфейс I2C, для которого требуется только два провода для данных (SDA и SCL) и два для питания (VCC и GND). Это значительно сокращает количество контактов, необходимых на вашей Arduino, оставляя больше свободных для других датчиков и исполнительных устройств. Модуль также включает небольшой потенциометр для регулировки контрастности дисплея, что крайне важно для обеспечения видимости текста. Адрес I2C модуля можно изменить с помощью небольших паяных перемычек (A0, A1, A2) на плате, что позволяет нескольким устройствам I2C сосуществовать на одной шине.

Руководство по подключению

LCD1602_wiring_DHT11_nopcb_bb

Подключите компоненты, как показано на схеме ниже. ЖК-дисплей I2C использует контакты I2C Arduino, а датчик DHT11 использует цифровой контакт.

Для LCD1602-I2C:

  • VCC к контакту Arduino 5V
  • GND к контакту Arduino GND
  • SDA к контакту Arduino A4
  • SCL к контакту Arduino A5

Для датчика DHT11:

  • VCC (контакт 1) к контакту Arduino 5V
  • Data (контакт 2) к цифровому контакту Arduino 2 (с подтягивающим резистором 10 кОм к 5V)
  • NC (контакт 3) — не подключен
  • GND (контакт 4) к контакту Arduino GND

(на видео в 25:16)

Настройка библиотек

Для этого проекта требуются две библиотеки. Библиотека Wire.h является частью стандартной установки Arduino. Вам необходимо установить библиотеку LiquidCrystal_I2C и библиотеку dht11. В видео показано, как их установить. Вы можете загрузить библиотеки по ссылкам, указанным в описании видео, или с веб-сайта Robojax. После загрузки вы можете установить их через Arduino IDE, перейдя в Sketch > Include Library > Add .ZIP Library... и выбрав загруженные файлы. (на видео в 06:16)

Поиск I2C-адреса вашего ЖК-дисплея

Прежде чем использовать дисплей, необходимо определить его I2C-адрес. Наиболее распространенный адрес — 0x27 или 0x3F, но он может отличаться. Чтобы найти его, можно использовать скетч сканера I2C. Это простая программа, которая сканирует шину I2C и сообщает о найденных адресах в последовательный монитор. Загрузите код сканера, откройте последовательный монитор на скорости 9600 бод, и он отобразит адрес вашего ЖК-дисплея. (на видео в 08:11)

Объяснение кода

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

Код начинается с включения необходимых библиотек и определения используемых контактов и объектов.

// заголовочный файл с GetHub: https://github.com/adidax/dht11
#include <dht11.h>
dht11 DHT11; // создать объект DHT11
#define dhtpin 2 // установить контакт для подключения к DHT11

// начало настроек для LCD1602-I2C
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Установить адрес ЖК-дисплея 0x3F для дисплея 16 символов и 2 строк
LiquidCrystal_I2C lcd(0x3F, 16, 2);
// конец настроек для LCD1602-I2C

Это наиболее важные строки для настройки вашей конфигурации:

  • #define dhtpin 2: Это определяет контакт Arduino, подключенный к контакту данных датчика DHT11. Измените число 2, если вы используете другой контакт.
  • LiquidCrystal_I2C lcd(0x3F, 16, 2);: Эта строка создает объект ЖК-дисплея. Первый параметр, 0x3F, — это I2C-адрес, который вы нашли на предыдущем шаге. 16 и 2 определяют количество столбцов и строк вашего дисплея. Обновите адрес, если ваш сканер обнаружил другой (например, 0x27).

В коде используется пользовательская функция getTemp() для чтения температуры и её преобразования в различные единицы измерения. Это мощная функция, которая делает код пригодным для повторного использования в разных приложениях.

float getTemp(char type) {
    float temp = (float)DHT11.temperature;// получить температуру
  if(type =='F')
  {
    return temp * 1.8 + 32;// преобразовать в Фаренгейты
  }else if(type =='K')
  {
    return temp + 274.15;// преобразовать в Кельвины
  }else{
   return temp; 
  }  
}

Чтобы использовать эту функцию, вы вызываете её с одним символьным аргументом, обозначающим нужную единицу измерения. Например, getTemp('C') возвращает температуру в градусах Цельсия, getTemp('F') — в Фаренгейтах, а getTemp('K') — в Кельвинах. Функция считывает исходную температуру с датчика DHT11 и применяет необходимую формулу преобразования. Это позволяет легко менять отображаемую единицу измерения в основном цикле loop() без переписывания логики чтения датчика. Основной цикл выводит температуру и влажность на ЖК-дисплей с помощью функций lcd.setCursor() и lcd.print(), которые управляют положением значений на экране.

Отображение символа градуса

Стандартный набор символов ЖК-дисплея HD44780 не включает отдельный символ градуса (°). Чтобы его отобразить, необходимо использовать функцию lcd.write() с десятичным значением символа из ПЗУ дисплея. Для символа градуса это значение равно 223. В коде это демонстрируется с помощью lcd.print((char)223); для вывода символа после значения температуры. (в видео на 30:16)

Демонстрация живого проекта

После загрузки кода на дисплее появится приветственное сообщение, после чего он очистится и отобразит текущую температуру и влажность. Первая строка дисплея показывает текст «LCD1602 DHT11», а вторая строка показывает температуру в градусах Цельсия, затем символ градуса и «C», а затем температуру в Фаренгейтах, символ градуса и «F». Значение влажности выводится в монитор последовательного порта. Демонстрация в видео показывает, как дисплей обновляется каждые полсекунды, пока датчик удерживается в руке, точно отражая условия окружающей среды. (в видео на 29:42)

Отображение напряжения с потенциометра на ЖК-дисплее рассматривается в Уроке 20/31: Отображение напряжения на LCD1602.

Использование того же ЖК-дисплея для отображения расстояния от ультразвукового датчика рассматривается в Уроке 20/31: Использование LCD1602 с Arduino для отображения температуры, напряжения и расстояния | Robojax.

Связанные проекты из этого видео

Главы

  • [00:00] Введение в LCD1602 и обзор проекта
  • [01:30] Объяснение аппаратной части LCD1602 и модуля I2C
  • [02:47] Регулировка контрастности ЖК-дисплея
  • [03:14] Распиновка ЖК-дисплея и настройка I2C-адреса
  • [05:28] Схема подключения для LCD1602
  • [06:16] Установка библиотеки LiquidCrystal_I2C
  • [08:11] Поиск I2C-адреса с помощью сканера
  • [09:28] Базовый код для вывода текста на ЖК-дисплей
  • [11:10] Примеры: мигающий курсор и пользовательские символы
  • [13:46] Создание и использование пользовательских символов
  • [18:51] Пример вывода в последовательный порт
  • [23:16] Прокрутка текста на ЖК-дисплее
  • [24:36] Объединение кода датчика DHT11 с ЖК-дисплеем
  • [30:16] Отображение символа градуса
  • [32:03] Удаление десятичных знаков из температуры
  • [33:00] Отображение напряжения с потенциометра на ЖК-дисплее
  • [35:56] Отображение расстояния от ультразвукового датчика

Изображения

LCD1602_wiring_DHT11_nopcb_bb
LCD1602_wiring_DHT11_nopcb_bb
LCD_sunFounder
LCD_sunFounder
911-Lesson 20/31: Displaying Temperature and humidity from DHT11 on LCD screen
Язык: C++
/*
Lesson 20/31: Displaying Temperature and humidity from DHT11 on  LCD screen
Get this code and watch video Download and resource page https://robojax.com/RJT603
YouTube video https://www.youtube.com/watch?v=NXAswOc_2zg
 

 * This is the Arduino code for  DHT11 module to read temperature and humidity
 * This code can display temperature in:
 * C is used to get Celsius
 * F is used to get Fahrenheit
 * K is used for Kelvin

 *  * 
 * Written by Ahmad Shamshiri for Robojax
 * on Jan 04, 2018
 * Robojax.com

   Please watch video instruction here https://youtu.be/0XMLnCYkvbE
 This code is available at http://robojax.com/course1/?vid=lecture11
 
with over 100 lectures Free On  YouTube Watch it here http://robojax.com/L/?id=338
Get the code for the course: http://robojax.com/L/?id=339 

  
 * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.* 
 * This code has been download from Robojax.com
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */

// header file from GetHub: https://github.com/adidax/dht11
#include <dht11.h>

dht11 DHT11; // create object of DHT11
#define dhtpin 2 // set the pin to connect to DHT11

// start of settings for LCD1602-I2C
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Set the LCD address to 0x3F for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x3F, 16, 2);
// end of settings for LCD1602-I2C


void setup() {
    Serial.begin(9600);// setting up serial monitor

  // initialize the LCD, 
  lcd.begin();
  // Turn on the blacklight and print a message.
  lcd.backlight();
  lcd.clear();
  lcd.setCursor (0,0); //
  lcd.print("DHT11 Sensor"); 
  delay(2000);
}

void loop() {
	//Robojax Step By Step Arduino Course YouTube Watch it here http://robojax.com/L/?id=338
  DHT11.read(dhtpin);// initialize the reading
  int humidity = DHT11.humidity;// get humidity

  lcd.clear();// clear previous values from screen
  lcd.setCursor (0,0); //character zero, line 1
  lcd.print("LCD1602 DHT11"); // print text 

  // print distance in degrees C
  lcd.setCursor (0,1); //character 0, line 2
  lcd.print(getTemp('C'));// print Temperature Celsius
  lcd.setCursor (4,1); //character 5, line 2 
  lcd.print((char)223);// print degree 
  lcd.setCursor (5,1); //character 6, line 2 
  lcd.print("C");// print C
  
   // print distance degrees F
  lcd.setCursor (7,1); //character 8, line 2
  lcd.print(getTemp('F'));// print distance in cm
  lcd.setCursor (13,1); //character 14, line 2 
  lcd.print((char)223);// print degree 
  lcd.setCursor (14,1); //character 16, line 2 
  lcd.print("F");// print F 
  
  
  //code for Robojax.com video
   Serial.print(getTemp('C'));
   Serial.print("C ");
   Serial.print(getTemp('F'));
   Serial.print("F ");
   Serial.print(getTemp('K'));
   Serial.print("K ");
   Serial.print(" humidity:");
   Serial.print (humidity);
   Serial.print("% ");
   Serial.println();
 delay(500);
}


/*
 * getTemp(char type)
 * type character of upper case 
 * C is used to get Celsius
 * F is used to get Fahrenheit
 * K is used for Kelvin
 */
float getTemp(char type) {
	//Robojax Step By Step Arduino Course YouTube Watch it here http://robojax.com/L/?id=338	
    float temp = (float)DHT11.temperature;//get temp
  if(type =='F')
  {
    return temp * 1.8 + 32;// convert to Fahrenheit
  }else if(type =='K')
  {
    return temp + 274.15;// convert to Kelvin
  }else{
   return temp; 
  }
  
}

Вещи, которые могут вам понадобиться

Файлы📁

Библиотеки Arduino (zip)

Руководство пользователя