Series
Series 37 Module Cảm Biến
  1. Series 37 Module Cảm Biến: Nguyên lý hoạt động và cách test với Arduino, ESP32
  2. 1Series 37 Module Cảm Biến – DS3231 RTC: TCXO ±2ppm, I2C, Alarm Ngắt SQW & Đồng Hồ Thực Với Backup Pin
  3. 2Series 37 Module Cảm Biến – SD Card Module SPI: FAT32, Ghi Log CSV Cảm Biến & Đọc Config File Không Hardcode
  4. 3Series 37 Module Cảm Biến – LCD 1602 I2C: PCF8574 Expander, LiquidCrystal_I2C, Cuộn Chữ & Ký Tự Tùy Chỉnh
  5. 4Series 37 Module Cảm Biến – 7-Segment 1 Chữ Số: Mã Segment 0x3F-0x7F, Common Anode vs Cathode & Đếm 0-9
  6. 5Series 37 Module Cảm Biến – OLED SSD1306 0.96\” I2C: Frame Buffer, Adafruit GFX & Hiển Thị Dữ Liệu Thực Tế
  7. 6Series 37 Module Cảm Biến – Nguyên Lý LM35 Analog: Đặc Tuyến 10mV/°C, Đọc ADC Chính Xác & Hiệu Chỉnh Nhiệt Độ
  8. 7Series 37 Module Cảm Biến – Nguyên Lý Knock Sensor KY-031: Piezoelectric Thuận, Va Đập → Điện Áp & Nhận Dạng Pattern
  9. 8Series 37 Module Cảm Biến – Nguyên Lý MPU-6050: IMU 6 Trục, MEMS Gia Tốc + Con Quay, Complementary Filter & Góc Nghiêng
  10. 9Series 37 Module Cảm Biến – Nguyên Lý Relay 5V SRD-05VDC: Cơ Điện Từ, Cách Ly Galvanic & Điều Khiển Thiết Bị 220V
  11. 10Series 37 Module Cảm Biến – Nguyên Lý Hall Effect Analog (49E/SS49E): Đo Cường Độ Từ Trường Tuyến Tính & ADC
  12. 11Series 37 Module Cảm Biến – Nguyên Lý Hall Effect KY-003: Hiệu Ứng Hall, IC Số Unipolar & Phát Hiện Nam Châm
  13. 12Series 37 Module Cảm Biến – Nguyên Lý Reed Switch: Tiếp Điểm Từ Trong Kính, Phát Hiện Cửa & Đo Tốc Độ Quay
  14. 13Series 37 Module Cảm Biến – Nguyên Lý Vibration Switch SW-18010P: Lò Xo Dẫn Điện, Phát Hiện Rung & Pattern Gõ
  15. 14Series 37 Module Cảm Biến – Nguyên Lý Tilt Switch SW-520D: Bi Kim Loại Dẫn Điện, Phát Hiện Nghiêng & Báo Động
  16. 15Series 37 Module Cảm Biến – Nguyên Lý Touch Sensor TTP223: Capacitive Self-Capacitance, Chế Độ Toggle & Latch
  17. 16Series 37 Module Cảm Biến – Nguyên Lý Rotary Encoder KY-040: Xung Quadrature, Đếm Hướng Xoay & Điều Khiển Menu
  18. 17Series 37 Module Cảm Biến – Nguyên Lý Joystick KY-023: Biến Trở 2 Trục, Dead Zone & Điều Khiển Robot / Servo
  19. 18Series 37 Module Cảm Biến – Nguyên Lý Sound Sensor: Microphone Electret, LM393 Comparator & Phát Hiện Tiếng Ồn
  20. 19Series 37 Module Cảm Biến – Nguyên Lý Passive Buzzer: PWM Điều Khiển Tần Số, Hàm tone() & Phát Nhạc Arduino ESP32
  21. 20Series 37 Module Cảm Biến – Nguyên Lý Active Buzzer: Oscillator Tích Hợp, Phân Biệt Active/Passive & Code Cảnh Báo
  22. 21Series 37 Module Cảm Biến – Nguyên Lý 7-Color LED Tự Đổi Màu: IC Tích Hợp, Tần Số Dao Động Nội & Ứng Dụng Trang Trí
  23. 22Series 37 Module Cảm Biến – Nguyên Lý RGB LED Module KY-016: Điốt 3 Màu, PWM Mix Màu 16 Triệu Sắc & Hiệu Ứng
  24. 23Series 37 Module Cảm Biến – Nguyên Lý Hoạt Động IR Receiver VS1838B: Demodulate 38kHz, NEC Protocol & Điều Khiển Từ Xa
  25. 24Series 37 Module Cảm Biến – Nguyên Lý Hoạt Động LDR Quang Trở: CdS Photoconductor, Voltage Divider & Điều Khiển Theo Ánh Sáng
  26. 25Series 37 Module Cảm Biến – Nguyên Lý Hoạt Động Laser Module KY-008: Diode Laser 650nm, Cộng Hưởng Quang Học & An Toàn Laser
  27. 26Series 37 Module Cảm Biến – Nguyên Lý Hoạt Động Flame Sensor: Phổ IR Lửa 760-1100nm, LM393 & Ứng Dụng Chữa Cháy
  28. 27Series 37 Module Cảm Biến – Nguyên Lý Hoạt Động Line Tracking Sensor TCRT5000: Dò Đường IR, Khoảng Cách Tối Ưu & Robot Theo Vạch
  29. 28Series 37 Module Cảm Biến – Nguyên Lý Hoạt Động IR Obstacle Sensor: Phản Xạ Hồng Ngoại, LM393 & Tránh Vật Cản Robot
  30. 29Series 37 Module Cảm Biến – Nguyên Lý Hoạt Động PIR HC-SR501: Pyroelectric Infrared, Fresnel Lens & Phát Hiện Chuyển Động
  31. 30Series 37 Module Cảm Biến – Nguyên Lý Hoạt Động HC-SR04: Sóng Siêu Âm 40kHz, Thời Gian Bay & Đo Khoảng Cách Chính Xác
  32. 31Series 37 Module Cảm Biến – Nguyên Lý Hoạt Động MQ-2: Semiconductor SnO₂, Đường Cong Nhạy Khí & Đo Nồng Độ Gas
  33. 32Series 37 Module Cảm Biến – Nguyên Lý Hoạt Động Rain Sensor FC-37: Phát Hiện Mưa, LM393 Comparator & Ứng Dụng Thực Tế
  34. 33Series 37 Module Cảm Biến – Nguyên Lý Hoạt Động Soil Moisture Sensor: Điện Trở Đất, Hiệu Chỉnh & Tưới Cây Tự Động
  35. 34Series 37 Module Cảm Biến – Nguyên Lý Hoạt Động BMP280: Cảm Biến Áp Suất & Nhiệt Độ Chính Xác Của Bosch
  36. 35Series 37 Module Cảm Biến – Nguyên Lý Hoạt Động DS18B20: Cảm Biến Nhiệt Độ 1-Wire Chống Nước
  37. 36Series 37 Module Cảm Biến – Nguyên Lý Hoạt Động DHT22 (AM2302): Độ Chính Xác Cao, Dải Đo Rộng
  38. 37Series 37 Module Cảm Biến – Nguyên Lý Hoạt Động DHT11: Cảm Biến Nhiệt Độ & Độ Ẩm Phổ Biến Nhất
