บทเรียน 20/31: การแสดงอุณหภูมิและความชื้นจาก DHT11 บนหน้าจอ LCD
บทช่วยสอนนี้สาธิตวิธีการรวมเซนเซอร์วัดอุณหภูมิและความชื้น DHT11 เข้ากับจอแสดงผล LCD1602 ที่รองรับ I2C เพื่อสร้างสถานีตรวจสอบสภาพแวดล้อมขนาดกะทัดรัด แทนที่จะอ่านข้อมูลเซนเซอร์ดิบจากซีเรียลมอนิเตอร์ คุณจะได้เรียนรู้การแสดงค่าอุณหภูมิและความชื้นแบบเรียลไทม์บนหน้าจอตัวอักษรขนาด 16x2 โครงงานนี้เหมาะสำหรับการสร้างสถานีตรวจอากาศบนโต๊ะทำงาน เครื่องตรวจสอบเรือนกระจกขนาดเล็ก หรือเพิ่มจอแสดงผลในท้องถิ่นให้กับโครงงานระบบอัตโนมัติภายในบ้านใดๆ อินเทอร์เฟซ I2C ช่วยลดความซับซ้อนของการเดินสายไฟ ทำให้โครงงานนี้เข้าถึงได้ง่ายสำหรับผู้เริ่มต้นและเป็นส่วนเสริมที่รวดเร็วสำหรับผู้ที่มีประสบการณ์
ต่อไปนี้เป็นแนวคิดเชิงปฏิบัติสองสามประการเกี่ยวกับสิ่งที่คุณสามารถสร้างได้ด้วยความรู้นี้:
- สถานีตรวจอากาศบนโต๊ะทำงานที่แสดงสภาพห้องปัจจุบัน
- จอแสดงผลขนาดกะทัดรัดสำหรับสวนขวดสัตว์เลื้อยคลานหรือพืช
- จอแสดงผลในท้องถิ่นสำหรับห้องเซิร์ฟเวอร์หรือสภาพแวดล้อมในเวิร์กช็อป
- โมดูลพื้นฐานสำหรับระบบอัตโนมัติภายในบ้านที่ซับซ้อนยิ่งขึ้น
ฮาร์ดแวร์และส่วนประกอบ
ในการสร้างโครงงานนี้ คุณจะต้องมีส่วนประกอบต่อไปนี้:
- 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 หลายตัวสามารถทำงานร่วมกันบนบัสเดียวกันได้
คู่มือการเดินสายไฟ
เชื่อมต่อส่วนประกอบต่างๆ ตามที่แสดงในแผนภาพด้านล่าง 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
โปรเจกต์ที่เกี่ยวข้องจากวิดีโอนี้
- บทที่ 20/31: การใช้ LCD1602 กับ Arduino แสดงอุณหภูมิ แรงดันไฟฟ้า และระยะทาง | Robojax
- บทที่ 20/31: การแสดงแรงดันไฟฟ้าบน LCD1602
บทต่างๆ
- [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] การแสดงระยะทางจากเซนเซอร์อัลตราโซนิก
/*
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;
}
}
สิ่งที่คุณอาจต้องการ
-
อเมซอนSunFounder Arduino Learning Kit on AliExpresss.click.aliexpress.com
-
อเมซอน
-
อเมซอน
-
อเมซอน
-
อเมซอน
แหล่งข้อมูลและเอกสารอ้างอิง
-
เอกสารDocumentation for SunFounder 3 in 1 IoT/Smart Car/Learning Kitdocs.sunfounder.com
-
ภายนอกPurchase SunFounder's 3-in-1 Smart car learning kitsunfounder.com
ไฟล์📁
ไลบรารี Arduino (zip)
-
SunFounder's 3-in-1 Smart Car learning kit source code
3in1-kit-main-v2.zip12.80 MB
คู่มือผู้ใช้
-
SunFounder 3-in-1 Arduino Smart Car assembly manualThis document shows step by step assembly of SunFounder 3-in-1 Arduino Smart Car
SunFounder_car_assembly_manual.pdf1.20 MB