Tìm kiếm mã

Bài 20/31: Hiển thị nhiệt độ và độ ẩm từ DHT11 trên màn hình LCD

Bài 20/31: Hiển thị nhiệt độ và độ ẩm từ DHT11 trên màn hình LCD

Hướng dẫn này trình bày cách kết hợp cảm biến nhiệt độ và độ ẩm DHT11 với màn hình LCD1602 hỗ trợ I2C để tạo ra một trạm giám sát môi trường nhỏ gọn. Thay vì đọc dữ liệu cảm biến thô từ màn hình nối tiếp, bạn sẽ học cách hiển thị số liệu nhiệt độ và độ ẩm trực tiếp trên màn hình ký tự 16x2. Dự án này lý tưởng để xây dựng một trạm thời tiết để bàn, một thiết bị giám sát nhà kính nhỏ hoặc thêm màn hình hiển thị cục bộ vào bất kỳ dự án tự động hóa gia đình nào. Giao diện I2C giúp đơn giản hóa việc đấu dây, khiến dự án này dễ tiếp cận với người mới bắt đầu và là một bổ sung nhanh chóng cho những người có kinh nghiệm.

LCD_sunFounder

Dưới đây là một vài ý tưởng thực tế về những gì bạn có thể xây dựng với kiến thức này:

  • Một trạm thời tiết để bàn hiển thị điều kiện phòng hiện tại.
  • Một màn hình nhỏ gọn cho hồ cạn bò sát hoặc cây cảnh.
  • Một màn hình hiển thị cục bộ cho phòng máy chủ hoặc môi trường xưởng làm việc.
  • Một mô-đun cơ sở cho một hệ thống tự động hóa gia đình phức tạp hơn.

Phần cứng và Linh kiện

Để xây dựng dự án này, bạn sẽ cần các linh kiện sau:

  • Arduino Uno (hoặc bo mạch tương thích)
  • Màn hình LCD1602 với mô-đun giao diện I2C
  • Cảm biến nhiệt độ và độ ẩm DHT11
  • Một điện trở kéo lên 4.7kΩ hoặc 10kΩ (nếu sử dụng cảm biến DHT11 trần)
  • Dây cắm jumper
  • Breadboard (tùy chọn, để kết nối dễ dàng hơn)

Hiểu về LCD1602 I2C

LCD1602 là một màn hình ký tự phổ biến với 16 cột và 2 hàng. Mô-đun "I2C" được hàn ở mặt sau của màn hình là chìa khóa cho sự đơn giản của nó. Mô-đun này chuyển đổi giao diện song song của LCD thành giao diện nối tiếp I2C, chỉ cần hai dây cho dữ liệu (SDA và SCL) và hai dây cho nguồn điện (VCC và GND). Điều này giảm đáng kể số chân cần thiết trên Arduino của bạn, để lại nhiều chân hơn cho các cảm biến và thiết bị truyền động khác. Mô-đun cũng bao gồm một chiết áp nhỏ để điều chỉnh độ tương phản của màn hình, điều này rất quan trọng để đảm bảo văn bản hiển thị rõ ràng. Địa chỉ I2C của mô-đun có thể được thay đổi bằng các jumper hàn nhỏ (A0, A1, A2) trên bo mạch, cho phép nhiều thiết bị I2C cùng tồn tại trên cùng một bus.

Hướng dẫn Đấu dây

LCD1602_wiring_DHT11_nopcb_bb

Kết nối các linh kiện như trong sơ đồ dưới đây. LCD I2C sử dụng các chân I2C của Arduino, trong khi cảm biến DHT11 sử dụng một chân kỹ thuật số.

Đối với LCD1602-I2C:

  • VCC đến 5V của Arduino
  • GND đến GND của Arduino
  • SDA đến A4 của Arduino
  • SCL đến A5 của Arduino