Cảm biến

Series 37 Module Cảm Biến – Nguyên Lý LM35 Analog: Đặc Tuyến 10mV/°C, Đọc ADC Chính Xác & Hiệu Chỉnh Nhiệt Độ

Th7 2026
Series 37 Module Cảm Biến – Nguyên Lý LM35 Analog: Đặc Tuyến 10mV/°C, Đọc ADC Chính Xác & Hiệu Chỉnh Nhiệt Độ

LM35 là IC cảm biến nhiệt độ analog của Texas Instruments, nổi tiếng vì đặc tuyến cực kỳ tuyến tính và không cần hiệu chỉnh. Bài này giải thích tại sao cần ít nhất 4V để vận hành LM35, cách tính nhiệt độ đúng cho cả Arduino (5V ADC) và ESP32 (3.3V ADC), và phương pháp averaging để giảm nhiễu ADC.

Nguyên Lý Hoạt Động

1. Cấu Trúc Nội Bộ LM35 — Bandgap Reference

LM35 dùng sự chênh lệch điện áp giữa 2 transistor bipolar để đo nhiệt độ:

LM35 — Sơ đồ khối:

                VCC (+4V minimum)
                     │
              [Current source]
                     │
      ┌──────────────┤
      │    Q1 (nhỏ) │ Q2 (lớn hơn N lần)
      │    Vbe1      │ Vbe2
      │              │
      └──────┬───────┘
             │ ΔVbe = Vt × ln(N) ∝ Temperature (T Kelvin)
             │
         [Amplification] ← Khuếch đại ΔVbe × K
             │
           VOUT = 10mV × T(°C)

