Biến trở, quang trở và nhiệt điện trở NTC: cách dùng và đọc bằng ESP32
Cấu tạo và cách mắc biến trở, biến trở B10K và A10K, quang trở LDR, nhiệt điện trở NTC, PTC, phương trình B, thí nghiệm đọc biến trở, LDR, NTC bằng ADC của ESP32 và chỉnh độ sáng LED.
Điện trở ở bài trước có giá trị cố định. Bài này nói về ba loại điện trở thay đổi được, rất hay gặp trong mạch thực tế: biến trở (thay đổi theo tay vặn), quang trở LDR (thay đổi theo ánh sáng) và nhiệt điện trở NTC (thay đổi theo nhiệt độ). Bài viết giải thích cấu tạo, ký hiệu, cách đọc thông số, cách mắc vào mạch, rồi làm thí nghiệm đọc cả ba bằng ADC của ESP32, tính ra phần trăm góc xoay, điện trở của quang trở và nhiệt độ từ NTC, đồng thời dùng biến trở để chỉnh độ sáng LED trên bo.
1. Biến trở (chiết áp)

- Biến trở có một rãnh vật liệu điện trở (than hoặc gốm kim loại) hình cung nối giữa chân 1 và chân 3, và một con chạy (chân 2) trượt trên rãnh khi vặn trục. Điện trở giữa chân 1 và 3 luôn bằng tổng trở ghi trên thân; con chạy chia tổng trở này thành hai phần.
- Mắc làm cầu phân áp (cách dùng phổ biến nhất): chân 1 nối nguồn, chân 3 nối GND, chân 2 ra điện áp từ 0 tới điện áp nguồn theo góc vặn. Đây là cách đọc núm vặn bằng vi điều khiển.
- Mắc làm điện trở biến đổi (chỉ dùng chân 1 và 2): để chỉnh dòng nhỏ, chỉnh hệ số khuếch đại. Không dùng biến trở nhỏ để chỉnh dòng lớn (độ sáng bóng đèn, tốc độ động cơ): con chạy chỉ chịu được dòng nhỏ và biến trở sẽ cháy; việc đó cần PWM và transistor (bài 19, 20).
- Chữ trên thân: B10K là 10 kΩ tuyến tính (điện trở tăng đều theo góc vặn), A10K là kiểu log dùng cho núm âm lượng (tai nghe cảm nhận âm lượng theo thang log). Đọc cảm biến, chỉnh mức ngưỡng thì dùng loại B.
- Ngoài biến trở xoay có trục còn có biến trở trượt, biến trở tinh chỉnh (trimmer, vặn bằng tuốc nơ vít, thường thấy màu xanh trên các module) và biến trở nhiều vòng cho chỉnh chính xác.

2. Quang trở (LDR)
- Quang trở là một lớp bán dẫn cadmi sunfua có điện trở giảm khi được chiếu sáng: trong tối có thể lên hàng trăm kΩ đến vài MΩ, dưới ánh đèn phòng khoảng vài kΩ đến vài chục kΩ, dưới nắng còn vài trăm Ω.
- Quang trở rẻ, dễ dùng nhưng chậm, phi tuyến và mỗi con lệch nhau khá nhiều. Đủ để phân biệt sáng hay tối (bật đèn khi trời tối, bài 30); muốn đo độ rọi chính xác thì dùng cảm biến số.
- Cách đọc: mắc nối tiếp với một điện trở cố định thành cầu phân áp. Đặt quang trở ở phía trên (nối nguồn) thì điện áp ra tăng khi sáng hơn.
Cấu tạo, đường đặc tính và cách hiệu chuẩn quang trở được trình bày kỹ trong bài cảm biến ánh sáng: quang trở, photodiode, BH1750.
3. Nhiệt điện trở NTC và PTC