Đối với cảm biến DHT11:

  • VCC (Chân 1) đến 5V của Arduino
  • Data (Chân 2) đến Chân kỹ thuật số 2 của Arduino (với điện trở kéo lên 10kΩ đến 5V)
  • NC (Chân 3) - Không kết nối
  • GND (Chân 4) đến GND của Arduino

(trong video tại 25:16)

Thiết lập Thư viện

Dự án này yêu cầu hai thư viện. Thư viện Wire.h là một phần của quá trình cài đặt Arduino tiêu chuẩn. Bạn sẽ cần cài đặt thư viện LiquidCrystal_I2C và thư viện dht11. Video trình bày cách cài đặt chúng. Bạn có thể tải xuống các thư viện từ các liên kết được cung cấp trong mô tả video hoặc từ trang web Robojax. Sau khi tải xuống, bạn có thể cài đặt chúng qua Arduino IDE bằng cách điều hướng đến Sketch > Include Library > Add .ZIP Library... và chọn các tệp đã tải xuống. (trong video tại 06:16)

Tìm Địa chỉ I2C của LCD

Trước khi có thể sử dụng màn hình, bạn phải xác định địa chỉ I2C của nó. Địa chỉ phổ biến nhất là 0x27 hoặc 0x3F, nhưng nó có thể khác. Để tìm nó, bạn có thể sử dụng một sketch quét I2C. Đây là một chương trình đơn giản quét bus I2C và báo cáo bất kỳ địa chỉ nào tìm thấy cho Màn hình nối tiếp. Tải mã quét lên, mở Màn hình nối tiếp ở tốc độ 9600 baud, và nó sẽ hiển thị địa chỉ của LCD của bạn. (trong video tại 08:11)

Giải thích Mã

Phần này giải thích các phần chính, có thể cấu hình bởi người dùng của mã. Chương trình đầy đủ có sẵn để tải xuống bên dưới bài viết.

Mã bắt đầu bằng việc bao gồm các thư viện cần thiết và định nghĩa các chân và đối tượng được sử dụng.

// tệp tiêu đề từ GetHub: https://github.com/adidax/dht11
#include <dht11.h>
dht11 DHT11; // tạo đối tượng của DHT11
#define dhtpin 2 // đặt chân để kết nối với DHT11

// bắt đầu cài đặt cho LCD1602-I2C
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Đặt địa chỉ LCD thành 0x3F cho màn hình 16 ký tự và 2 dòng
LiquidCrystal_I2C lcd(0x3F, 16, 2);
// kết thúc cài đặt cho LCD1602-I2C

Đây là những dòng quan trọng nhất để cấu hình cho thiết lập của bạn:

  • #define dhtpin 2: Dòng này định nghĩa chân Arduino kết nối với chân dữ liệu của cảm biến DHT11. Thay đổi số 2 nếu bạn sử dụng một chân khác.
  • LiquidCrystal_I2C lcd(0x3F, 16, 2);: Dòng này tạo đối tượng LCD. Tham số đầu tiên, 0x3F, là địa chỉ I2C bạn đã tìm thấy trong bước trước. 162 xác định số cột và số hàng của màn hình của bạn. Cập nhật địa chỉ nếu trình quét của bạn tìm thấy một địa chỉ khác (ví dụ: 0x27).

Mã sử dụng một hàm tùy chỉnh, getTemp(), để đọc nhiệt độ và chuyển đổi sang các đơn vị khác nhau. Đây là một tính năng mạnh mẽ giúp mã có thể tái sử dụng cho các ứng dụng khác nhau.

float getTemp(char type) {
    float temp = (float)DHT11.temperature;//lấy nhiệt độ
  if(type =='F')
  {
    return temp * 1.8 + 32;// chuyển sang độ F
  }else if(type =='K')
  {
    return temp + 274.15;// chuyển sang độ K
  }else{
   return temp; 
  }  
}