Phương trình:

  • ΔVbe = (k×T/q) × ln(N) — tỉ lệ thuận với nhiệt độ Kelvin
  • Sau khi offset và khuếch đại: V_OUT = 10mV × T(°C)
  • Tại 0°C: V_OUT = 0V (không phải 0K!)
  • Tại 25°C: V_OUT = 250mV
  • Tại 100°C: V_OUT = 1000mV = 1V

2. Đặc Tuyến Tuyến Tính

V_OUT (mV)
1500 │                          /
     │                        /
1000 │                      /  ← 1000mV = 100°C
     │                    /
500  │                  /
     │                /
250  │─────────────/───────────── ← 250mV = 25°C
     │            /
0    │──────────/────────────────
     ├──────────────────────────── T(°C)
     0    25   50   75   100  150

Độ dốc = 10mV/°C (cố định, rất tuyến tính)

3. Yêu Cầu VCC Tối Thiểu 4V

LM35 cần tối thiểu 4V để hoạt động chính xác:

  • Internal reference circuit cần headroom điện áp
  • Dưới 4V: output không tuyến tính
  • Không thể dùng 3.3V — vì vậy với ESP32 phải lấy 5V từ pin VBUS (USB 5V)

Nhưng OUTPUT an toàn với ESP32:

  • Tại 150°C: V_OUT = 1.5V < 3.3V → an toàn cho GPIO ESP32
  • Không cần level shifter — chỉ cần cấp VCC = 5V, nối output vào ADC

4. Phân Biệt Với Cảm Biến Khác

LM35DHT11 (Bài 01)DS18B20 (Bài 03)
Giao tiếpAnalog (10mV/°C)Digital (1-Wire)Digital (1-Wire)
Độ chính xác±0.5°C±2°C±0.5°C
VCC4-30V3.3-5V3-5.5V
Thư việnKhông cầnDHT.hDallasTemperature
Đo độ ẩmKhôngKhông
Ưu điểmĐơn giản, tuyến tínhCả nhiệt/ẩmWaterproof version

Thông Số Kỹ Thuật

Thông sốGiá trị
Điện áp VCC4V – 30V (tối thiểu 4V)
Dòng tiêu thụ60μA
Độ nhạy10mV/°C
Dải đo-55°C đến 150°C (config đặc biệt), 2°C đến 150°C (cơ bản)
Độ chính xác±0.5°C tại 25°C, ±1°C toàn dải
Thời gian đáp ứng~1 giây (không có vỏ kim loại)

Sơ Đồ Chân (Pinout)

LM35DZ (TO-92 Package) — Nhìn từ mặt có chữ:

  ┌──────────────────┐
  │     LM35DZ       │
  │                  │
  └──┬────┬────┬─────┘
     │    │    │
    VCC  VOUT  GND
    (+)         (-)