- NTC (hệ số nhiệt âm) là gốm bán dẫn oxit kim loại có điện trở giảm mạnh khi nóng lên. Loại hay dùng để đo nhiệt là NTC 10 kΩ (10 kΩ ở 25 °C) với hệ số B = 3950 hoặc 3435; giá trị B ghi trong datasheet.
- Quan hệ điện trở và nhiệt độ gần đúng theo phương trình B: 1/T = 1/T0 + ln(R/R0) / B, với T tính bằng độ K, T0 = 298,15 K (25 °C), R0 là điện trở ở 25 °C. Chính xác hơn thì dùng phương trình Steinhart–Hart hoặc bảng tra của hãng.
- NTC công suất (ví dụ loại 47D-15 trong ảnh dưới) dùng để hạn dòng khởi động: lúc mới bật, NTC nguội có điện trở vài ôm, chặn dòng nạp tụ quá lớn; khi có dòng chạy, NTC nóng lên và điện trở giảm còn rất nhỏ.
- PTC (hệ số nhiệt dương) tăng điện trở khi nóng. Loại phổ biến nhất là cầu chì tự phục hồi (polyfuse): khi quá dòng, PTC nóng lên, điện trở tăng vọt, cắt gần hết dòng; nguội lại thì dẫn bình thường.

4. Thí nghiệm: đọc ba cảm biến kiểu điện trở bằng ESP32
Chuẩn bị
- ESP32 DevKit V1, breadboard, dây cắm.
- Một biến trở 10 kΩ (loại B), một quang trở (loại GL5528 hoặc tương tự), một NTC 10 kΩ B = 3950 (loại hạt nhỏ hoặc đầu dò bọc kim loại), hai điện trở 10 kΩ.

| Cảm biến | Cách nối | Chân ESP32 |
|---|---|---|
| Biến trở 10 kΩ | Chân 1 vào 3V3, chân 3 vào GND, chân giữa ra | GPIO34 |
| Quang trở | 3V3 – quang trở – điểm giữa – 10 kΩ – GND | GPIO35 (điểm giữa) |
| NTC 10 kΩ | 3V3 – 10 kΩ – điểm giữa – NTC – GND | GPIO32 (điểm giữa) |
| LED trên bo | Có sẵn trên DevKit V1 | GPIO2 |
Chương trình
/*
PYWORLD.VN - Đọc biến trở, quang trở (LDR) và nhiệt điện trở NTC bằng ADC của ESP32; biến trở chỉnh độ sáng LED trên bo
Biến trở 10 kΩ: hai đầu nối 3V3 và GND, chân giữa vào GPIO34. LDR: 3V3 -> LDR -> GPIO35 -> 10 kΩ -> GND
NTC 10 kΩ (B = 3950): 3V3 -> 10 kΩ -> GPIO32 -> NTC -> GND. LED xanh trên bo DevKit V1 ở GPIO2
*/
#include <math.h>
#define CHAN_BIEN_TRO 34
#define CHAN_LDR 35
#define CHAN_NTC 32
#define CHAN_LED 2
const float VCC_MV = 3300.0; // Đo chân 3V3 bằng đồng hồ vạn năng rồi sửa cho đúng
const float R_CO_DINH = 10000.0; // Ôm, điện trở cố định trong hai cầu phân áp
const float NTC_R0 = 10000.0; // Ôm, điện trở NTC ở 25 °C
const float NTC_B = 3950.0; // Hệ số B của NTC (ghi trên datasheet)
const float T0_K = 298.15; // 25 °C tính theo độ K
const int SO_LAN_DOC = 32;
float docTrungBinhMv(uint8_t chan) {
uint32_t tong = 0;
for (int i = 0; i < SO_LAN_DOC; i++) {
tong += analogReadMilliVolts(chan);
}
return (float)tong / SO_LAN_DOC;
}
void setup() {
Serial.begin(115200);
delay(500);
analogReadResolution(12);
ledcAttach(CHAN_LED, 5000, 8); // PWM 5 kHz, 8 bit (0 đến 255)
Serial.println("Doc bien tro, quang tro LDR va NTC bang ESP32");
}
void loop() {
// Biến trở: điện áp chân giữa tỉ lệ với góc xoay
float uBienTro = docTrungBinhMv(CHAN_BIEN_TRO);
float phanTram = constrain(uBienTro / VCC_MV * 100.0, 0.0, 100.0);
ledcWrite(CHAN_LED, (uint32_t)(phanTram * 255.0 / 100.0));
// Quang trở ở phía trên cầu phân áp: sáng hơn thì R nhỏ đi, điện áp tăng
float uLdr = docTrungBinhMv(CHAN_LDR);
float rLdr = (uLdr > 5) ? R_CO_DINH * (VCC_MV - uLdr) / uLdr : -1;
// NTC ở phía dưới cầu phân áp: nóng hơn thì R nhỏ đi, điện áp giảm
float uNtc = docTrungBinhMv(CHAN_NTC);
float rNtc = (VCC_MV - uNtc > 5) ? R_CO_DINH * uNtc / (VCC_MV - uNtc) : -1;
float nhietDo = -273.15;
if (rNtc > 0) {
// Phương trình B: 1/T = 1/T0 + ln(R/R0) / B
nhietDo = 1.0 / (1.0 / T0_K + log(rNtc / NTC_R0) / NTC_B) - 273.15;
}
Serial.printf("Bien tro %4.0f mV %3.0f %% | LDR %4.0f mV %5.1f kOhm | NTC %4.0f mV %5.2f kOhm %5.1f C\n",
uBienTro, phanTram, uLdr, rLdr / 1000.0, uNtc, rNtc / 1000.0, nhietDo);
delay(500);
}
- Biến trở: điện áp chân giữa chia cho điện áp nguồn ra phần trăm góc xoay. Phần trăm này đưa vào PWM (bộ LEDC, 8 bit) để chỉnh độ sáng LED trên bo: vặn biến trở là LED sáng dần.
- Quang trở nằm phía trên cầu phân áp: R = R_cố_định × (Vcc − U) / U.
- NTC nằm phía dưới cầu phân áp: R = R_cố_định × U / (Vcc − U); sau đó tính nhiệt độ bằng phương trình B. Hàm
log()trong C là logarit tự nhiên (ln). - Đo chân 3V3 bằng đồng hồ vạn năng rồi sửa
VCC_MVđể kết quả chính xác hơn; sai số 1 % của điện trở 10 kΩ gây sai khoảng 0,25 °C ở nhiệt độ phòng.
Kết quả mong đợi

