ค้นหาโค้ด

รหัส Arduino และวิดีโอสำหรับเซนเซอร์วัดอุณหภูมิและความชื้น DHT22 พร้อมจอแสดงผล TM1637 และรีเลย์

รหัส Arduino และวิดีโอสำหรับเซนเซอร์วัดอุณหภูมิและความชื้น DHT22 พร้อมจอแสดงผล TM1637 และรีเลย์

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

DHT22 sensor with PCB-1

เพื่อให้บรรลุเป้าหมายนี้ เราจะเขียนโปรแกรม Arduino ที่อ่านข้อมูลอุณหภูมิและความชื้นจากเซนเซอร์ DHT22 แสดงอุณหภูมิบนจอแสดงผล TM1637 และควบคุมรีเลย์ตามค่าอุณหภูมิที่อ่านได้ เพื่อความชัดเจนยิ่งขึ้น คุณสามารถดูวิดีโอได้ที่ (ในวิดีโอที่ 10:00)

อธิบายฮาร์ดแวร์

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

เซนเซอร์ DHT22 มีสามขา: VCC (ไฟเลี้ยง), GND (กราวด์) และ DATA (เอาต์พุต) จอแสดงผล TM1637 ใช้สี่ขาสำหรับไฟเลี้ยง กราวด์ สัญญาณนาฬิกา และการสื่อสารข้อมูล โมดูลรีเลย์เชื่อมต่อกับ Arduino และทำหน้าที่เป็นสวิตช์สำหรับโหลดไฟฟ้ากระแสสลับ เพื่อให้การทำงานปลอดภัยเมื่อควบคุมอุปกรณ์ที่ต้องใช้แรงดันไฟฟ้าสูงขึ้น

รายละเอียดจาก Datasheet

ผู้ผลิตAdafruit
หมายเลขชิ้นส่วนDHT22
แรงดันไฟฟ้าลอจิก/IO3.3 V - 5.5 V
แรงดันไฟฟ้าจ่าย3.3 V - 6 V
กระแสเอาต์พุต (ต่อช่อง)0.5 mA
กระแสสูงสุด (ต่อช่อง)2.5 mA
คำแนะนำความถี่ PWMN/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 ให้ห่างจากแสงแดดโดยตรงเพื่อการอ่านค่าที่แม่นยำ

คำแนะนำการเดินสายไฟ

Wiring DHT11 DHT22 with TM1637 dispaly and relay
Wiring DHT11 DHT22 with TM1637 dispaly and relay

ในการเดินสายไฟส่วนประกอบ ให้เริ่มต้นด้วยการเชื่อมต่อเซนเซอร์ 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 เริ่มต้นการสื่อสารแบบอนุกรมและตั้งค่าขารีเลย์เป็นเอาต์พุต

Wirig relay module to AC load

ฟังก์ชัน 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 - ปัญหาที่พบบ่อย

ภาพ

DHT11 Module
DHT11 Module
DHT22 sensor with PCB-1
DHT22 sensor with PCB-1
DHT22 sensor no PCB
DHT22 sensor no PCB
Wirig relay module to AC load
Wirig relay module to AC load
Wiring DHT11 DHT22 with TM1637 dispaly and relay
Wiring DHT11 DHT22 with TM1637 dispaly and relay
57-Arduino code for a DHT11 DHT22 temperature and humidity sensor with a TM1637 display.
ภาษา: C++
/*
 * 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
  }
 
}

สิ่งที่คุณอาจต้องการ

แหล่งข้อมูลและเอกสารอ้างอิง

ไฟล์📁

ไลบรารี Arduino (zip)

ไฟล์ Fritzing

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