ChânMô tả
Pin 1VCC (+4V đến 30V)
Pin 2VOUT — Analog output (10mV/°C)
Pin 3GND

Lưu ý phân biệt chân: Nhìn mặt phẳng có chữ “LM35” hướng vào mình, chân từ trái sang phải: VCC, VOUT, GND.

Kết Nối Phần Cứng

LM35 với ESP32 DevKit V1

ESP32 DevKit V1           LM35
─────────────────────     ──────────────────────
VIN (5V VBUS) ─────────→  Pin 1 (VCC)   ← 5V bắt buộc!
GND  ─────────────────→  Pin 3 (GND)
GPIO34 (ADC) ──────────→  Pin 2 (VOUT)  ← Input-only, ADC1

Không quên: tụ 100nF từ VCC xuống GND gần chân LM35 (bypass capacitor)

GPIO34: ADC1 Ch6, input-only — không bị ảnh hưởng bởi WiFi.

LM35 với Arduino Uno

Arduino Uno               LM35
─────────────────────     ──────────────────────
5V   ─────────────────→  Pin 1 (VCC)
GND  ─────────────────→  Pin 3 (GND)
A0 (Analog)  ──────────→  Pin 2 (VOUT)

Công Thức Chuyển Đổi ADC → Nhiệt Độ

Arduino Uno (5V ADC reference, 10-bit):

V_out(mV) = analogRead(pin) × 5000.0 / 1023.0
Temperature(°C) = V_out / 10.0

ESP32 (3.3V ADC reference, 12-bit, LM35 powered by 5V):

V_out(mV) = analogRead(pin) × 3300.0 / 4095.0
Temperature(°C) = V_out / 10.0

Code Arduino IDE

Code Nhiệt Kế Cơ Bản — Arduino Uno

/*
 * LM35 — Nhiệt kế analog cơ bản
 * Board: Arduino Uno
 * Kết nối: VCC→5V, GND→GND, VOUT→A0
 *
 * Công thức:
 *   V_out(mV) = analogRead(A0) × 5000.0 / 1023.0
 *   Temp(°C)  = V_out / 10.0  (vì 10mV/°C)
 */

const int LM35_PIN = A0;
const float VREF   = 5000.0; // mV — điện áp tham chiếu ADC
const float ADC_MAX = 1023.0; // 10-bit ADC
const float MV_PER_DEG = 10.0; // 10mV/°C

void setup() {
  Serial.begin(9600);
  Serial.println("=== LM35 Nhiệt Kế ===");
  Serial.println("Nhiệt độ (°C) | Nhiệt độ (°F)");
}

float readTemperature() {
  int raw = analogRead(LM35_PIN);
  float voltage_mV = raw * VREF / ADC_MAX;
  return voltage_mV / MV_PER_DEG;
}

void loop() {
  float tempC = readTemperature();
  float tempF = tempC * 9.0 / 5.0 + 32.0; // Chuyển sang Fahrenheit

  Serial.print(tempC, 2); Serial.print("°C   | ");
  Serial.print(tempF, 2); Serial.println("°F");

  delay(1000);
}

Code Averaging Để Giảm Nhiễu ADC — Arduino Uno

/*
 * LM35 — Averaging: lấy trung bình nhiều mẫu giảm nhiễu ADC
 * Board: Arduino Uno
 * Kết nối: VCC→5V, GND→GND, VOUT→A0
 *
 * LM35 output ổn định nhưng ADC Arduino có nhiễu ±1-2 LSB
 * Trung bình 10-20 mẫu: nhiễu giảm ~3-4 lần
 */

const int LM35_PIN = A0;
const int SAMPLES  = 20;   // Số mẫu trung bình
const float VREF   = 5000.0;
const float ADC_MAX = 1023.0;

