Cảm biến độ dẫn điện (EC, TDS): cấu tạo, nguyên lý, chế tạo và tự làm đầu đo với ESP32
Cảm biến độ dẫn điện hoạt động thế nào: EC và TDS, hằng số bình đo, vì sao phải đo bằng dòng xoay chiều, loại hai điện cực, bốn điện cực, cảm ứng, cách chế tạo và tự làm đầu đo với ESP32.
Cảm biến độ dẫn điện cho biết nước chứa nhiều hay ít chất hòa tan: muối, khoáng, phân bón, axit, kiềm. Bút đo TDS kiểm tra nước lọc, máy đo EC trong vườn thủy canh, đầu đo độ mặn trong ao nuôi tôm, cảm biến trong lò hơi và hệ thống xử lý nước đều dùng chung một nguyên lý: đo điện trở của một khối nước có hình dạng biết trước. Bài viết giải thích độ dẫn điện, EC và TDS, hằng số bình đo, lý do phải đo bằng dòng xoay chiều, ba kiểu cảm biến (hai điện cực, bốn điện cực, cảm ứng), quy trình chế tạo, rồi hướng dẫn tự làm một cảm biến độ dẫn điện bằng hai điện cực và ESP32.
1. Độ dẫn điện, EC và TDS

- Nước tinh khiết dẫn điện rất kém. Dòng điện trong nước do các ion hòa tan mang đi (Na⁺, Cl⁻, Ca²⁺, HCO₃⁻…), nên càng nhiều chất hòa tan dạng ion, nước càng dẫn điện tốt.
- EC (electrical conductivity, độ dẫn điện riêng) có đơn vị S/m; trong đo nước hay dùng µS/cm và mS/cm: 1 mS/cm = 1000 µS/cm, 1 S/m = 10 mS/cm. Nước siêu tinh khiết khoảng 0,055 µS/cm (điện trở suất 18,2 MΩ·cm), nước máy thường vài trăm µS/cm, nước biển khoảng 50 000 µS/cm.
- TDS (tổng chất rắn hòa tan, ppm hay mg/L) không đo trực tiếp được bằng điện. Bút TDS đo EC rồi nhân với một hệ số quy đổi, thường 0,5 đến 0,7 tùy loại muối giả định. Hai bút dùng hệ số khác nhau sẽ cho hai số ppm khác nhau với cùng một cốc nước.
- Độ dẫn điện tăng khoảng 2 % mỗi °C. Máy đo vì vậy luôn có cảm biến nhiệt độ và báo số đã quy về 25 °C (gọi là EC25 hoặc độ dẫn điện "bù nhiệt").

2. Nguyên lý đo: hằng số bình đo và dòng xoay chiều

Cảm biến đo điện trở R giữa hai điện cực. Điện trở này phụ thuộc cả dung dịch lẫn hình dạng điện cực: hai bản to đặt sát nhau cho điện trở nhỏ, hai que mảnh đặt xa nhau cho điện trở lớn. Hình dạng được gói vào một con số gọi là hằng số bình đo K (cm⁻¹):
- K = L / A với bình lý tưởng (hai bản phẳng diện tích A, cách nhau L). Điện cực thực có đường dòng điện tỏa ra ngoài nên K được xác định bằng hiệu chuẩn chứ không tính từ kích thước.
- EC = K × G = K / R, trong đó G = 1/R là độ dẫn (đơn vị S) đo được.
- Chọn K theo dải đo để R nằm trong vùng mạch đo tốt: K = 0,01 đến 0,1 cho nước siêu tinh khiết, nước nồi hơi; K = 1 cho nước máy, thủy canh; K = 10 trở lên cho nước biển, dung dịch đặc.
Nếu cho dòng một chiều chạy qua, ion dương dồn về cực âm, ion âm dồn về cực dương, tạo thành lớp điện tích kép và bọt khí do điện phân. Lớp này cản dòng điện nên điện trở đo được tăng dần theo thời gian (gọi là phân cực điện cực), điện cực còn bị ăn mòn. Vì vậy máy đo luôn dùng dòng xoay chiều, thường từ vài chục Hz tới vài kHz: mỗi nửa chu kỳ ion chưa kịp dồn lại thì dòng đã đổi chiều. Dung dịch càng đặc, tần số càng phải cao.

