使用DHT11、DHT22配合TM1637显示屏和继电器来控制交流负载
呢個項目示範咗點樣用Arduino、DHT11/DHT22溫濕度感測器、TM1637顯示屏同繼電器嚟控制交流電負載,整一個溫度控制系統。呢個設定非常靈活,可以適應各種應用。例如,你可以整:


- 一個智能恆溫器用喺小型溫室,根據溫度讀數自動調節暖爐或風扇。
- 一個系統用嚟監察同控制化學過程中液體嘅溫度。
- 一個自動溫度控制系統用喺爬蟲類飼養箱。
- 一個溫度觸發警報系統,當達到某個閾值時觸發警報。
呢個系統用DHT11或DHT22感測器嚟量度溫度同濕度(影片00:11)。TM1637顯示屏會顯示當前溫度(影片00:17),而繼電器會根據預設嘅溫度設定,開關交流電負載(好似燈、風扇或暖爐)(影片00:23)。
硬件/零件
要整呢個項目,你需要以下零件:
- Arduino Uno(或兼容板)
- DHT11或DHT22溫濕度感測器(影片00:11)
- TM1637顯示屏模組(影片00:17)
- 繼電器模組(影片00:19)
- 杜邦線
- 麵包板
- 交流電負載(例如細燈膽或風扇)
接線指南
接線好直接,但對項目嘅功能嚟講好重要。請參考影片嘅視覺指南。

詳細嘅接線指示同圖表可以喺影片入面搵到(影片02:03至05:18)。要特別留意DHT感測器(影片01:44)、TM1637顯示屏(影片02:25)同繼電器模組(影片03:37)嘅連接。
程式碼解釋
Arduino程式碼用咗兩個函式庫:TM1637Display同DHT感測器函式庫。你需要喺Arduino IDE入面安裝呢啲函式庫。程式碼入面最重要嘅可設定部分係:
// 模組連接腳位(數位腳位)
#define CLK 2
#define DIO 3
// 測試之間嘅時間(毫秒)
#define TEST_DELAY 1000
// ****** TM1637顯示屏程式碼結束
#define DHTPIN 9 // 我哋連接嘅數位腳位
#define DHTTYPE DHT22 // DHT 22(AM2302)、AM2321
#define RELAY 7 // 連接繼電器嘅腳位
#define陳述式令你可以輕鬆更改TM1637顯示屏(CLK同DIO)、DHT感測器(DHTPIN)同繼電器(RELAY)嘅腳位分配,以配合你嘅接線。DHTTYPE定義咗你用緊邊款DHT感測器(DHT11或DHT22)。TEST_DELAY變數控制讀數之間嘅時間。
getTemp()函數係一個自訂函數,用嚟從DHT感測器讀取溫度同濕度數據。佢容許你透過傳遞字串參數(影片09:01至10:34)嚟請求唔同類型嘅數據(攝氏、華氏、濕度、熱指數)。例如:getTemp("c")會返回攝氏溫度,而getTemp("h")會返回濕度。
if(temp >50 )
{
digitalWrite(RELAY, LOW);
}else{
digitalWrite(RELAY, HIGH);
}
呢段程式碼根據溫度控制繼電器。修改閾值(呢個例子入面係50)嚟調整觸發點(影片09:44至10:11)。
實際項目/示範
項目嘅完整示範可以喺影片入面睇到(影片00:51至01:07)。影片顯示系統運作中,喺TM1637顯示屏上顯示溫度,並根據溫度讀數控制交流電負載。
章節
- [00:06] 簡介同項目概覽
- [01:12] 程式碼可用性同其他資源
- [01:44] DHT感測器接線
- [02:25] TM1637顯示屏接線
- [02:50] 交流電負載同繼電器接線
- [04:33] 繼電器腳位同電源連接
- [05:29] 函式庫安裝
- [05:52] 程式碼解釋:TM1637部分
- [06:47] 程式碼解釋:DHT部分
- [07:50] 程式碼解釋:繼電器同設定
- [08:26] 程式碼解釋:迴圈同溫度控制
- [10:12] getTemp()函數解釋
/*
* 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
}
}
你可能需要嘅嘢
-
亞馬遜DHT22 from Amazonamzn.to
-
亞馬遜Purchase DHT11 from Amazonamzn.to
-
易贝DHT22 from eBayebay.us
-
阿里巴巴速卖通DHT11 and DHT22 from AliExpressamzn.to
-
阿里巴巴速卖通Purchase AM2302, DHT11, or DHT22 sensor from AliExpresss.click.aliexpress.com
-
邦购Purchase DHT11 module from Banggoodbanggood.com
-
邦购Purchase DHT22 module from Banggoodbanggood.com
資源與參考資料
-
外部DHT11 Manual (PDF)robojax.com
文件📁
Arduino 函式庫 (zip)
-
DHT22 Arduino 函式庫
robojax-DHT22_library.zip0.01 MB -
TM1637 Arduino 庫
TM1637_library.zip1.36 MB -
DHT22 PCB模組紅色
DHT22-module-red.fzpz0.01 MB
Fritzing 文件
-
溫度感測器 DHT11
Temperature Sensor DHT11.fzpz0.01 MB -
DHT22 濕度同溫度感測器
DHT22 Humidity and Temperature Sensor.fzpz0.01 MB -
DHT22 PCB模組紅色
DHT22-module-red.fzpz0.01 MB -
TM1637七段顯示模組
TM1637.fzpz0.01 MB -
TM1637 4位七段顯示屏
TM1637-1.fzpz0.01 MB -
5V繼電器模組_LOW觸發
5V Relay Module_LOW_trigger.fzpz0.08 MB -
5V繼電器2.0
5V RELAY 2.0.fzpz0.02 MB
用户手册
-
DHT11 用户手册
robojax-DHT11_manual.pdf0.82 MB -
DHT22溫度同濕度感測器用戶手冊
robojax-DHT22_manual.pdf0.36 MB
其他文件
-
DHT22 User's manual
robojax-DHT22_manual.pdf