- Vặn biến trở: điện áp và phần trăm tăng đều, LED xanh trên bo sáng dần.
- Lấy tay che quang trở: điện trở tăng lên hàng chục kΩ; chiếu đèn pin: giảm còn khoảng 1 kΩ.
- Kẹp NTC giữa hai ngón tay: điện trở giảm, nhiệt độ tăng dần lên khoảng 32–34 °C sau vài chục giây (NTC cần thời gian để nóng theo tay).
5. Chọn điện trở cố định cho cầu phân áp
Với cảm biến có điện trở thay đổi từ Rmin tới Rmax, điện áp ra thay đổi nhiều nhất khi điện trở cố định bằng khoảng √(Rmin × Rmax). Ví dụ NTC dùng để đo trong khoảng 0–50 °C (33,6 kΩ tới 3,59 kΩ): √(33,6 × 3,59) ≈ 11 kΩ, nên dùng 10 kΩ. Quang trở dùng ở trong nhà (khoảng 2 kΩ tới 50 kΩ): √(2 × 50) = 10 kΩ.
6. Xử lý lỗi thường gặp
| Hiện tượng | Nguyên nhân thường gặp | Cách xử lý |
|---|---|---|
| Biến trở chỉ đổi ở một đoạn ngắn rồi đứng yên | Dùng biến trở loại A (log), hoặc nối nhầm chân giữa ra ngoài | Dùng loại B; chân giữa là con chạy |
| Nhiệt độ NTC sai vài chục độ | Đảo vị trí NTC và điện trở 10 kΩ so với công thức, hoặc NTC có B, R0 khác | Đối chiếu sơ đồ; sửa NTC_R0, NTC_B theo datasheet |
| LDR báo -0.0 kOhm hoặc số rất lớn | Đứt dây, quang trở cắm lệch, hoặc trời rất tối | Kiểm tra dây; ở chỗ tối dùng điện trở cố định lớn hơn |
| LED trên bo không sáng | Bo không có LED ở GPIO2 | Nối LED ngoài qua điện trở 330 Ω vào GPIO2 |
7. Xem thêm
- PWM trên ESP32: điều chỉnh độ sáng LED.
- Cảm biến nhiệt độ: cặp nhiệt điện, RTD, NTC.
- Cánh tay robot 4 servo điều khiển bằng biến trở.
- Bài tiếp theo của loạt điện tử căn bản: tụ điện.
Xem thêm