Search Code

第35課:用Arduino使用HTU21D溫度感測器

第35課:用Arduino使用HTU21D溫度感測器

第35課:用Arduino使用HTU21D溫度感測器

喺呢個教學入面,我哋會學點樣將HTU21D溫度感測器同Arduino連接。呢個感測器用I2C通訊嚟準確量度溫度同濕度,令到佢好容易整合到唔同嘅項目入面。完成呢一課之後,你就會識得由感測器讀取溫度同濕度數值,並且喺Serial Monitor上面顯示出嚟。

HTU21D module

為咗呢個項目,我哋會用Adafruit函式庫,佢提供咗一個直接嘅方法同HTU21D感測器通訊。你會學到點樣設定接線、寫程式,同埋明白程式入面用到嘅主要識別碼。如果你對過程嘅任何部分有疑問,可以參考影片(影片0:00位置)。

硬件解說

HTU21D係一個數碼濕度同溫度感測器。佢嘅操作電壓範圍係1.5V至3.6V,適合用喺3.3V同5V嘅系統。感測器透過I2C通訊,只需要兩條線嚟傳輸數據:串行數據線(SDA)同串行時鐘線(SCL)。呢個感測器嘅功耗好低,閒置時只係用0.02 µA,量度期間最多用450 µA。

除咗感測器之外,你仲需要一塊Arduino板同埋一啲跳線嚟連接所有嘢。接線好簡單:幫感測器供電、連接數據線,跟住就可以開始。確保你嘅連接穩固,避免任何通訊問題。

數據手冊細節

製造商 TE Connectivity
零件編號 HTU21D-F
邏輯/I/O電壓 1.5 - 3.6 V
供電電壓 3.3 V
輸出電流(典型值) 0.02 µA(閒置),450 µA(運作中)
溫度範圍 -40至+125 °C
濕度範圍 0至100 % RH
解像度(溫度) 0.01 °C
解像度(濕度) 0.04 % RH
封裝 DFN-8

 

  • 確保供電電壓正確(1.5 - 3.6 V),避免損壞。
  • 如有需要,喺SDA同SCL線上加拉高電阻。
  • 保持接線短啲,減少I2C通訊嘅噪音。
  • 小心檢查連接,避免浮空輸入。
  • 如果喺接近最高溫度極限操作,要使用散熱器。

接線指示

Arduino wiring for HTU21DF light intesity sensor
Arduino wiring for HTU21DF light intesity sensor

要將HTU21D感測器接到Arduino,首先連接電源引腳。將感測器嘅左邊引腳連接到Arduino嘅3.3V輸出。第二個引腳應該連接到地線(GND)。跟住,將感測器嘅SDA引腳連接到Arduino嘅A4引腳,呢個係I2C通訊嘅數據線。最後,將感測器嘅SCL引腳連接到Arduino嘅A5引腳,呢個係時鐘線。確保所有連接穩固,以維持可靠嘅通訊。

如果你用嘅係其他板,SDA同SCL引腳可能唔同,所以要檢查你塊板嘅規格。喺影片入面,有簡單討論其他接線選項(影片1:30位置)。

程式碼範例同講解

我哋而家睇吓同HTU21D感測器連接嘅程式碼。首先,我哋需要包含I2C通訊同HTU21D感測器所需嘅函式庫。以下節錄顯示setup函數:

void setup() {
  Serial.begin(9600);
  if (!htu.begin()) {
    Serial.println("搵唔到感測器!");
    while (1);
  }
}

喺度,我哋以9600嘅波特率初始化Serial Monitor。然後我哋嘗試用htu.begin()初始化感測器。如果搵唔到感測器,程式會印出錯誤訊息並停止。

跟住,我哋喺loop函數入面持續讀取溫度同濕度數值:

void loop() {
    float temp = htu.readTemperature();
    float rel_hum = htu.readHumidity();
    Serial.print("溫度:"); Serial.print(temp); Serial.println(" C");
    Serial.print("濕度:"); Serial.print(rel_hum); Serial.println(" %");
    delay(500);
}