float readTemperatureAveraged(int numSamples) {
  long sum = 0;
  for (int i = 0; i < numSamples; i++) {
    sum += analogRead(LM35_PIN);
    delay(10); // Chờ ADC ổn định giữa các lần đọc
  }
  float avgRaw = (float)sum / numSamples;
  float voltage_mV = avgRaw * VREF / ADC_MAX;
  return voltage_mV / 10.0; // 10mV/°C
}

// Moving average buffer (không cần delay dài)
const int BUFFER_SIZE = 10;
float tempBuffer[BUFFER_SIZE];
int bufferIndex = 0;
float bufferSum = 0;
bool bufferFull = false;

void addToBuffer(float temp) {
  bufferSum -= tempBuffer[bufferIndex]; // Trừ giá trị cũ
  tempBuffer[bufferIndex] = temp;
  bufferSum += temp;                   // Cộng giá trị mới
  bufferIndex = (bufferIndex + 1) % BUFFER_SIZE;
  if (bufferIndex == 0) bufferFull = true;
}

float getMovingAverage() {
  int count = bufferFull ? BUFFER_SIZE : bufferIndex;
  return count > 0 ? bufferSum / count : 0;
}

void setup() {
  Serial.begin(9600);
  memset(tempBuffer, 0, sizeof(tempBuffer));
  Serial.println("LM35 Averaging Demo");
  Serial.println("Raw(°C) | Moving Avg (°C)");
}

void loop() {
  // Đọc 1 mẫu
  int raw = analogRead(LM35_PIN);
  float singleReading = raw * 5000.0 / 1023.0 / 10.0;

  // Thêm vào buffer moving average
  addToBuffer(singleReading);
  float smoothed = getMovingAverage();

  Serial.print(singleReading, 2); Serial.print("     | ");
  Serial.println(smoothed, 2);

  delay(200);
}

Code Báo Động Nhiệt Độ Cao — Arduino Uno

/*
 * LM35 — Nhiệt kế với báo động nhiệt độ cao và thấp
 * LED xanh: bình thường, LED đỏ: quá nóng, buzzer: cảnh báo
 * Board: Arduino Uno
 * Kết nối: VCC→5V, GND→GND, VOUT→A0
 *           LED xanh→Pin9, LED đỏ→Pin10, Buzzer→Pin11
 */

const int LM35_PIN    = A0;
const int LED_OK      = 9;   // Xanh — bình thường
const int LED_ALERT   = 10;  // Đỏ — quá nóng
const int BUZZER_PIN  = 11;

// Ngưỡng cảnh báo
const float TEMP_HIGH = 35.0; // °C — cảnh báo quá nóng
const float TEMP_LOW  = 15.0; // °C — cảnh báo quá lạnh (nếu có)

float readTempC() {
  long sum = 0;
  for (int i = 0; i < 10; i++) { sum += analogRead(LM35_PIN); delay(5); }
  return (float)sum / 10.0 * 5000.0 / 1023.0 / 10.0;
}

void setup() {
  Serial.begin(9600);
  pinMode(LED_OK, OUTPUT);
  pinMode(LED_ALERT, OUTPUT);
  pinMode(BUZZER_PIN, OUTPUT);
  Serial.println("Nhiệt kế cảnh báo: [Bình thường 15-35°C]");
}

void loop() {
  float temp = readTempC();

  Serial.print("Nhiệt độ: "); Serial.print(temp, 1); Serial.print("°C  ");

  if (temp >= TEMP_HIGH) {
    // Quá nóng
    Serial.println("⚠ QUÁ NÓNG!");
    digitalWrite(LED_OK, LOW);
    digitalWrite(LED_ALERT, HIGH);
    // Beep nhanh
    for (int i = 0; i < 3; i++) {
      digitalWrite(BUZZER_PIN, HIGH); delay(100);
      digitalWrite(BUZZER_PIN, LOW);  delay(100);
    }
  } else if (temp <= TEMP_LOW) {
    // Quá lạnh
    Serial.println("⚠ QUÁ LẠNH!");
    digitalWrite(LED_OK, LOW);
    digitalWrite(LED_ALERT, HIGH);
    digitalWrite(BUZZER_PIN, HIGH); delay(300);
    digitalWrite(BUZZER_PIN, LOW);
  } else {
    // Bình thường
    Serial.println("✓ Bình thường");
    digitalWrite(LED_OK, HIGH);
    digitalWrite(LED_ALERT, LOW);
    digitalWrite(BUZZER_PIN, LOW);
  }

  delay(1000);
}

