รหัส Arduino และวิดีโอสำหรับเซนเซอร์วัดอุณหภูมิและความชื้น DHT22 พร้อมจอแสดงผล TM1637 และรีเลย์
ในบทช่วยสอนนี้ เราจะสำรวจวิธีการใช้เซนเซอร์วัดอุณหภูมิและความชื้น DHT22 ร่วมกับจอแสดงผล TM1637 และรีเลย์เพื่อควบคุมโหลดไฟฟ้ากระแสสลับ เช่น เครื่องทำความร้อนหรือพัดลม เป้าหมายคือการเปิดโหลดเมื่ออุณหภูมิถึง 50 องศาเซลเซียส และปิดเมื่ออุณหภูมิลดลงต่ำกว่าเกณฑ์ดังกล่าว การตั้งค่านี้เหมาะสำหรับการรักษาระดับอุณหภูมิที่ต้องการในสภาพแวดล้อมที่มีการควบคุม

เพื่อให้บรรลุเป้าหมายนี้ เราจะเขียนโปรแกรม Arduino ที่อ่านข้อมูลอุณหภูมิและความชื้นจากเซนเซอร์ DHT22 แสดงอุณหภูมิบนจอแสดงผล TM1637 และควบคุมรีเลย์ตามค่าอุณหภูมิที่อ่านได้ เพื่อความชัดเจนยิ่งขึ้น คุณสามารถดูวิดีโอได้ที่ (ในวิดีโอที่ 10:00)
อธิบายฮาร์ดแวร์
ส่วนประกอบหลักของโปรเจกต์นี้ประกอบด้วยเซนเซอร์ DHT22 จอแสดงผล TM1637 โมดูลรีเลย์ และบอร์ด Arduino เซนเซอร์ DHT22 มีหน้าที่วัดอุณหภูมิและความชื้น โดยให้เอาต์พุตแบบดิจิทัลที่ Arduino สามารถอ่านได้ง่าย จอแสดงผล TM1637 ใช้เพื่อแสดงค่าอุณหภูมิในรูปแบบที่ใช้งานง่าย ในขณะที่โมดูลรีเลย์ช่วยให้เราควบคุมอุปกรณ์แรงดันสูง เช่น เครื่องทำความร้อนและพัดลมได้อย่างปลอดภัย
เซนเซอร์ DHT22 มีสามขา: VCC (ไฟเลี้ยง), GND (กราวด์) และ DATA (เอาต์พุต) จอแสดงผล TM1637 ใช้สี่ขาสำหรับไฟเลี้ยง กราวด์ สัญญาณนาฬิกา และการสื่อสารข้อมูล โมดูลรีเลย์เชื่อมต่อกับ Arduino และทำหน้าที่เป็นสวิตช์สำหรับโหลดไฟฟ้ากระแสสลับ เพื่อให้การทำงานปลอดภัยเมื่อควบคุมอุปกรณ์ที่ต้องใช้แรงดันไฟฟ้าสูงขึ้น
รายละเอียดจาก Datasheet
| ผู้ผลิต | Adafruit |
|---|---|
| หมายเลขชิ้นส่วน | DHT22 |
| แรงดันไฟฟ้าลอจิก/IO | 3.3 V - 5.5 V |
| แรงดันไฟฟ้าจ่าย | 3.3 V - 6 V |
| กระแสเอาต์พุต (ต่อช่อง) | 0.5 mA |
| กระแสสูงสุด (ต่อช่อง) | 2.5 mA |
| คำแนะนำความถี่ PWM | N/A |
| เกณฑ์แรงดันไฟฟ้าอินพุตลอจิก | 0.3 V - 0.7 V |
| แรงดันตก / RDS(on) / ความอิ่มตัว | N/A |
| ขีดจำกัดความร้อน | -40°C ถึง 80°C |
| แพ็กเกจ | แพ็กเกจ 3 ขา |
| หมายเหตุ / รุ่นอื่น | รู้จักกันในชื่อ AM2302 |
- ตรวจสอบให้แน่ใจว่าแหล่งจ่ายไฟ (3.3 V - 6 V) เพียงพอสำหรับ DHT22
- ใช้ตัวต้านทาน pull-up บนสายข้อมูลหากจำเป็น
- ปล่อยให้ค่าที่อ่านจากเซนเซอร์คงที่เพื่อให้ได้ข้อมูลที่แม่นยำ
- ตรวจสอบการเชื่อมต่อขาอีกครั้งเพื่อหลีกเลี่ยงการสื่อสารที่ผิดพลาด
- ระมัดระวังกับโหลดไฟฟ้ากระแสสลับ ตรวจสอบฉนวนและความปลอดภัยอย่างเหมาะสม
- ติดตั้งแผ่นระบายความร้อนสำหรับรีเลย์หากควบคุมโหลดสูง
- ใช้เทคนิค debounce หากจำเป็นเมื่ออ่านข้อมูลเซนเซอร์
- เก็บเซนเซอร์ DHT22 ให้ห่างจากแสงแดดโดยตรงเพื่อการอ่านค่าที่แม่นยำ
คำแนะนำการเดินสายไฟ