Các máy đo kiểu cũ như trong ảnh thường dùng mạch cầu điện trở cấp nguồn xoay chiều: người đo xoay núm có thang chia cho tới khi cầu cân bằng rồi đọc điện trở trên thang. Máy hiện đại thay mạch cầu bằng nguồn dòng xoay chiều, bộ khuếch đại và vi điều khiển, nhưng nguyên lý đo điện trở xoay chiều vẫn như cũ.
3. Ba kiểu cảm biến độ dẫn điện

| Kiểu | Cấu tạo | Ưu điểm | Hạn chế |
|---|---|---|---|
| Hai điện cực | Hai que hoặc hai bản kim loại (than chì, thép không gỉ, titan, bạch kim) | Rẻ, đơn giản, đo tốt nước sạch và nước có độ dẫn điện thấp | Dải đo hẹp với mỗi K; sai khi điện cực bẩn, đóng cặn hoặc dung dịch quá đặc (phân cực) |
| Bốn điện cực | Hai cực ngoài cấp dòng xoay chiều, hai cực trong đo điện áp bằng mạch trở kháng cao | Dải đo rộng; lớp bẩn và phân cực ở cực dòng gần như không ảnh hưởng vì cực đo hầu như không có dòng | Mạch đo phức tạp hơn, giá cao hơn |
| Cảm ứng (hình xuyến) | Hai cuộn dây hình xuyến bọc nhựa: cuộn kích tạo dòng điện cảm ứng chạy vòng trong nước, cuộn thu đo dòng đó | Không có kim loại chạm nước, bền với nước thải, axit, bùn; đo được độ dẫn điện rất cao | Không đo được nước có độ dẫn điện thấp; đầu đo to, cần khoảng trống quanh đầu đo |
Bút TDS rẻ tiền và module "TDS sensor" bán cho vi điều khiển đều là kiểu hai điện cực. Đầu đo công nghiệp cho nước tinh khiết dùng hai điện cực bằng thép không gỉ hoặc titan với K nhỏ; đầu đo cho hóa chất và nước thải thường là kiểu cảm ứng.
4. Chế tạo cảm biến độ dẫn điện

