Датчик TDS с Arduino: измерение ppm, калибровка и контроль качества воды
Как использовать датчик TDS с Arduino: что означает ppm, температурная компенсация с DS18B20, калибровка, значения для питьевой воды, аквариума и гидропоники, запись данных на ESP32.
Объедини датчик TDS с Arduino — и получишь недорогой измеритель качества воды, который за несколько секунд покажет в ppm (миллионных долях), сколько в воде растворённых минералов, солей и металлов. TDS (общее содержание растворённых веществ) — самый практичный показатель для оценки жёсткости водопроводной воды, проверки работы фильтра, определения времени подмены воды в аквариуме или концентрации питательного раствора для гидропоники. Карманные TDS-метры работают по тому же принципу; с Arduino можно непрерывно записывать измерения, выводить их на дисплей и подавать сигнал при пересечении порога.
В этой статье мы пошагово разберём, что означает ppm, как датчик на самом деле измеряет электропроводность, как температура влияет на результат и как компенсировать её с помощью DS18B20, калибровку эталонным раствором, код для Arduino Uno, таблицы значений для питьевой воды, аквариумов и гидропоники, контроль фильтра воды, запись с метками времени на ESP32 и код для Raspberry Pi Pico. В последнем разделе ты узнаешь, чем датчик TDS отличается от датчика pH, и познакомишься с частыми ошибками.

Что такое TDS и что означает ppm?
TDS — общее количество всех веществ, растворённых в литре воды: основную часть составляют ионы кальция, магния, натрия, калия, гидрокарбоната, хлорида, сульфата и нитрата. Единица измерения — ppm (миллионные доли) или её эквивалент для воды мг/л; 1 ppm означает 1 миллиграмм растворённого вещества в 1 литре воды. Например, каждый литр водопроводной воды с TDS 250 ppm содержит четверть грамма минералов. У чистой (дистиллированной) воды TDS очень близок к нулю, а у морской — около 35 000 ppm.
Сразу важно понять: один лишь TDS не говорит, «чистая или грязная» вода. Богатая минералами родниковая вода может иметь высокий TDS и быть совершенно полезной для здоровья; с другой стороны, вода с низким TDS может содержать бактерии, свинец или пестициды, поскольку они почти не меняют её электропроводность. Датчик TDS отлично подходит для отслеживания минеральной нагрузки воды и её изменений; для оценки микробиологической безопасности нужен лабораторный анализ.
Как работает датчик TDS? От электропроводности к ppm
Датчики TDS для Arduino на самом деле измеряют электропроводность (EC). Чистая вода почти не проводит электричество; чем больше в ней растворённых ионов, тем выше её электропроводность. Плата подаёт небольшое напряжение между двумя электродами на конце зонда и измеряет протекающий ток. Это напряжение переменное, а не постоянное: при постоянном токе на электродах образовывались бы пузырьки газа (поляризация), показания уходили бы, а электроды быстро изнашивались. Плата преобразует результат в аналоговое напряжение от 0 до 2,3 V; Arduino считывает его, переводит сначала в электропроводность (µS/см), а затем в TDS с помощью коэффициента пересчёта.
Пересчёт электропроводности в TDS приблизителен: TDS (ppm) = EC (µS/cm) × k. Большинство измерителей и код в этой статье используют k = 0.5 (шкалу хлорида натрия, или «500»). Некоторые измерители для гидропоники используют 0,7, поэтому два прибора могут показывать для одной воды 500 и 700 ppm и оба быть «правы». При сравнении значений проверяй коэффициент, а в гидропонике по возможности работай напрямую с EC (mS/см).
| Характеристика | Значение (обычный модуль TDS) |
|---|---|
| Питание | 3,3–5,5 V |
| Выход | Аналоговый, 0–2,3 V |
| Диапазон измерений | 0–1 000 ppm |
| Точность | Около ±10% (при 25 °C, от полной шкалы) |
| Возбуждение | Переменный ток (предотвращает поляризацию) |
| Зонд | Водонепроницаемый, два электрода; примерно до 55 °C |
| Плата | Не водонепроницаема, держи сухой |
Температурная компенсация: зачем нужен DS18B20
Электропроводность воды заметно меняется с температурой: при нагреве ионы движутся быстрее, и у одной и той же воды она становится примерно на 2% выше при повышении температуры на каждый 1 °C. Показания одной воды при 15 °C и 30 °C различаются примерно на треть; это намного больше погрешности самого измерения. Поэтому показания TDS приводят к 25 °C: скорректированное напряжение = измеренное напряжение / (1 + 0.02 × (T − 25)). Лучше всего для температуры воды подходит водонепроницаемый DS18B20 в гильзе из нержавеющей стали; его помещают в ту же воду рядом с зондом TDS.