Để sử dụng hàm này, bạn gọi nó với một đối số ký tự đơn đại diện cho đơn vị mong muốn. Ví dụ: getTemp('C') trả về nhiệt độ theo độ C, getTemp('F') trả về theo độ F và getTemp('K') trả về theo độ K. Hàm đọc nhiệt độ thô từ cảm biến DHT11 và áp dụng công thức chuyển đổi cần thiết. Điều này cho phép bạn dễ dàng thay đổi đơn vị hiển thị trong loop() chính mà không cần viết lại logic đọc cảm biến. Vòng lặp chính in nhiệt độ và độ ẩm lên LCD bằng các hàm lcd.setCursor()lcd.print() để kiểm soát vị trí hiển thị các giá trị trên màn hình.

Hiển thị ký hiệu độ

Bộ ký tự chuẩn của LCD HD44780 không bao gồm ký hiệu độ chuyên dụng (°). Để hiển thị nó, bạn phải sử dụng hàm lcd.write() với giá trị thập phân của ký tự từ ROM của LCD. Đối với ký hiệu độ, giá trị này là 223. Mã minh họa điều này bằng cách sử dụng lcd.print((char)223); để in ký hiệu sau giá trị nhiệt độ. (trong video tại 30:16)

Trình diễn dự án trực tiếp

Sau khi mã được tải lên, màn hình sẽ hiển thị thông báo khởi động trước khi xóa và hiển thị nhiệt độ và độ ẩm hiện tại. Dòng đầu tiên của màn hình hiển thị văn bản "LCD1602 DHT11", trong khi dòng thứ hai hiển thị nhiệt độ theo độ C, theo sau là ký hiệu độ và "C", sau đó là nhiệt độ theo độ F, theo sau là ký hiệu độ và "F". Giá trị độ ẩm được in ra màn hình nối tiếp. Trình diễn trong video cho thấy màn hình cập nhật mỗi nửa giây khi cảm biến được giữ, phản ánh chính xác điều kiện môi trường xung quanh. (trong video tại 29:42)

Hiển thị điện áp từ biến trở trên LCD được trình bày trong Bài 20/31: Hiển thị điện áp trên LCD1602.

Sử dụng cùng một LCD để hiển thị khoảng cách từ cảm biến siêu âm được trình bày trong Bài 20/31: Sử dụng LCD1602 với Arduino hiển thị nhiệt độ, điện áp và khoảng cách | Robojax.

Các dự án liên quan từ video này

Chương

  • [00:00] Giới thiệu về LCD1602 và tổng quan dự án
  • [01:30] Giải thích phần cứng LCD1602 và mô-đun I2C
  • [02:47] Điều chỉnh độ tương phản LCD
  • [03:14] Sơ đồ chân LCD và cấu hình địa chỉ I2C
  • [05:28] Sơ đồ đấu dây cho LCD1602
  • [06:16] Cài đặt thư viện LiquidCrystal_I2C
  • [08:11] Tìm địa chỉ I2C bằng máy quét
  • [09:28] Mã cơ bản để in văn bản trên LCD
  • [11:10] Ví dụ: con trỏ nhấp nháy và ký tự tùy chỉnh
  • [13:46] Tạo và sử dụng ký tự tùy chỉnh
  • [18:51] Ví dụ hiển thị nối tiếp
  • [23:16] Cuộn văn bản trên LCD
  • [24:36] Kết hợp mã cảm biến DHT11 với LCD
  • [30:16] Hiển thị ký hiệu độ
  • [32:03] Loại bỏ dấu thập phân khỏi nhiệt độ
  • [33:00] Hiển thị điện áp từ biến trở trên LCD
  • [35:56] Hiển thị khoảng cách từ cảm biến siêu âm

Hình ảnh

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
Ngôn ngữ: 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; 
  }
  
}

Tài nguyên & tài liệu tham khảo

Tập tin📁

Thư viện Arduino (tệp nén)

Hướng dẫn Sử dụng