- Điện cực. Vật liệu phải không tan, không bị ăn mòn trong dung dịch cần đo: than chì, thép không gỉ 316, titan, bạch kim. Đầu đo phòng thí nghiệm dùng bạch kim phủ một lớp "muội bạch kim" xốp: diện tích bề mặt thực lớn gấp nhiều lần nên lớp điện tích kép có điện dung lớn, ít phân cực.
- Hình học. Khoảng cách, diện tích điện cực và cả ống bao quanh (giới hạn đường đi của dòng điện) phải cố định tuyệt đối, vì K phụ thuộc vào chúng. Ống bao còn giúp số đo không đổi khi đầu đo đặt gần thành bình.
- Cảm biến nhiệt độ. Một điện trở Pt1000 hoặc NTC đặt ngay trong đầu đo, sát dung dịch, để bù khoảng 2 %/°C.
- Thân và dây. Thân epoxy, PVC hoặc PEEK; đổ keo kín phần đấu nối; dây có lớp chống nhiễu vì tín hiệu là điện trở có thể lên tới hàng trăm kΩ.
- Hiệu chuẩn. Nhúng vào dung dịch chuẩn KCl đã biết độ dẫn điện (ví dụ dung dịch 0,01 mol/L có 1413 µS/cm ở 25 °C), đo điện trở, tính K thực và ghi lên đầu đo hoặc vào bộ nhớ của nó.
- Mạch đo. Nguồn xoay chiều không có thành phần một chiều (thường đi qua tụ nối tiếp), khuếch đại, chỉnh lưu đồng bộ hoặc lấy mẫu đúng pha, tự đổi thang đo, rồi tính EC, EC25, TDS, độ mặn.
5. Thực hành: tự làm cảm biến độ dẫn điện với ESP32
Ví dụ này không cần module riêng: hai chân GPIO thay nhau lên mức cao để tạo dòng xoay chiều qua hai điện cực tự làm, một điện trở chuẩn 1 kΩ nối tiếp, và ADC của ESP32 đo điện áp ở điểm giữa.
Linh kiện
- ESP32 DevKit V1 30 chân.
- Hai điện cực: hai đinh hoặc ốc vít inox, hai que than chì, hoặc hai đoạn dây titan, cố định song song cách nhau khoảng 1 đến 2 cm trên một miếng nhựa. Không dùng đồng hay sắt mạ kẽm vì bị ăn mòn nhanh và làm bẩn nước.
- Một điện trở 1 kΩ; breadboard, dây cắm.
- Để hiệu chuẩn: dung dịch chuẩn 1413 µS/cm (bán kèm nhiều bút EC), hoặc một bút EC đã hiệu chuẩn để so.
Sơ đồ nối