喺呢個迴圈入面,我哋用htu.readTemperature()讀取溫度,並將佢儲存喺temp變數入面。同樣,我哋用htu.readHumidity()讀取濕度。然後每500毫秒將數值印到Serial Monitor。

如果想用更有結構嘅方法,你可以定義函數嚟處理讀數。完整程式碼會喺呢篇文章下面載入,畀你完整使用所有討論過嘅功能。

示範/預期效果

當你將程式碼上載到Arduino並打開Serial Monitor,你應該會見到持續嘅溫度同濕度讀數。數值會每半秒更新一次。如果感測器偵測到超過最高125 °C嘅溫度,佢可能會顯示零或者錯誤數值。呢個係測試時要留意嘅常見陷阱(影片4:30位置)。

影片時間標記

  • [00:00] 介紹
  • [00:22] 感測器概覽
  • [01:22] 數據手冊回顧
  • [02:28] 接線
  • [03:03] 函式庫安裝
  • [04:05] 程式碼解說(第1部分)
  • [08:33] 程式碼解說(第2部分)
  • [07:34] 現場示範

圖片

thumb_robojax_HTU21DF_types-1756423961-8524
thumb_robojax_HTU21DF_types-1756423961-8524
Arduino wiring for HTU21DF light intesity sensor
Arduino wiring for HTU21DF light intesity sensor
HTU21D module
HTU21D module
HTU21D module-back
HTU21D module-back
212-Arduino code using HTU21D-F Humidity & Temperature Sensor (basic)
語言: C++
++
/***************************************************
  This is an example for the HTU21D-F Humidity & Temperature Sensor

  Designed specifically to work with the HTU21D-F sensor from Adafruit
  ----> https://www.adafruit.com/products/1899

  These module use I2C to communicate; 2 pins are required to
  interface
 ****************************************************/

#include <Wire.h>
#include "Adafruit_HTU21DF.h"

// Connect Vin to 3-5VDC
// Connect GND to ground
// Connect SCL to I2C clock pin (A5 on UNO)
// Connect SDA to I2C data pin (A4 on UNO)

Adafruit_HTU21DF htu1 = Adafruit_HTU21DF();//create object for first HTU21DF sensor
Adafruit_HTU21DF htu2 = Adafruit_HTU21DF();//create object for second HTU21DF sensor
//Adafruit_HTU21DF htu3 = Adafruit_HTU21DF();//create object for third HTU21DF sensor (disabled, remove // from begging of code)

void setup() {
  Serial.begin(9600);
  Serial.println("HTU21D-F test for two modules");

  if (!htu.begin()) {
    Serial.println("Couldn't find sensor!");
    while (1);
  }
}

void loop() {
	//get value for sensor 1
    float temp1 = htu1.readTemperature();
    float rel_hum1 = htu1.readHumidity();

	//get value for sensor 2
    float temp2 = htu2.readTemperature();
    float rel_hum2 = htu2.readHumidity();	

	//get value for sensor 3
    float temp3 = htu3.readTemperature();
    float rel_hum3 = htu3.readHumidity();	
	
	//print values for sensor 1
    Serial.print("Sensor 1 Temp : "); Serial.print(temp1); Serial.print(" C");
    Serial.print("\t\t");
    Serial.print("Sensor 1 Humidity: "); Serial.print(rel_hum1); Serial.println(" %");

	//print values for sensor 2
    Serial.print("Sensor 2 Temp : "); Serial.print(temp2); Serial.print(" C");
    Serial.print("\t\t");
    Serial.print("Sensor 2 Humidity: "); Serial.print(rel_hum2); Serial.println(" %");	
	
	//print values for sensor 3
    //Serial.print("Sensor 3 Temp : "); Serial.print(temp3); Serial.print(" C");
    //Serial.print("\t\t");
    //Serial.print("Sensor 3 Humidity: "); Serial.print(rel_hum3); Serial.println(" %");	
	
    delay(500);
}

你可能需要嘅嘢

文件📁

Arduino 函式庫 (zip)