DS18B20 использует протокол с одной линией данных OneWire и обеспечивает точность ±0,5 °C. Между линией данных и VCC нужен подтягивающий резистор 4,7 kΩ; если не знаешь цветовой код, воспользуйся утилитой «Цветовой код». Подробности о датчике и подключении нескольких DS18B20 к одной линии — в статье «Датчик температуры DS18B20». Без датчика температуры код предполагает 25 °C, чего достаточно для простых проверок при комнатной температуре.
Подключение: Arduino Uno, ESP32 и Pico
| Пин компонента | Arduino Uno | ESP32 | Raspberry Pi Pico |
|---|---|---|---|
| TDS VCC (+) | 5V | 3V3 | 3V3 (OUT) |
| TDS GND (−) | GND | GND | GND |
| TDS A (сигнал) | A0 | GPIO 34 (ADC1) | GP26 (ADC0) |
| DS18B20 VCC (красный) | 5V | 3V3 | 3V3 (OUT) |
| DS18B20 GND (чёрный) | GND | GND | GND |
| DS18B20 DATA (жёлтый) | D2 + 4,7 kΩ к VCC | GPIO 4 + 4,7 kΩ к 3V3 | GP22 + 4,7 kΩ к 3V3 |
Код TDS для Arduino: медианный фильтр и компенсация
- Установи библиотеки OneWire и DallasTemperature через «Менеджер библиотек» (Library Manager).
- Подключи модуль TDS и DS18B20 по таблице; опусти зонд и датчик температуры в одну и ту же воду.
- Загрузи код и открой «Монитор порта» (Serial Monitor) на скорости 115200 бод.
- Подожди 20–30 секунд, пока значения стабилизируются; сразу после погружения зонда в воду первые показания колеблются.
- Если есть калибровочный раствор с известным значением, опусти в него зонд и введи в мониторе порта, например, cal:707.
1#include <OneWire.h>
2#include <DallasTemperature.h>
3#include <EEPROM.h>
4
5const int TDS_PIN = A0; // TDS modülü sinyal (A) / TDS module signal (A)
6const int DS_PIN = 2; // DS18B20 veri, 4,7 kΩ pull-up / DS18B20 data, 4.7 kΩ pull-up
7const float VREF = 5.0; // Uno ADC referansı / Uno ADC reference
8const int ORNEK = 30; // medyan filtresi örnek sayısı / samples for the median filter
9
10OneWire oneWire(DS_PIN);
11DallasTemperature ds(&oneWire);
12
13int ornekler[ORNEK];
14int indeks = 0;
15float kFaktor = 1.0; // kalibrasyon katsayısı (EEPROM'da) / calibration factor (in EEPROM)
16float sicaklik = 25.0;
17float gerilim = 0;
18unsigned long sonOrnek = 0, sonOlcum = 0;
19
20int medyan() { // gürültüye karşı ortanca değer / median against noise
21 int t[ORNEK];
22 memcpy(t, ornekler, sizeof(t));
23 for (int i = 1; i < ORNEK; i++) { // ekleme sıralaması / insertion sort
24 int x = t[i], j = i - 1;
25 while (j >= 0 && t[j] > x) { t[j + 1] = t[j]; j--; }
26 t[j + 1] = x;
27 }
28 return (t[ORNEK / 2] + t[ORNEK / 2 - 1]) / 2;
29}
30
31float tdsHesapla(float volt, float derece, float k) {
32 float komp = 1.0 + 0.02 * (derece - 25.0); // %2/°C sıcaklık kompanzasyonu / 2 %/°C compensation
33 float v = volt / komp; // 25 °C'ye indirgenmiş gerilim / voltage at 25 °C
34 float ec = 133.42 * v * v * v - 255.86 * v * v + 857.39 * v; // iletkenlik, µS/cm / conductivity
35 return ec * 0.5 * k; // TDS (ppm) = EC x 0,5 / TDS (ppm) = EC x 0.5
36}
37
38void setup() {
39 Serial.begin(115200);
40 ds.begin();
41 ds.setWaitForConversion(false); // 750 ms beklemeden ölç / measure without blocking 750 ms
42 ds.requestTemperatures();
43 EEPROM.get(0, kFaktor);
44 if (isnan(kFaktor) || kFaktor < 0.5 || kFaktor > 2.0) kFaktor = 1.0; // boş EEPROM / empty EEPROM
45 Serial.println("Kalibrasyon / calibration: cal:707 gibi yaz / type e.g. cal:707");
46}
47
48void loop() {
49 if (millis() - sonOrnek >= 40) { // 40 ms'de bir örnek / one sample every 40 ms
50 sonOrnek = millis();
51 ornekler[indeks] = analogRead(TDS_PIN);
52 indeks = (indeks + 1) % ORNEK;
53 }
54
55 if (millis() - sonOlcum >= 1000) { // saniyede bir sonuç / one result per second
56 sonOlcum = millis();
57 float t = ds.getTempCByIndex(0);
58 if (t != DEVICE_DISCONNECTED_C) sicaklik = t; // sensör yoksa 25 °C / 25 °C if no sensor
59 ds.requestTemperatures(); // bir sonraki okuma için / for the next reading
60 gerilim = medyan() * VREF / 1024.0;
61 float tds = tdsHesapla(gerilim, sicaklik, kFaktor);
62 Serial.print("Sicaklik / temp: ");
63 Serial.print(sicaklik, 1);
64 Serial.print(" C TDS: ");
65 Serial.print(tds, 0);
66 Serial.println(" ppm");
67 }
68
69 if (Serial.available()) { // "cal:707" -> bilinen sıvıya göre K / K from a known solution
70 String s = Serial.readStringUntil('\n');
71 s.trim();
72 if (s.startsWith("cal:")) {
73 float hedef = s.substring(4).toFloat();
74 float ham = tdsHesapla(gerilim, sicaklik, 1.0);
75 if (hedef > 0 && ham > 10) {
76 kFaktor = hedef / ham;
77 EEPROM.put(0, kFaktor); // kalıcı kaydet / save permanently
78 Serial.print("Yeni K / new K: ");
79 Serial.println(kFaktor, 3);
80 }
81 }
82 }
83}
84| Часть кода | Что делает? |
|---|---|
| analogRead каждые 40 мс | Хранит последние 30 измерений (1,2 секунды) в кольцевом буфере |
| medyan() | В отличие от среднего значения полностью игнорирует резкие выбросы (шум, пузырьки) |
| 1 + 0.02 × (T − 25) | Приводит напряжение к 25 °C; при 30 °C делитель равен 1,10 |
| 133.42 v³ − 255.86 v² + 857.39 v | Эмпирическая кривая преобразования напряжения в электропроводность для этой платы датчика |
| × 0.5 | Коэффициент пересчёта электропроводности в TDS (шкала 500) |
| setWaitForConversion(false) | Продолжает считывание, не ожидая преобразования DS18B20 длительностью 750 мс |
| cal:707 и EEPROM | Вычисляет коэффициент K по известному раствору и сохраняет его в энергонезависимой памяти |
Полином третьей степени в коде — эмпирическая кривая, преобразующая выходное напряжение платы в электропроводность; простого множителя недостаточно, поскольку схема на плате нелинейна. Эта кривая подходит для распространённой платы TDS типа Gravity; для другой платы используй формулу производителя или построй свою кривую по нескольким известным растворам. Помни: на Uno с питанием 5 V аналоговое измерение выполняется относительно 5,0 V, а на ESP32 и Pico — относительно 3,3 V; если не задать VREF под свою плату, результаты будут неверными с самого начала.
Калибровка датчика TDS эталонным раствором
Каждый зонд и каждая плата немного отличаются; для наиболее точных результатов откалибруй датчик жидкостью с известным значением. Чаще всего используют стандартный раствор хлорида калия (KCl) 1 413 µS/см, который продают поставщики лабораторного и электронного оборудования; с коэффициентом 0,5 он соответствует примерно 707 ppm. Подойдёт и раствор хлорида натрия 342 ppm, который входит в комплект некоторых карманных TDS-метров. Для калибровки промой зонд чистой водой, промокни бумажным полотенцем, опусти в раствор, подожди 1–2 минуты и введи в мониторе порта cal: со значением ppm раствора после двоеточия. Код сохраняет отношение между измеренным и истинным значениями как коэффициент K в EEPROM, поэтому настройка сохраняется после отключения питания.
Таблица TDS: питьевая вода, аквариум и гидропоника
Понимать значение полученного числа так же важно, как и иметь датчик. Согласно оценке вкуса Всемирной организации здравоохранения, вкус воды ниже 300 ppm считается отличным, при 300–600 ppm — хорошим, 600–900 ppm — удовлетворительным, 900–1 200 ppm — плохим, а выше 1 200 ppm — неприемлемым. Это диапазоны вкуса и пригодности к использованию, а не пределы безопасности для здоровья. В таблице ниже собраны типичные значения для распространённых применений.
| Тип воды | Типичный TDS (ppm) | Комментарий |
|---|---|---|
| Дистиллированная вода, выход обратного осмоса (RO) | 0–50 | Фильтр работает хорошо |
| Горный родник, бутилированная вода с низкой минерализацией | 20–150 | Очень лёгкая, мягкая |
| Водопроводная вода (зависит от города) | 100–500 | Зависит от источника; резкий рост требует внимания |
| Бутилированная минеральная вода | 300–1 500+ | Высокая минерализация предусмотрена |
| Пресноводный аквариум (в целом) | 150–350 | Измеряй до и после подмены воды |
| Аквариум с креветками (Caridina) | 80–150 | Регулируется добавлением минералов в воду RO |
| Аквариум с африканскими цихлидами | 300–500 | Предпочитают жёсткую воду с высоким содержанием минералов |
| Морская вода | Около 35 000 | Далеко за пределами диапазона этого датчика |
В гидропонике концентрацию питательных растворов обычно выражают через электропроводность (EC), и она зависит от растения. Но учти: диапазон этого датчика заканчивается на 1 000 ppm, а раствор для требовательных к питанию растений, например томатов и перцев, превышает этот уровень. В таком случае разбавь пробу дистиллированной водой в известном соотношении, измерь её и умножь результат либо используй датчик EC с более широким диапазоном.
| Растение | Рекомендуемая EC (mS/см) | Примерный TDS (шкала 0,5) |
|---|---|---|
| Салат, шпинат | 0,8–1,2 | 400–600 ppm |
| Базилик, мята | 1,0–1,6 | 500–800 ppm |
| Клубника | 1,0–1,5 | 500–750 ppm |
| Огурец | 1,7–2,5 | 850–1 250 ppm (нужно разбавление) |
| Томат, перец | 2,0–3,5 | 1 000–1 750 ppm (нужно разбавление) |
Контроль фильтра воды
Самое полезное домашнее применение датчика TDS — контроль фильтра обратного осмоса (RO). Исправная мембрана RO задерживает большую часть минералов входящей воды; при 300 ppm на входе на выходе обычно получается около 10–30 ppm. Эффективность рассчитывают так: степень задержания = (1 − выход / вход) × 100; если на входе 300 ppm, а на выходе 15 ppm, результат равен 95%. По мере старения мембраны TDS на выходе постепенно растёт; когда степень задержания начинает падать ниже 80–85%, приближается время замены мембраны и предварительных фильтров. Arduino с двумя зондами и двумя DS18B20, одновременно измеряющими вход и выход, может строить график этих изменений месяцами.
Запись TDS с ESP32
С ESP32 ты можешь записывать показания TDS раз в минуту с меткой времени, а позже отправлять их в интернет. Код ниже получает время из интернета по NTP, каждую минуту измеряет температуру воды и TDS и добавляет строки «date,temperature,tds» в файл «/tds.csv» файловой системы LittleFS во встроенной флеш-памяти платы. Позже этот файл можно открыть в Excel и построить график. АЦП ESP32 нелинеен, поэтому код использует analogReadMilliVolts(), которая учитывает калибровочные данные, сохранённые в микросхеме. Подключи сигнал TDS к одному из пинов ADC1 (GPIO 32–39), работающих при включённом Wi-Fi; пины ADC2 нельзя использовать одновременно с Wi-Fi. Время по NTP разобрано в статье «Часы NTP на ESP32».
1#include <WiFi.h>
2#include <LittleFS.h>
3#include <OneWire.h>
4#include <DallasTemperature.h>
5#include <time.h>
6
7const char* WIFI_SSID = "AgAdi";
8const char* WIFI_PASS = "Sifre123";
9const int TDS_PIN = 34; // ADC1 kanalı, Wi-Fi ile çalışır / ADC1 channel, works with Wi-Fi
10const int DS_PIN = 4;
11const float K_FAKTOR = 1.0; // Arduino'daki gibi kalibre et / calibrate as on the Arduino
12const unsigned long ARALIK_MS = 60000; // dakikada bir kayıt / one log per minute
13
14OneWire oneWire(DS_PIN);
15DallasTemperature ds(&oneWire);
16unsigned long sonKayit = 0;
17
18float gerilimOku() { // 30 örneğin ortancası, volt / median of 30 samples, volts
19 int mv[30];
20 for (int i = 0; i < 30; i++) { mv[i] = analogReadMilliVolts(TDS_PIN); delay(5); }
21 for (int i = 1; i < 30; i++) {
22 int x = mv[i], j = i - 1;
23 while (j >= 0 && mv[j] > x) { mv[j + 1] = mv[j]; j--; }
24 mv[j + 1] = x;
25 }
26 return mv[15] / 1000.0;
27}
28
29float tdsHesapla(float v, float derece) {
30 v = v / (1.0 + 0.02 * (derece - 25.0)); // sıcaklık kompanzasyonu / temperature compensation
31 return (133.42 * v * v * v - 255.86 * v * v + 857.39 * v) * 0.5 * K_FAKTOR;
32}
33
34void setup() {
35 Serial.begin(115200);
36 ds.begin();
37 LittleFS.begin(true); // ilk açılışta biçimlendir / format on first boot
38 WiFi.begin(WIFI_SSID, WIFI_PASS);
39 while (WiFi.status() != WL_CONNECTED) delay(500);
40 configTzTime("<+03>-3", "pool.ntp.org"); // zaman damgası için NTP / NTP for timestamps
41}
42
43void loop() {
44 if (millis() - sonKayit < ARALIK_MS && sonKayit != 0) return;
45 sonKayit = millis();
46
47 ds.requestTemperatures(); // ~750 ms bekler / waits ~750 ms
48 float derece = ds.getTempCByIndex(0);
49 if (derece == DEVICE_DISCONNECTED_C) derece = 25.0;
50 float tds = tdsHesapla(gerilimOku(), derece);
51
52 struct tm t;
53 char zaman[20] = "saat-yok";
54 if (getLocalTime(&t, 2000)) strftime(zaman, sizeof(zaman), "%Y-%m-%d %H:%M:%S", &t);
55
56 char satir[64];
57 snprintf(satir, sizeof(satir), "%s,%.1f,%.0f", zaman, derece, tds);
58 File f = LittleFS.open("/tds.csv", FILE_APPEND); // tarih,sicaklik,tds / date,temp,tds
59 if (f) { f.println(satir); f.close(); }
60 Serial.println(satir);
61}
62Если хочешь хранить журнал в интернете, вместо LittleFS можно отправлять ту же строку в Google Sheets или в Home Assistant по MQTT; подробности — в статьях «ESP32 и Google Sheets» и «ESP32 и MQTT». У флеш-памяти ограничен ресурс записи; короткая строка раз в минуту не создаёт проблем, но вместо ежесекундной записи лучше привыкнуть собирать показания в ОЗУ и записывать их порциями.
TDS с Raspberry Pi Pico (MicroPython)
На Pico сигнал TDS подключается к GP26 (ADC0), а DS18B20 — к GP22. В MicroPython модули onewire и ds18x20, нужные для DS18B20, встроены в прошивку, поэтому ничего дополнительно устанавливать не нужно. АЦП Pico возвращает через read_u16() значение от 0 до 65535; мы преобразуем его в напряжение относительно 3,3 V. Формула и компенсация такие же, как в коде Arduino; K_FAKTOR можно найти методом калибровки для Arduino и вписать в код.
1from machine import ADC, Pin
2import onewire, ds18x20, time
3
4adc = ADC(26) # GP26 = ADC0, TDS sinyali / TDS signal
5ds = ds18x20.DS18X20(onewire.OneWire(Pin(22))) # DS18B20 veri pini / data pin
6roms = ds.scan()
7K_FAKTOR = 1.0 # kalibrasyon katsayısı / calibration factor
8
9def gerilim_oku(n=31): # ortanca ile gürültü filtresi / median noise filter
10 olcumler = []
11 for _ in range(n):
12 olcumler.append(adc.read_u16())
13 time.sleep_ms(5)
14 olcumler.sort()
15 return olcumler[n // 2] * 3.3 / 65535
16
17def tds_hesapla(v, derece):
18 v = v / (1.0 + 0.02 * (derece - 25.0)) # 25 °C'ye indir / normalise to 25 °C
19 ec = 133.42 * v ** 3 - 255.86 * v ** 2 + 857.39 * v
20 return ec * 0.5 * K_FAKTOR
21
22while True:
23 derece = 25.0
24 if roms:
25 ds.convert_temp()
26 time.sleep_ms(750) # DS18B20 dönüşüm süresi / conversion time
27 derece = ds.read_temp(roms[0])
28 tds = tds_hesapla(gerilim_oku(), derece)
29 print("Sicaklik: {:.1f} C TDS: {:.0f} ppm".format(derece, tds))
30 time.sleep(1)
31Датчик TDS и датчик pH: в чём разница
В проектах контроля качества воды датчики TDS и pH часто путают, хотя они измеряют совершенно разные вещи. TDS показывает количество ионов в воде, а pH — насколько она кислая или щелочная (активность ионов водорода). Добавь несколько капель лимонного сока в стакан воды — pH резко упадёт, а TDS почти не изменится; добавь щепотку соли — TDS резко вырастет, а pH останется почти тем же. В аквариумах и гидропонике обычно контролируют оба показателя.
| Характеристика | Датчик TDS | Датчик pH |
|---|---|---|
| Что измеряет | Количество растворённых ионов (электропроводность) | Кислотность / щёлочность (0–14) |
| Единица | ppm (мг/л) или µS/см | Единицы pH |
| Зонд | Прочная пара металлических электродов | Хрупкий стеклянный электрод |
| Калибровка | По одной точке (например, 1 413 µS/см) | По двум или трём точкам (буферы pH 4, 7, 10) |
| Обслуживание | Периодическая очистка | Хранение во влажном состоянии, регулярная калибровка, замена зонда каждые 1–2 года |
| Цена | Низкая | Выше |
| Типичное применение | Контроль фильтра, жёсткости, концентрации питательных веществ | Контроль pH в аквариуме, бассейне, гидропонике |
Идеи проектов с датчиком TDS
- Сигнализация фильтра: включай зуммер и выводи на дисплей «replace filter», когда TDS на выходе RO превышает 50 ppm.
- Монитор аквариума: показывай TDS, температуру и уровень воды на одном дисплее и напоминай о времени подмены воды.
- Контроль питания в гидропонике: добавляй питательные вещества перистальтическим насосом при снижении EC; объедини с проектом умной теплицы.
- Журнал водопроводной воды: записывай TDS домашней воды в течение нескольких дней и наблюдай изменения в водоснабжении на графике.
- Вода для полива растений: сравни дождевую, водопроводную и фильтрованную воду и выбери лучшую для растений, чувствительных к засолению.
- Школьный опыт: растворяй разное количество соли и сахара, чтобы показать связь электропроводности с типом растворённого вещества.
Частые ошибки и их решения
| Симптом | Вероятная причина | Решение |
|---|---|---|
| Значение постоянно колеблется | Зонд только что погружён в воду или есть пузырьки | Подожди 20–30 секунд, слегка встряхни зонд, используй медианный фильтр |
| Разные результаты в тёплой и холодной воде | Нет температурной компенсации | Добавь DS18B20 и подставляй температуру в формулу |
| Все значения отличаются примерно на 50% | Неверный VREF (3,3 V вместо 5 V или наоборот) | Правильно задай опорное напряжение АЦП своей платы |
| Результат отличается от карманного измерителя | Другой коэффициент пересчёта (0,5 / 0,7) или нет калибровки | Используй ту же шкалу и откалибруй известным раствором |
| При высоких значениях показания упираются в предел | Диапазон датчика — 1 000 ppm | Разбавь пробу или используй датчик EC с широким диапазоном |
| Бессмысленные результаты при работе вместе с датчиком pH | Два зонда мешают друг другу в одной воде | Измеряй по очереди или используй модуль с гальванической развязкой |
| Показания ESP32 искажаются при включении Wi-Fi | Сигнал подключён к пину ADC2 | Используй один из пинов ADC1, GPIO 32–39 |
Датчик TDS — самый дешёвый и простой инструмент для выражения качества воды числом: с правильной температурной компенсацией и простой калибровкой можно надёжно контролировать водопроводную воду, фильтр, аквариум или раствор для гидропоники. При интерпретации результатов помни, что TDS не измеряет микробиологическую безопасность. В приложении BlueGrays есть пошаговые проекты умной станции полива и регистратора температуры с метками времени, со схемами и кодом; к ним можно добавить датчик TDS.
Частые вопросы
Каким должен быть уровень TDS?
Для питьевой воды по оценке вкуса Всемирной организации здравоохранения уровень ниже 300 ppm считается отличным, 300–600 ppm — хорошим, а выше 1 200 ppm — неприемлемым по вкусу. На выходе фильтра обратного осмоса обычно получается 10–50 ppm. Для аквариумов и гидропоники идеальное значение зависит от животных или растений.
Что измеряет TDS-метр и показывает ли он безопасность воды?
TDS-метр оценивает количество растворённых минералов и солей по электропроводности воды. Такие загрязнители, как бактерии, вирусы, свинец или пестициды, почти не меняют электропроводность, поэтому низкий TDS не делает воду безопасной. TDS следует использовать для контроля эффективности фильтра и изменений минеральной нагрузки.
Как откалибровать датчик TDS?
Очисти зонд и опусти его в калибровочный раствор с известным значением, например стандартный раствор KCl 1 413 µS/см (около 707 ppm). Когда показания стабилизируются, отношение между измеренным и истинным значениями сохраняется как коэффициент, на который умножаются все последующие измерения. Во время калибровки температурная компенсация должна быть включена.
В чём разница между TDS и EC?
EC (электропроводность) напрямую измеряет, насколько хорошо вода проводит электричество, в µS/см или mS/см. TDS — оценка количества растворённых веществ (ppm), рассчитанная из электропроводности с коэффициентом, обычно 0,5 или 0,7. В гидропонике чаще используют EC, а для питьевой воды — TDS.
Можно ли постоянно держать датчик TDS в воде?
Зонд водонепроницаем и может постоянно находиться в аквариуме или баке для гидропоники, но его нужно чистить каждые несколько недель; плата обработки сигнала не водонепроницаема и должна оставаться сухой. Нельзя использовать зонд в воде горячее примерно 55 °C. При длительном использовании периодически повторяй калибровку, чтобы компенсировать дрейф показаний.
Можно ли измерять pH датчиком TDS с Arduino?
Нет. Датчик TDS измеряет только электропроводность и рассчитанное по ней количество растворённых веществ; для pH, то есть кислотности, нужен отдельный датчик pH со стеклянным электродом. Оба датчика можно использовать в одном проекте, но в общей ёмкости они могут мешать измерениям друг друга, поэтому измеряй по очереди или используй модуль с гальванической развязкой.
Что собрать после прочтения
Все проекты
Умная станция полива
Садовник, который сам поливает растения, чтобы они не засохли, пока ты в отпуске. Датчик влажности почвы измеряет, насколько влажная земля; когда она сохнет, Arduino на несколько секунд включает водян

Регистратор температуры на ESP32 (DHT22 + DS1307 RTC + microSD + OLED)
Собери на ESP32 регистратор температуры с отметками времени! Каждую минуту читай температуру и влажность с DHT22, бери реальное время из DS1307 RTC и записывай всё на карту microSD в формате CSV. OLED показывает текущую температуру (крупным шрифтом), влажность в процентах, время и счётчик записей. Файл /temp_log.csv на SD-карте открывается в Excel, Google Sheets или Python pandas — идеально для теплиц, комнат, лабораторий и хранения продуктов.

Температура и влажность с DHT22 на ESP32 (с LCD-дисплеем)
Этот проект измеряет температуру и влажность воздуха датчиком DHT22 и в реальном времени показывает данные на I2C LCD 16x2. Данные читаются с датчика по однопроводному протоколу через библиотеку Adafruit DHT. Проект служит основой для IoT-метеостанций, умного дома или систем мониторинга среды в теплицах. Связь с DHT22 идёт через пин GPIO 4 у ESP32.

Температура и влажность с DHT11
Насколько тепло в твоей комнате и влажный ли воздух или сухой? Датчик DHT11 измеряет температуру и влажность, а Arduino выводит значения на двухстрочный LCD-экран и обновляет их каждые пару секунд. Ес

Измерение температуры с NTC и LCD-дисплеем 2x16
Измерь температуру вокруг с помощью датчика, похожего на крошечную бусинку. Эта деталь, NTC, при нагреве легче пропускает электричество; Arduino читает это изменение, по формуле переводит его в градус

Цифровой вольтметр с LCD-дисплеем
Узнай, какое напряжение даёт батарейка или блок питания, с помощью измерителя, собранного своими руками. Делитель из двух резисторов понижает высокое напряжение до уровня, который может прочитать плат

Измерение освещённости с LDR
Хочешь увидеть яркость своей комнаты в виде числа? LDR — маленькая деталь, реагирующая на свет, — измеряет освещённость вокруг, а Arduino каждые полсекунды выводит значение на экран компьютера. Закрой
Другие статьи
Приложение BlueGrays
Собери эту схему шаг за шагом в телефоне
Схема подключения, код и список деталей на одном экране. 200+ проектов на Arduino, ESP32 и Pico готовы к сборке.
Наведи камеру телефона
Наведи камеру на код — откроется магазин приложений на телефоне.
или открыть магазин