ในการเดินสายไฟส่วนประกอบ ให้เริ่มต้นด้วยการเชื่อมต่อเซนเซอร์ DHT22 เชื่อมต่อขา VCC เข้ากับขา 5V บน Arduino ขา GND เข้ากับกราวด์ (GND) และขา DATA เข้ากับขาดิจิทัล 9 บน Arduino
ถัดไป เดินสายไฟจอแสดงผล TM1637 เชื่อมต่อขา VCC เข้ากับขา 5V บน Arduino ขา GND เข้ากับกราวด์ ขา CLK (สัญญาณนาฬิกา) เข้ากับขาดิจิทัล 2 และขา DIO (ข้อมูล) เข้ากับขาดิจิทัล 3 สำหรับโมดูลรีเลย์ เชื่อมต่อขา VCC เข้ากับขา 5V ขา GND เข้ากับกราวด์ และขาควบคุม (สัญญาณ) เข้ากับขาดิจิทัล 7 สุดท้าย ตรวจสอบให้แน่ใจว่าโหลดไฟฟ้ากระแสสลับเชื่อมต่อกับโมดูลรีเลย์อย่างปลอดภัยตามคำแนะนำของผู้ผลิต
ตัวอย่างโค้ดและคำอธิบาย
โค้ดต่อไปนี้เริ่มต้นเซนเซอร์ DHT22 และจอแสดงผล TM1637 โดยตั้งค่าขาที่จำเป็นและเตรียมพร้อมที่จะอ่านข้อมูลอุณหภูมิ
#include
#define CLK 2
#define DIO 3
#define DHTPIN 9
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(9600);
pinMode(RELAY, OUTPUT);
dht.begin();
}
ในส่วนโค้ดนี้ เรารวมไลบรารีที่จำเป็นและกำหนดขาสำหรับจอแสดงผล TM1637 และเซนเซอร์ DHT22 ฟังก์ชัน setup เริ่มต้นการสื่อสารแบบอนุกรมและตั้งค่าขารีเลย์เป็นเอาต์พุต

