Bài 9: Cảm biến nhiệt độ và độ ẩm (LM35, DHT11, AM2315C)

Mục tiêu bài học

  • Biết cách sử dụng cảm biến nhiệt độ và độ ẩm
  • Hiển thị giá trị lên Serial Monitor
  • Làm quen với thư viện cảm biến

Giới thiệu các loại cảm biến

  • LM35: Cảm biến nhiệt độ analog, đơn giản, độ chính xác khá.
  • DHT11: Cảm biến kỹ thuật số, đo được cả nhiệt độ và độ ẩm, rẻ tiền, độ chính xác vừa phải.
  • AM2315C: Cảm biến kỹ thuật số sử dụng giao tiếp I2C, độ chính xác cao.

Cài đặt thư viện cần thiết

DHT11

  1. Mở Arduino IDE.
  2. Vào Sketch → Include Library → Manage Libraries...
  3. Tìm “DHT sensor library” và cài đặt thư viện của Adafruit.

AM2315C

  1. Mở trình quản lý thư viện (Library Manager).
  2. Tìm “AM2315C” và cài đặt thư viện của Rob Tillaart.

Sơ đồ nối dây

LM35

  • Chân 1: VCC (5V)
  • Chân 2: OUT → A0
  • Chân 3: GND

DHT11

  • VCC → 5V
  • DATA → D2
  • GND → GND

AM2315C (I2C)

  • VCC → 5V
  • GND → GND
  • SDA → A4 (Arduino Uno)
  • SCL → A5

Mã nguồn ví dụ

LM35 (Analog)

const int analogPin = A0; // Chân analog kết nối với LM35
const float voltage = 5.0; // Điện áp nguồn
const float sensitivity = 0.01; // Độ nhạy của LM35 (10mV/°C)

void setup() {
  Serial.begin(9600);
}

void loop() {
  int sensorValue = analogRead(analogPin);
  float voltageRead = sensorValue * voltage / 1023.0;
  float temperatureC = voltageRead / sensitivity;

  Serial.print("Nhiệt độ: ");
  Serial.print(temperatureC);
  Serial.println(" °C");

  delay(1000);
}

DHT11 (Digital)

#include <DHT.h>

#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);
  dht.begin();
}

void loop() {
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  if (isnan(h) || isnan(t)) {
    Serial.println("Loi doc DHT11");
    return;
  }

  Serial.print("Nhiet do: ");
  Serial.print(t);
  Serial.print(" *C |  Do am: ");
  Serial.print(h);
  Serial.println(" %");
  delay(2000);
}

AM2315C (I2C)


//                    +-----------------+
//    RED    -------- | VDD             |
//    YELLOW -------- | SDA    AM2315C  |
//    BLACK  -------- | GND             |
//    WHITE  -------- | SCL             |
//                    +-----------------+


#include "AM2315C.h"

AM2315C DHT;

uint8_t count = 0;


void setup()
{
  Serial.begin(115200);
  Serial.println();
  Serial.println(__FILE__);
  Serial.print("AM2315C LIBRARY VERSION: ");
  Serial.println(AM2315C_LIB_VERSION);
  Serial.println();

  Wire.begin();
  DHT.begin();

  delay(1000);
}


void loop()
{
  if (millis() - DHT.lastRead() >= 1000)
  {
    //  READ DATA
    uint32_t start = micros();
    int status = DHT.read();
    uint32_t stop = micros();

    if ((count % 10) == 0)
    {
      count = 0;
      Serial.println();
      Serial.println("Type\tHumidity (%)\tTemp (°C)\tTime (µs)\tStatus");
    }
    count++;

    Serial.print("AM2315C \t");
    //  DISPLAY DATA, sensor has only one decimal.
    Serial.print(DHT.getHumidity(), 1);
    Serial.print("\t\t");
    Serial.print(DHT.getTemperature(), 1);
    Serial.print("\t\t");
    Serial.print(stop - start);
    Serial.print("\t\t");
    switch (status)
    {
      case AM2315C_OK:
        Serial.print("OK");
        break;
      case AM2315C_ERROR_CHECKSUM:
        Serial.print("Checksum error");
        break;
      case AM2315C_ERROR_CONNECT:
        Serial.print("Connect error");
        break;
      case AM2315C_MISSING_BYTES:
        Serial.print("Missing bytes");
        break;
      case AM2315C_ERROR_BYTES_ALL_ZERO:
        Serial.print("All bytes read zero");
        break;
      case AM2315C_ERROR_READ_TIMEOUT:
        Serial.print("Read time out");
        break;
      case AM2315C_ERROR_LASTREAD:
        Serial.print("Error read too fast");
        break;
      default:
        Serial.print("Unknown error");
        break;
    }
    Serial.print("\n");
  }
}

//  -- END OF FILE --

Nạp code vào Arduino

  1. Kết nối Arduino với máy tính qua cáp USB.
  2. Mở Arduino IDE, dán đoạn code vào cửa sổ chương trình.
  3. Chọn đúng Board (ví dụ: Arduino Uno) và Port COM.
  4. Bấm nút Upload (→) để nạp chương trình.

Mở Serial Monitor

  • Vào Tools → Serial Monitor (hoặc nhấn Ctrl + Shift + M).
  • Chọn tốc độ 9600 baud để xem kết quả đo nhiệt độ.

Ghi chú kỹ thuật

LM35: 10mV = 1°C. Nếu đo được 250mV thì nhiệt độ là 25°C.
DHT11 chỉ nên đọc mỗi 2 giây một lần để đảm bảo chính xác.

Giải thích các hàm chính

analogRead(pin) Đọc tín hiệu điện áp analog (0-1023).

Serial.begin(9600) Khởi động giao tiếp Serial với tốc độ 9600 baud.

Serial.print() / Serial.println() In dữ liệu ra cửa sổ Serial Monitor.

dht.readTemperature() / dht.readHumidity() Đọc nhiệt độ và độ ẩm từ DHT11.

isnan() Kiểm tra giá trị float có phải là NaN hay không.

Wire.begin() Khởi tạo giao tiếp I2C.

am2315.read() Gửi lệnh yêu cầu cảm biến trả về dữ liệu.

am2315.getTemperature() / getHumidity() Lấy dữ liệu nhiệt độ và độ ẩm từ AM2315C.

Bài tập mở rộng

  • Hiển thị giá trị nhiệt độ và độ ẩm lên màn hình LCD I2C
  • Gửi dữ liệu qua Serial sang phần mềm máy tính
  • Cảnh báo bằng LED hoặc buzzer nếu nhiệt độ vượt ngưỡng

Nhận xét

Mới hơn Cũ hơn