Mình xin chia sẻ với các bạn cách đọc cảm biến đo nhiệt độ độ ẩm DHT với TIVA C, ngày xưa có một bài viết của bạn Thành Thái có chia sẻ về sử dụng thư viện DHT22 cho TIVA, còn ở đây mình sử dụng thư viện DHT của Adafruit chỉnh sửa lại một chút, , thư viện này đầy đủ hơn và có thể dùng với mọi loại cảm biến DHT từ DHT11, DHT22, DHT21.

Chuẩn bị

Phần cứng

  • TIVA C Launchpad
  • Dây nối
  • Cảm biến nhiệt độ độ ẩm DHT22
  • Cảm biến độ ẩm đất

Phần mềm

  • Energia IDE
  • Thư viện DHT đã chỉnh sửa hoặc tải tại đây

Đọc dữ liệu DHT22

Ở đây mình sử dụng chân PD0 của TIVA C để đọc data từ DHT22, nếu bạn sử dụng DHT11 thì thay DHT22 bằng DHT11 chỗ  #define DHTTYPE DHT22 . Tốc độ baud để debug là 115200, sơ đồ kết nối chân mình xin mô tả trong code

// Chương trình đọc nhiệt độ, độ ẩm từ cảm biến DHT
// Written by ladyada, public domain
// Chỉnh  sửa cho TIVA C bởi hocARM.org

#include "DHT.h"

#define DHTPIN PD_0     // Chân DATA nối với PD0

// Uncomment loại cảm biến bạn sử dụng, nếu DHT11 thì uncomment DHT11 và comment DHT22
//#define DHTTYPE DHT11   // DHT 11
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

// Kết nối
// DHT       | TIVA C
//----------------
// VCC(1)    |  3.3V
// DATA(2)   |  PD0
// NC(3)     |  x
// GND(4)    |  GND

// Kết nối chân 1 của DHT với 3.3V
// Chân 2 kết nối với bất kỳ chân nào của TIVA C
// Chân 4 nối với GND
// Nối trở 10k giữa chân 1 và chân 2

// Khởi tạo cảm biến
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  // Khởi tạo cổng serial baud 115200
  Serial.begin(115200);
  Serial.println("DHTxx test!");
  // Bắt đầu đọc dữ liệu
  dht.begin();
}

void loop() {
  // Đợi chuyển đổi dữ liệu khoảng 2s
  delay(2000);

  float h = dht.readHumidity();
  // Đọc giá trị nhiệt độ C (mặc định)
  float t = dht.readTemperature();
  // Đọc giá trị nhiệt độ F(isFahrenheit = true)
  float f = dht.readTemperature(true);

  // Kiểm tra quá trình đọc thành công hay không
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }

  // Tính chỉ số nhiệt độ F (mặc định)
  //  float hif = dht.computeHeatIndex(f, h);
  // Tính chỉ số nhiệt độ C (isFahreheit = false)
  //  float hic = dht.computeHeatIndex(t, h, false);

  // IN thông tin ra màn hình
  Serial.print("Do am: ");
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Nhiet do: ");
  Serial.print(t);
  Serial.println(" *C ");
  //  Serial.print(f);
  //  Serial.print(" *F\t");
  //  Serial.print("Heat index: ");
  //  Serial.print(hic);
  //  Serial.print(" *C ");
  //  Serial.print(hif);
  //  Serial.println(" *F");
}

Kết quả

Hiển thị nhiệt độ độ ẩm lên LCD 16×2

Trong bài trước mình có chia sẻ cách hiển thị thông tin lên LCD, giờ chúng ta thử ứng dụng vào hiển thị thông tin nhiệt độ và độ ẩm xem thế nào

// Chương trình đọc nhiệt độ, độ ẩm từ cảm biến DHT hiển thị LCD
// Written by ladyada, public domain
// Chỉnh  sửa cho TIVA C bởi hocARM.org

// Thêm thư viện LCD
#include "LiquidCrystal.h"
// Thư viện DHT
#include "DHT.h"

#define DHTPIN PD_0     // Chân DATA nối với PD0

// Uncomment loại cảm biến bạn sử dụng, nếu DHT11 thì uncomment DHT11 và comment DHT22
//#define DHTTYPE DHT11   // DHT 11
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

// Kết nối
// DHT       | TIVA C
//----------------
// VCC(1)    |  3.3V
// DATA(2)   |  PD0
// NC(3)     |  x
// GND(4)    |  GND

// Kết nối chân 1 của DHT với 3.3V
// Chân 2 kết nối với bất kỳ chân nào của TIVA C
// Chân 4 nối với GND
// Nối trở 10k giữa chân 1 và chân 2

// Khởi tạo cảm biến
DHT dht(DHTPIN, DHTTYPE);
// Khởi tạo LCD
LiquidCrystal lcd(PD_1, PD_2, PD_3, PE_1, PE_2, PE_3);

void setup() {
  
  Serial.begin(9600);
  Serial.println("DHTxx test!");
  
  dht.begin();
  // Khởi tạo LCD và in thông tin ban đầu
  lcd.begin(16, 2);
  lcd.print("===HOCARM.ORG===");
  delay(2000);
  lcd.clear(); // In xong thông tin intro thì xóa chờ hiện dữ liệu
}

void loop() {
  // Tắt hiển thị
  lcd.noDisplay();
  delay(200);
   // Mở hiển thị lại
  lcd.display();
  delay(200);

  // Chờ quá trình chuyển đổi
  delay(2000);

    float h = dht.readHumidity();
  // Đọc giá trị nhiệt độ C (mặc định)
  float t = dht.readTemperature();
  // Đọc giá trị nhiệt độ F(isFahrenheit = true)
  float f = dht.readTemperature(true);

  // Kiểm tra quá trình đọc thành công hay không
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }

  // Tính chỉ số nhiệt độ F (mặc định)
  float hif = dht.computeHeatIndex(f, h);
  // Tính chỉ số nhiệt độ C (isFahreheit = false)
  float hic = dht.computeHeatIndex(t, h, false);
  
  // In thông tin ra màn hình để debug
  Serial.print("Humidity: ");
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperature: ");
  Serial.print(t);
  Serial.print(" *C ");
  Serial.print(f);
  Serial.print(" *F\t");
  Serial.print("Heat index: ");
  Serial.print(hic);
  Serial.print(" *C ");
  Serial.print(hif);
  Serial.println(" *F");

   //IN thông tin lên LCD   
   lcd.setCursor(0, 1);
   lcd.print("HUMID% = ");  // Thông tin về độ ẩm
   lcd.print(h);
   lcd.println(" %" );
    
   lcd.setCursor(1, 0);
   lcd.print(" TEMP = ");   // Thông tin về nhiệt độ
   lcd.print(t);
   lcd.println("*C");    
}

Kết quả

Đọc độ ẩm đất

Vậy là quá trình đọc nhiệt độ độ ẩm môi trường đã xong, hiện đang có cảm biến độ ẩm đất nên thử đọc đồng thời giá trị của DHT22 và cảm biến độ ẩm đất cho có bài kết hợp chút chứ kết bài ở đây thì ngắn quá mình cũng hơi ngại :D.

Hình trên là loại cảm biến độ ẩm đất mình dùng, rất phổ biến ở Việt Nam, về cấu tạo và nguyên tắc hoạt động mình xin tạm không đi sâu, chỉ xin nói qua  về cách lấy dữ liệu từ cảm biến. Nói thì phức tạp chứ rất đơn giản, nối 2 chân nguồn cảm biến với nguồn TIVA, chân A0 nối với chân ADC để đọc dữ liệu, cách đọc ADC mình có đề cập ở bài trước rồi, nếu bạn chưa biết có thể xem qua. Với cảm biến giá trị thay đổi khi có nước (nhiều nước nước giá trị thấp, ít nước thì giá trị cao). Giờ thì mình kết hợp đọc cả DHT và cảm biến độ ẩm đất hiển thị dữ liệu debug lên máy tính.

Khi dùng cảm biến độ ẩm đất, nếu có quá nhiều nước sẽ có đèn xanh cảnh báo cho chúng ta biết

// Chương trình đọc nhiệt độ, độ ẩm từ cảm biến DHT và đọc dữ liệu cảm biến độ ẩm đất
// Written by ladyada, public domain
// Chỉnh  sửa cho TIVA C bởi hocARM.org

#include "DHT.h"

#define DHTPIN PD_0     // Chân DATA nối với PD0

// Uncomment loại cảm biến bạn sử dụng, nếu DHT11 thì uncomment DHT11 và comment DHT22
//#define DHTTYPE DHT11   // DHT 11
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)
//------------------------------------------------
// Kết nối
// DHT       | TIVA C
//----------------
// VCC(1)    |  3.3V
// DATA(2)   |  PD0
// NC(3)     |  x
// GND(4)    |  GND

// Kết nối chân 1 của DHT với 3.3V
// Chân 2 kết nối với bất kỳ chân nào của TIVA C
// Chân 4 nối với GND
// Nối trở 10k giữa chân 1 và chân 2

// Cảm biến độ ẩm đất  | TIVA C
//          A0         | PB5       
//          D0         | x   
//          GND        | GND    
//          VCC        | 3v3    
//-------------------------------------------------
// Khởi tạo cảm biến
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  // Khởi tạo cổng serial baud 9600
  Serial.begin(9600);
  Serial.println("DHTxx test!");
  // Bắt đầu đọc dữ liệu
  dht.begin();
}

void loop() {
  // Đợi chuyển đổi dữ liệu khoảng 2s
  delay(2000);

  float h = dht.readHumidity();
  // Đọc giá trị nhiệt độ C (mặc định)
  float t = dht.readTemperature();
  // Đọc giá trị nhiệt độ F(isFahrenheit = true)
  float f = dht.readTemperature(true);

  // Kiểm tra quá trình đọc thành công hay không
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }

  // Tính chỉ số nhiệt độ F (mặc định)
  float hif = dht.computeHeatIndex(f, h);
  // Tính chỉ số nhiệt độ C (isFahreheit = false)
  float hic = dht.computeHeatIndex(t, h, false);
  
  // Đọc dữ liệu độ ẩm đất
  int soilValue = analogRead(PB_5);
  
  // IN thông tin ra màn hình
  Serial.print("Humidity: ");
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperature: ");
  Serial.print(t);
  Serial.print(" *C ");
  Serial.print(f);
  Serial.print(" *F\t");
  Serial.print("Heat index: ");
  Serial.print(hic);
  Serial.print(" *C ");
  Serial.print(hif);
  Serial.println(" *F");
  // In thông tin dữ liệu độ ẩm đất
  Serial.println("Soil Value:");
  Serial.println(soilValue);
  delay(1);
}

Kết quả

Tạm kết

Thế là chúng ta đã có thể bước đầu đã có được dữ liệu về nhiệt độ, độ ẩm môi trường, độ ẩm đất, giờ thì thỏa sức sáng tạo để ứng dụng, sử dụng các thông tin/ dữ liệu đó vào thực tế thôi 🙂