ฟังก์ชัน loop ดึงค่าอุณหภูมิและควบคุมรีเลย์ตามค่าอุณหภูมิที่อ่านได้ หากอุณหภูมิเกิน 50 องศา รีเลย์จะถูกเปิดใช้งาน
void loop() {
delay(TEST_DELAY);
int temp = round(getTemp("c"));
display.showNumberDec(temp, false, 3, 1);
if(temp > 50) {
digitalWrite(RELAY, LOW);
} else {
digitalWrite(RELAY, HIGH);
}
}
ส่วนโค้ดนี้แสดงวิธีการอ่านอุณหภูมิ แสดงผล และควบคุมรีเลย์ ค่าอุณหภูมิจะถูกปัดเศษและแสดงบน TM1637 และรีเลย์จะถูกเปิดหรือปิดตามเกณฑ์อุณหภูมิ
เพื่อความเข้าใจที่ครอบคลุมยิ่งขึ้น โปรดอ้างอิงโค้ดเต็มที่โหลดไว้ด้านล่างบทความ
การสาธิต / สิ่งที่คาดหวัง
เมื่อคุณรันโปรแกรม คุณควรเห็นอุณหภูมิแสดงบน TM1637 เมื่ออุณหภูมิเกิน 50 องศาเซลเซียส รีเลย์จะทำงานและเปิดโหลดไฟฟ้ากระแสสลับที่เชื่อมต่ออยู่ ในทางกลับกัน เมื่ออุณหภูมิลดลงต่ำกว่า 50 องศา รีเลย์จะหยุดทำงานและปิดโหลด ระมัดระวังเรื่องขั้วไฟฟ้าที่กลับด้านและตรวจสอบการเชื่อมต่อที่ถูกต้องเพื่อหลีกเลี่ยงความเสียหายต่อส่วนประกอบ (ในวิดีโอที่ 12:30)
ไทม์สแตมป์ในวิดีโอ
- 00:00 - บทนำ
- 02:15 - คำอธิบายการเดินสายไฟ
- 05:00 - คำอธิบายโค้ด
- 10:00 - การสาธิต
- 12:30 - ปัญหาที่พบบ่อย
/*
* Original code from TM1637 https://github.com/avishorp/TM1637
* Original code and library for DHT22 https://github.com/adafruit/DHT-sensor-library
* Watch the video for this code https://youtu.be/xD8wHXDzLkQ
* Other Arduino library and videos https://robojax.com
*/
/*
* Modified for Robojax video on January 10, 2018
* by Ahmad Nejrabi, in Ajax, Ontario, Canada
*/
// ****** Start of TM1637 Display code
#include <Arduino.h>
#include <TM1637Display.h>
// Module connection pins (Digital Pins)
#define CLK 2
#define DIO 3
// The amount of time (in milliseconds) between tests
#define TEST_DELAY 1000
TM1637Display display(CLK, DIO);
// ****** end of TM1637 Display code
// Example testing sketch for various DHT humidity/temperature sensors
// Written by ladyada, public domain
// updated by Ahmad for Robojax.com videos.
// on January 10, 2018 in Ajax, Ontario, Canada
// ****** Start of DHT code
#include "DHT.h"
#define DHTPIN 9 // what digital pin we're connected to
// Uncomment whatever type you're using!
//#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
DHT dht(DHTPIN, DHTTYPE);
// ********** end of DHT22 code
#define RELAY 7 // the pin connected to relay
void setup()
{
Serial.begin(9600);
Serial.println("DHT22 Robojax Test with Display");
pinMode(RELAY,OUTPUT);// set RELAY pin as output
dht.begin();
}
void loop()
{
delay(TEST_DELAY);// wait
// **** TM1637 code start
display.setBrightness(0x0f);// set brightness
uint8_t data[] = { 0x0, 0x0, 0x0, 0x0 };// clear display values
display.setSegments(data);//clear display
// **** TM1637 code end
// Robojax.com test video
Serial.println(getTemp("c"));
int temp = round(getTemp("c"));
display.showNumberDec(temp, false, 3,1);
if(temp >50 )
{
digitalWrite(RELAY, LOW);
}else{
digitalWrite(RELAY, HIGH);
}
}// loop end
/*
* getTemp(String req)
* returns the temperature related parameters
* req is string request
* getTemp("c") will return temperature in Celsius
* getTemp("hic") will return heat index in Celsius
* getTemp("f") will return temperature in Fahrenheit
* getTemp("hif") will return temperature in Fahrenheit
* getTemp("h") will return humidity
*/
float getTemp(String req)
{
// 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 (the default)
float t = dht.readTemperature();
// Read temperature as Fahrenheit (isFahrenheit = true)
float f = dht.readTemperature(true);
// Compute heat index in Fahrenheit (the default)
float hif = dht.computeHeatIndex(f, h);
// Compute heat index in Celsius (isFahreheit = false)
float hic = dht.computeHeatIndex(t, h, false);
// Check if any reads failed and exit early (to try again).
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println("Failed to read from DHT sensor!");
return 0.0;
}
// Compute heat index in Kelvin
float k = t + 273.15;
if(req =="c"){
return t;//return Celsius
}else if(req =="f"){
return f;// return Fahrenheit
}else if(req =="h"){
return h;// return humidity
}else if(req =="hif"){
return hif;// return heat index in Fahrenheit
}else if(req =="hic"){
return hic;// return heat index in Celsius
}else if(req =="k"){
return k;// return temperature in Kelvin
}else{
return 0.000;// if no request found, return 0.000
}
}
สิ่งที่คุณอาจต้องการ
-
อเมซอน4-channel relay module on Amazonamzn.to
-
อาลีเอ็กซ์เพรสBuy 5V/12V 1, 2, 4, 6, or 8-channel relay modules.click.aliexpress.com
แหล่งข้อมูลและเอกสารอ้างอิง
ไฟล์📁
ไลบรารี Arduino (zip)
-
DHT22 PCB module red
DHT22-module-red.fzpz0.01 MB
ไฟล์ Fritzing
-
Temperature Sensor DHT11
Temperature Sensor DHT11.fzpz0.01 MB -
DHT22 Humidity and Temperature Sensor
DHT22 Humidity and Temperature Sensor.fzpz0.01 MB -
DHT22 PCB module red
DHT22-module-red.fzpz0.01 MB -
DHT22 module white
DHT22-module-white.fzpz0.01 MB -
TM1637 Seven Segment module
TM1637.fzpz0.01 MB -
DHT11 Humitidy and Temperature Sensor (3 pins)
DHT11 Humitidy and Temperature Sensor (3 pins).fzpz0.20 MB
คู่มือผู้ใช้
-
DHT22 Temperature and Humidity sensor user's manual
robojax-DHT22_manual.pdf0.36 MB