Code ESP32 — LM35 ADC 12-bit

/*
 * LM35 — ESP32, ADC 12-bit (0-4095)
 * Board: ESP32 DevKit V1
 * Kết nối: VCC→VIN(5V), GND→GND, VOUT→GPIO34
 *
 * QUAN TRỌNG: LM35 cấp 5V từ VIN pin (USB power)
 *             VOUT kết nối GPIO34 (ADC1, max 3.3V → safe)
 */

const int LM35_PIN  = 34;   // ADC1 Ch6
const float VREF_MV = 3300.0; // ESP32 ADC reference: 3.3V = 3300mV
const float ADC_MAX  = 4095.0; // 12-bit

float readTempC() {
  long sum = 0;
  for (int i = 0; i < 20; i++) {
    sum += analogRead(LM35_PIN);
    delay(5);
  }
  float avgRaw = (float)sum / 20.0;
  float voltage_mV = avgRaw * VREF_MV / ADC_MAX;
  return voltage_mV / 10.0; // 10mV/°C
}

void setup() {
  Serial.begin(115200);
  analogSetAttenuation(ADC_11db); // Đọc 0-3.3V đầy đủ
  Serial.println("=== LM35 ESP32 (12-bit ADC) ===");
}

void loop() {
  float tempC = readTempC();
  float tempF = tempC * 1.8 + 32;

  Serial.printf("Nhiệt độ: %.2f°C | %.2f°F\n", tempC, tempF);

  delay(1000);
}

Kết Quả Mong Đợi

=== LM35 Nhiệt Kế ===
Nhiệt độ (°C) | Nhiệt độ (°F)
27.30°C   | 81.14°F
27.25°C   | 81.05°F
27.35°C   | 81.23°F

Ứng Dụng Thực Tế

Ứng dụngChi tiết
Nhiệt kế phòngHiển thị trên LCD 1602 (Bài 35)
Bảo vệ quá nhiệtTắt máy khi T > 70°C
Ghi log nhiệt độLưu vào SD card (Bài 36) theo giờ
Bộ điều nhiệtĐiều khiển relay quạt/máy lạnh
Theo dõi nhiệt độ pinCảnh báo khi pin Li-Ion quá nóng

Lưu Ý Khi Sử Dụng

1. VCC phải tối thiểu 4V — không dùng 3.3V

Dưới 4V: internal reference circuit không đủ headroom → output phi tuyến → nhiệt độ đo sai. Với ESP32: lấy 5V từ pin VIN (khi kết nối USB hoặc nguồn ngoài ≥ 5V).

2. Thời gian đáp ứng chậm

LM35 TO-92 package đo nhiệt độ chính xác nhưng chậm (~60 giây để cân bằng nhiệt với môi trường). Để đo nhanh hơn: nhúng vào chất lỏng, dùng quạt mini, hoặc dùng DS18B20 waterproof.

3. Nhiễu ADC — averaging cần thiết

ADC Arduino nhiễu ±1-2 LSB tương đương ±0.5-1°C. Lấy trung bình 10-20 mẫu cải thiện đáng kể. ESP32 ADC nhiễu lớn hơn và phi tuyến → cần averaging nhiều hơn (20-50 mẫu).

4. Đo âm độ cần mạch bổ sung

Dưới 0°C: V_OUT âm (ví dụ -10°C = -100mV). Arduino/ESP32 ADC không đọc được điện áp âm. Cần mạch offset (level shift) +2.5V hoặc dùng LM35 DZ (bù offset).

Bài tiếp theo: