搜尋程式碼

使用DHT11、DHT22配合TM1637显示屏和继电器来控制交流负载

使用DHT11、DHT22配合TM1637显示屏和继电器来控制交流负载

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

DHT11 Module
DHT22 sensor with PCB-1
  • 一個智能恆溫器用喺小型溫室,根據溫度讀數自動調節暖爐或風扇。
  • 一個系統用嚟監察同控制化學過程中液體嘅溫度。
  • 一個自動溫度控制系統用喺爬蟲類飼養箱。
  • 一個溫度觸發警報系統,當達到某個閾值時觸發警報。

呢個系統用DHT11或DHT22感測器嚟量度溫度同濕度(影片00:11)。TM1637顯示屏會顯示當前溫度(影片00:17),而繼電器會根據預設嘅溫度設定,開關交流電負載(好似燈、風扇或暖爐)(影片00:23)。

硬件/零件

要整呢個項目,你需要以下零件:

  • Arduino Uno(或兼容板)
  • DHT11或DHT22溫濕度感測器(影片00:11)
  • TM1637顯示屏模組(影片00:17)
  • 繼電器模組(影片00:19)
  • 杜邦線
  • 麵包板
  • 交流電負載(例如細燈膽或風扇)

接線指南

接線好直接,但對項目嘅功能嚟講好重要。請參考影片嘅視覺指南。

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

詳細嘅接線指示同圖表可以喺影片入面搵到(影片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()函數解釋

圖片

DHT11 Sensor
DHT11 Sensor
DHT11 Module
DHT11 Module
DHT11 Module
DHT11 Module
DHT22 sensor with PCB-1
DHT22 sensor with PCB-1
DHT22 sensor no PCB
DHT22 sensor no PCB
Wiring DHT11 DHT22 with TM1637 dispaly and relay
Wiring DHT11 DHT22 with TM1637 dispaly and relay
DHT22_red-6
DHT22_red-6
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 文件

用户手册

其他文件