| Nối từ | Nối tới |
|---|---|
| GPIO25 | Một đầu điện trở 1 kΩ |
| Đầu kia điện trở 1 kΩ | Điện cực A và D34 |
| Điện cực B | GPIO26 |
Mạch không cần nối GND vào nước: hai điện cực chỉ nối với hai chân GPIO, mọi điện áp được đo so với GND của chính ESP32. Nếu nước trong bể có máy bơm hay máy sưởi cắm điện lưới, nên tắt chúng trong lúc thử để tránh dòng rò làm sai số đo.
Chương trình
/*
PYWORLD.VN - Tự làm cảm biến độ dẫn điện (EC, TDS) bằng ESP32: hai điện cực, kích xoay chiều bằng hai chân GPIO
Điện cực A nối D34 và qua điện trở 1 kΩ tới GPIO25; điện cực B nối thẳng GPIO26. Hai chân đảo chiều liên tục để không phân cực điện cực
Gõ "k1413" khi nhúng vào dung dịch chuẩn 1413 µS/cm để tính hằng số bình đo; "t28" để nhập nhiệt độ nước (°C)
*/
#define CHAN_KICH_A 25
#define CHAN_KICH_B 26
#define CHAN_DO 34
const float R_CHUAN = 1000.0; // Ôm, điện trở nối tiếp với điện cực A
const float VCC_MV = 3300.0;
const int SO_CHU_KY = 200; // Số chu kỳ đảo chiều cho mỗi kết quả
const float HE_SO_NHIET = 0.02; // Độ dẫn điện tăng khoảng 2 % mỗi °C
const float HE_SO_TDS = 0.5; // TDS (ppm) ≈ 0,5 × EC (µS/cm) ở 25 °C
float hangSoBinh = 1.0; // K (cm⁻¹) của cặp điện cực; tìm bằng lệnh k<µS/cm>
float nhietDo = 25.0;
// Đo điện trở dung dịch: mỗi chu kỳ cho dòng chạy một chiều rồi đảo chiều, thời gian hai nửa bằng nhau
float doDienTro() {
float tong = 0;
int dem = 0;
for (int i = 0; i < SO_CHU_KY; i++) {
digitalWrite(CHAN_KICH_A, HIGH); // Nửa chu kỳ 1: A dương, B âm
digitalWrite(CHAN_KICH_B, LOW);
delayMicroseconds(50);
float u1 = analogReadMilliVolts(CHAN_DO); // u1 = Vcc × Rdd / (Rchuan + Rdd)
digitalWrite(CHAN_KICH_A, LOW); // Nửa chu kỳ 2: đảo chiều dòng điện
digitalWrite(CHAN_KICH_B, HIGH);
delayMicroseconds(50);
float u2 = analogReadMilliVolts(CHAN_DO); // u2 = Vcc × Rchuan / (Rchuan + Rdd)
if (u1 > 5 && u1 < VCC_MV - 5 && u2 > 5 && u2 < VCC_MV - 5) {
float r1 = R_CHUAN * u1 / (VCC_MV - u1);
float r2 = R_CHUAN * (VCC_MV - u2) / u2;
tong += (r1 + r2) / 2;
dem++;
}
}
digitalWrite(CHAN_KICH_A, LOW); // Nghỉ: cả hai chân về 0, không còn dòng qua điện cực
digitalWrite(CHAN_KICH_B, LOW);
return dem > 0 ? tong / dem : -1;
}
void xuLyLenh(float dienTro) {
if (!Serial.available()) {
return;
}
String lenh = Serial.readStringUntil('\n');
lenh.trim();
if (lenh.startsWith("k") && dienTro > 0) {
float ecChuan = lenh.substring(1).toFloat(); // µS/cm ở 25 °C
float ecTaiNhietDo = ecChuan * (1 + HE_SO_NHIET * (nhietDo - 25));
hangSoBinh = ecTaiNhietDo * dienTro / 1.0e6f; // EC = K / R => K = EC × R
Serial.printf("Hang so binh K = %.3f /cm (ghi vao bien hangSoBinh)\n", hangSoBinh);
} else if (lenh.startsWith("t")) {
nhietDo = lenh.substring(1).toFloat();
Serial.printf("Nhiet do nuoc: %.1f C\n", nhietDo);
}
}
void setup() {
Serial.begin(115200);
pinMode(CHAN_KICH_A, OUTPUT);
pinMode(CHAN_KICH_B, OUTPUT);
digitalWrite(CHAN_KICH_A, LOW);
digitalWrite(CHAN_KICH_B, LOW);
analogSetPinAttenuation(CHAN_DO, ADC_11db);
Serial.println("\nDo do dan dien tu che: kich xoay chieu hai dien cuc");
}
void loop() {
float dienTro = doDienTro();
xuLyLenh(dienTro);
if (dienTro < 0) {
Serial.println("Ngoai dai do: dien cuc o ngoai khong khi hoac dung dich qua dac");
} else {
float ec = hangSoBinh / dienTro * 1.0e6f; // µS/cm ở nhiệt độ hiện tại
float ec25 = ec / (1 + HE_SO_NHIET * (nhietDo - 25)); // Quy về 25 °C
Serial.printf("R %.0f ohm | EC %.0f uS/cm | EC25 %.0f uS/cm | TDS %.0f ppm\n", dienTro, ec, ec25, ec25 * HE_SO_TDS);
}
delay(1000);
}
Giải thích
- Nửa chu kỳ 1 (GPIO25 cao, GPIO26 thấp): dòng chạy từ GPIO25 qua điện trở chuẩn, qua nước, về GPIO26. Điện áp ở D34 là u1 = Vcc × Rdd / (Rchuan + Rdd), suy ra Rdd = Rchuan × u1 / (Vcc − u1).
- Nửa chu kỳ 2 (đảo chiều): dòng chạy ngược lại; u2 = Vcc × Rchuan / (Rchuan + Rdd), suy ra Rdd = Rchuan × (Vcc − u2) / u2. Chương trình lấy trung bình hai kết quả qua 200 chu kỳ.
- Hai nửa chu kỳ dài bằng nhau (mỗi nửa chờ 50 µs rồi đọc ADC), nên dòng trung bình qua nước bằng 0, điện cực không bị phân cực. Đo xong, cả hai chân về mức thấp, không còn dòng điện qua nước giữa hai lần đo.
- EC = K / R (đổi sang µS/cm), rồi quy về 25 °C: EC25 = EC / (1 + 0,02 × (T − 25)). TDS = 0,5 × EC25; muốn so với một bút TDS cụ thể thì đổi
HE_SO_TDStheo hệ số của bút đó. - Mạch đo tốt nhất khi điện trở dung dịch cùng cỡ với điện trở chuẩn, khoảng 300 Ω đến 3 kΩ. Đo nước lọc RO (điện trở hàng chục kΩ trở lên) thì thay điện trở chuẩn bằng 10 kΩ hoặc 47 kΩ và sửa
R_CHUAN, hoặc làm điện cực to hơn, đặt gần nhau hơn để giảm K.
Hiệu chuẩn hằng số bình đo
- Rửa điện cực bằng nước cất, lau khô.
- Nhúng điện cực vào dung dịch chuẩn 1413 µS/cm, ngập cùng một độ sâu như khi đo thật, chờ số điện trở ổn định.
- Nếu dung dịch không ở 25 °C, gõ
tkèm nhiệt độ trước (ví dụt28), rồi gõk1413trong Serial Monitor (chọn kiểu xuống dòng "Newline"). Chương trình tính và in K. - Ghi số K vào biến
hangSoBinhtrong chương trình để lần nạp sau không phải hiệu chuẩn lại. Không có dung dịch chuẩn thì có thể so với một bút EC đã hiệu chuẩn: gõkkèm số bút đo đó báo trong cùng cốc nước.
Kết quả mong đợi

