ค้นหาโค้ด

บทเรียน 20/31: การแสดงอุณหภูมิและความชื้นจาก DHT11 บนหน้าจอ LCD

บทเรียน 20/31: การแสดงอุณหภูมิและความชื้นจาก DHT11 บนหน้าจอ LCD

บทช่วยสอนนี้สาธิตวิธีการรวมเซนเซอร์วัดอุณหภูมิและความชื้น DHT11 เข้ากับจอแสดงผล LCD1602 ที่รองรับ I2C เพื่อสร้างสถานีตรวจสอบสภาพแวดล้อมขนาดกะทัดรัด แทนที่จะอ่านข้อมูลเซนเซอร์ดิบจากซีเรียลมอนิเตอร์ คุณจะได้เรียนรู้การแสดงค่าอุณหภูมิและความชื้นแบบเรียลไทม์บนหน้าจอตัวอักษรขนาด 16x2 โครงงานนี้เหมาะสำหรับการสร้างสถานีตรวจอากาศบนโต๊ะทำงาน เครื่องตรวจสอบเรือนกระจกขนาดเล็ก หรือเพิ่มจอแสดงผลในท้องถิ่นให้กับโครงงานระบบอัตโนมัติภายในบ้านใดๆ อินเทอร์เฟซ I2C ช่วยลดความซับซ้อนของการเดินสายไฟ ทำให้โครงงานนี้เข้าถึงได้ง่ายสำหรับผู้เริ่มต้นและเป็นส่วนเสริมที่รวดเร็วสำหรับผู้ที่มีประสบการณ์

LCD_sunFounder

ต่อไปนี้เป็นแนวคิดเชิงปฏิบัติสองสามประการเกี่ยวกับสิ่งที่คุณสามารถสร้างได้ด้วยความรู้นี้:

  • สถานีตรวจอากาศบนโต๊ะทำงานที่แสดงสภาพห้องปัจจุบัน
  • จอแสดงผลขนาดกะทัดรัดสำหรับสวนขวดสัตว์เลื้อยคลานหรือพืช
  • จอแสดงผลในท้องถิ่นสำหรับห้องเซิร์ฟเวอร์หรือสภาพแวดล้อมในเวิร์กช็อป
  • โมดูลพื้นฐานสำหรับระบบอัตโนมัติภายในบ้านที่ซับซ้อนยิ่งขึ้น

ฮาร์ดแวร์และส่วนประกอบ

ในการสร้างโครงงานนี้ คุณจะต้องมีส่วนประกอบต่อไปนี้:

  • Arduino Uno (หรือบอร์ดที่เข้ากันได้)
  • จอแสดงผล LCD1602 พร้อมโมดูลอินเทอร์เฟซ I2C
  • เซนเซอร์วัดอุณหภูมิและความชื้น DHT11
  • ตัวต้านทานแบบดึงขึ้น 4.7kΩ หรือ 10kΩ (หากใช้เซนเซอร์ DHT11 แบบเปลือย)
  • สายจัมเปอร์
  • เบรดบอร์ด (ไม่จำเป็น สำหรับการเชื่อมต่อที่ง่ายขึ้น)

ทำความเข้าใจกับ I2C LCD1602

LCD1602 เป็นจอแสดงผลตัวอักษรทั่วไปที่มี 16 คอลัมน์และ 2 แถว โมดูล "I2C" ที่บัดกรีไว้ที่ด้านหลังของจอแสดงผลเป็นกุญแจสำคัญสู่ความเรียบง่าย โมดูลนี้แปลงอินเทอร์เฟซแบบขนานของ LCD เป็นอินเทอร์เฟซ I2C แบบอนุกรม ซึ่งต้องใช้สายเพียงสองเส้นสำหรับข้อมูล (SDA และ SCL) และสองเส้นสำหรับไฟ (VCC และ GND) ซึ่งช่วยลดจำนวนพินที่จำเป็นบน Arduino ของคุณได้อย่างมาก ทำให้เหลือพินสำหรับเซนเซอร์และแอคชูเอเตอร์อื่นๆ มากขึ้น โมดูลนี้ยังรวมโพเทนชิโอมิเตอร์ขนาดเล็กสำหรับปรับความคมชัดของจอแสดงผล ซึ่งมีความสำคัญอย่างยิ่งเพื่อให้แน่ใจว่าข้อความมองเห็นได้ชัดเจน ที่อยู่ I2C ของโมดูลสามารถเปลี่ยนแปลงได้โดยใช้จัมเปอร์บัดกรีขนาดเล็ก (A0, A1, A2) บนบอร์ด ทำให้อุปกรณ์ I2C หลายตัวสามารถทำงานร่วมกันบนบัสเดียวกันได้

คู่มือการเดินสายไฟ

LCD1602_wiring_DHT11_nopcb_bb