Điện cực inox tự làm cho kết quả đủ để theo dõi xu hướng: nước lọc có còn sạch không, dung dịch thủy canh cần thêm phân hay pha loãng. Muốn đo chính xác và lâu dài, nên dùng điện cực than chì hoặc titan, đo nhiệt độ bằng cảm biến thật thay cho lệnh t, và hiệu chuẩn lại định 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ý |
|---|---|---|
| Luôn báo "Ngoai dai do" | Điện cực chưa ngập nước, đứt dây, nối nhầm D34 | Kiểm tra lại dây theo bảng nối; nhúng ngập điện cực |
| Số EC nhảy nhiều giữa các lần đo | Bọt khí bám điện cực, nước đang chảy mạnh, dây dài gần nguồn nhiễu | Lắc nhẹ cho bọt bong ra; đặt điện cực chỗ nước yên; rút ngắn dây |
| Số đo trôi dần sau nhiều ngày | Điện cực bẩn, đóng cặn hoặc bị ăn mòn | Rửa bằng nước cất (cặn vôi: ngâm giấm loãng rồi rửa lại), hiệu chuẩn lại K |
| Nước lọc RO cho số rất thất thường | Điện trở dung dịch quá lớn so với điện trở chuẩn 1 kΩ | Dùng điện trở chuẩn lớn hơn (10 kΩ đến 47 kΩ) và sửa R_CHUAN |
| Kết quả khác bút TDS mua sẵn | Khác hệ số quy đổi TDS, khác nhiệt độ | So bằng EC25 thay cho TDS; chỉnh HE_SO_TDS theo bút |
| Số thay đổi khi bật máy bơm trong bể | Dòng rò từ thiết bị điện lưới qua nước | Tắt thiết bị khi đo; lắp đặt lâu dài thì dùng mạch đo cách ly |
7. Xem thêm
- Đọc ADC trên ESP32: cách ESP32 đo điện áp và hạn chế của ADC.
- 1-Wire và cách đọc DS18B20 bằng ESP32: thêm cảm biến nhiệt độ chống nước để bù nhiệt tự động.
- Các bài khác trong loạt: cảm biến pH (cũng đo trong dung dịch, cần hiệu chuẩn bằng dung dịch chuẩn), cảm biến nhiệt độ (NTC, Pt100), cảm biến mức.
Xem thêm