เชื่อมต่อส่วนประกอบต่างๆ ตามที่แสดงในแผนภาพด้านล่าง LCD แบบ 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 (พร้อมตัวต้านทานแบบดึงขึ้น 10kΩ ไปยัง 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 ของ LCD ของคุณ

ก่อนที่คุณจะใช้จอแสดงผลได้ คุณต้องระบุที่อยู่ I2C ของมันก่อน ที่อยู่ที่พบบ่อยที่สุดคือ 0x27 หรือ 0x3F แต่อาจแตกต่างกันได้ ในการค้นหา คุณสามารถใช้สเก็ตช์สแกนเนอร์ I2C ซึ่งเป็นโปรแกรมง่ายๆ ที่สแกนบัส I2C และรายงานที่อยู่ที่พบไปยังซีเรียลมอนิเตอร์ อัปโหลดโค้ดสแกนเนอร์ เปิดซีเรียลมอนิเตอร์ที่ 9600 บอด แล้วมันจะแสดงที่อยู่ของ LCD ของคุณ (ในวิดีโอที่ 08:11)

คำอธิบายโค้ด

ส่วนนี้อธิบายส่วนสำคัญของโค้ดที่ผู้ใช้สามารถกำหนดค่าได้ โปรแกรมเต็มรูปแบบสามารถดาวน์โหลดได้ด้านล่างบทความ

โค้ดเริ่มต้นด้วยการรวมไลบรารีที่จำเป็นและกำหนดพินและออบเจกต์ที่ใช้

// 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

ต่อไปนี้เป็นบรรทัดที่สำคัญที่สุดที่ต้องกำหนดค่าสำหรับการตั้งค่าของคุณ:

  • #define dhtpin 2: กำหนดพิน Arduino ที่เชื่อมต่อกับพินข้อมูลของเซนเซอร์ DHT11 เปลี่ยนหมายเลข 2 หากคุณใช้พินอื่น
  • LiquidCrystal_I2C lcd(0x3F, 16, 2);: บรรทัดนี้สร้างออบเจกต์ LCD พารามิเตอร์แรก 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 โดยใช้ฟังก์ชัน lcd.setCursor() และ lcd.print() เพื่อควบคุมตำแหน่งที่ค่าปรากฏบนหน้าจอ

การแสดงสัญลักษณ์องศา

ชุดอักขระมาตรฐานของจอ LCD HD44780 ไม่มีสัญลักษณ์องศาโดยเฉพาะ (°) ในการแสดง คุณต้องใช้ฟังก์ชัน lcd.write() พร้อมกับค่าเลขฐานสิบของอักขระจาก ROM ของจอ LCD สำหรับสัญลักษณ์องศา ค่านี้คือ 223 โค้ดสาธิตสิ่งนี้โดยใช้ lcd.print((char)223); เพื่อพิมพ์สัญลักษณ์หลังค่าอุณหภูมิ (ในวิดีโอที่ 30:16)

การสาธิตโปรเจกต์จริง

เมื่ออัปโหลดโค้ดแล้ว จอแสดงผลจะแสดงข้อความเริ่มต้นก่อนที่จะล้างและแสดงอุณหภูมิและความชื้นปัจจุบัน บรรทัดแรกของจอแสดงผลแสดงข้อความ "LCD1602 DHT11" ในขณะที่บรรทัดที่สองแสดงอุณหภูมิเป็นเซลเซียส ตามด้วยสัญลักษณ์องศาและ "C" จากนั้นแสดงอุณหภูมิเป็นฟาเรนไฮต์ ตามด้วยสัญลักษณ์องศาและ "F" ค่าความชื้นจะถูกพิมพ์ไปยังซีเรียลมอนิเตอร์ การสาธิตในวิดีโอแสดงการอัปเดตจอแสดงผลทุกครึ่งวินาทีในขณะที่ถือเซนเซอร์ ซึ่งสะท้อนสภาพแวดล้อมโดยรอบได้อย่างแม่นยำ (ในวิดีโอที่ 29:42)

การแสดงแรงดันไฟฟ้าจากโพเทนชิโอมิเตอร์บนจอ LCD มีอยู่ใน บทที่ 20/31: การแสดงแรงดันไฟฟ้าบน LCD1602

การใช้จอ LCD เดียวกันเพื่อแสดงระยะทางจากเซนเซอร์อัลตราโซนิกมีอยู่ใน บทที่ 20/31: การใช้ LCD1602 กับ Arduino แสดงอุณหภูมิ แรงดันไฟฟ้า และระยะทาง | Robojax

โปรเจกต์ที่เกี่ยวข้องจากวิดีโอนี้

บทต่างๆ

  • [00:00] แนะนำ LCD1602 และภาพรวมโปรเจกต์
  • [01:30] คำอธิบายฮาร์ดแวร์ LCD1602 และโมดูล I2C
  • [02:47] การปรับคอนทราสต์ของจอ LCD
  • [03:14] การกำหนดขาของ LCD และการตั้งค่าที่อยู่ I2C
  • [05:28] แผนผังการเดินสายสำหรับ LCD1602
  • [06:16] การติดตั้งไลบรารี LiquidCrystal_I2C
  • [08:11] การค้นหาที่อยู่ I2C ด้วยสแกนเนอร์
  • [09:28] โค้ดพื้นฐานสำหรับพิมพ์ข้อความบนจอ LCD
  • [11:10] ตัวอย่าง: เคอร์เซอร์กระพริบและอักขระที่กำหนดเอง
  • [13:46] การสร้างและใช้อักขระที่กำหนดเอง
  • [18:51] ตัวอย่างการแสดงผลแบบซีเรียล
  • [23:16] การเลื่อนข้อความบนจอ LCD
  • [24:36] การรวมโค้ดเซนเซอร์ DHT11 เข้ากับจอ LCD
  • [30:16] การแสดงสัญลักษณ์องศา
  • [32:03] การลบจุดทศนิยมออกจากอุณหภูมิ
  • [33:00] การแสดงแรงดันไฟฟ้าจากโพเทนชิโอมิเตอร์บนจอ LCD
  • [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)

คู่มือผู้ใช้