Компоненты · 9 мин чтения

Датчик 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 для измерения качества воды и электропроводности
Датчик TDS: водонепроницаемый зонд с двумя электродами и плата обработки сигнала; на плате есть пины VCC, GND и аналогового выхода (A).

Что такое 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
DS18B20: цифровой датчик температуры с одной линией данных; его водонепроницаемую версию помещают в воду рядом с зондом TDS для температурной компенсации.

DS18B20 использует протокол с одной линией данных OneWire и обеспечивает точность ±0,5 °C. Между линией данных и VCC нужен подтягивающий резистор 4,7 kΩ; если не знаешь цветовой код, воспользуйся утилитой «Цветовой код». Подробности о датчике и подключении нескольких DS18B20 к одной линии — в статье «Датчик температуры DS18B20». Без датчика температуры код предполагает 25 °C, чего достаточно для простых проверок при комнатной температуре.

Подключение: Arduino Uno, ESP32 и Pico

Пин компонентаArduino UnoESP32Raspberry Pi Pico
TDS VCC (+)5V3V33V3 (OUT)
TDS GND (−)GNDGNDGND
TDS A (сигнал)A0GPIO 34 (ADC1)GP26 (ADC0)
DS18B20 VCC (красный)5V3V33V3 (OUT)
DS18B20 GND (чёрный)GNDGNDGND
DS18B20 DATA (жёлтый)D2 + 4,7 kΩ к VCCGPIO 4 + 4,7 kΩ к 3V3GP22 + 4,7 kΩ к 3V3
Плата обработки сигнала модуля TDS не водонепроницаема; в воду опускают только зонд. Не позволяй зонду касаться дна или стенок ёмкости, оставляй хотя бы несколько сантиметров; в металлической ёмкости показания смещаются. Если зонд TDS и зонд pH одновременно работают в одной ёмкости, они могут влиять на показания друг друга; измеряй по очереди или используй модуль с гальванической развязкой одного из датчиков.

Код TDS для Arduino: медианный фильтр и компенсация

  1. Установи библиотеки OneWire и DallasTemperature через «Менеджер библиотек» (Library Manager).
  2. Подключи модуль TDS и DS18B20 по таблице; опусти зонд и датчик температуры в одну и ту же воду.
  3. Загрузи код и открой «Монитор порта» (Serial Monitor) на скорости 115200 бод.
  4. Подожди 20–30 секунд, пока значения стабилизируются; сразу после погружения зонда в воду первые показания колеблются.
  5. Если есть калибровочный раствор с известным значением, опусти в него зонд и введи в мониторе порта, например, cal:707.
C++ (Arduino IDE)
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-метром и сравнить два значения. Можно приготовить раствор самостоятельно: 0,5 грамма чистой соли (NaCl) в 1 литре дистиллированной воды дают примерно 500 ppm; точность весов напрямую влияет на результат. Повторяй калибровку каждые несколько месяцев и никогда не сливай использованный раствор обратно в бутылку.

Таблица 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,2400–600 ppm
Базилик, мята1,0–1,6500–800 ppm
Клубника1,0–1,5500–750 ppm
Огурец1,7–2,5850–1 250 ppm (нужно разбавление)
Томат, перец2,0–3,51 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 до и после таких фильтров — нормальное явление. Осмысленно контролировать по TDS можно только системы RO и ионообменные системы (умягчители). Кроме того, низкий TDS на выходе фильтра не означает микробиологическую безопасность воды.

Запись 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».

C++ (Arduino IDE)
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 и вписать в код.

MicroPython
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 со стеклянным электродом. Оба датчика можно использовать в одном проекте, но в общей ёмкости они могут мешать измерениям друг друга, поэтому измеряй по очереди или используй модуль с гальванической развязкой.

Все проекты
Умная станция полива
#83Продвинутый
Premium

Умная станция полива

Садовник, который сам поливает растения, чтобы они не засохли, пока ты в отпуске. Датчик влажности почвы измеряет, насколько влажная земля; когда она сохнет, Arduino на несколько секунд включает водян

5.0(42)
57
Регистратор температуры на ESP32 (DHT22 + DS1307 RTC + microSD + OLED)
#144Продвинутый
Premium

Регистратор температуры на ESP32 (DHT22 + DS1307 RTC + microSD + OLED)

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

4.7(7)
12
Температура и влажность с DHT22 на ESP32 (с LCD-дисплеем)
#117Средний

Температура и влажность с DHT22 на ESP32 (с LCD-дисплеем)

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

4.8(38)
56
Температура и влажность с DHT11
#55Средний

Температура и влажность с DHT11

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

4.7(47)
73
Измерение температуры с NTC и LCD-дисплеем 2x16
#44Новичок
Premium

Измерение температуры с NTC и LCD-дисплеем 2x16

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

4.5(33)
44
Цифровой вольтметр с LCD-дисплеем
#56Средний
Premium

Цифровой вольтметр с LCD-дисплеем

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

4.5(27)
36
Измерение освещённости с LDR
#11Новичок

Измерение освещённости с LDR

Хочешь увидеть яркость своей комнаты в виде числа? LDR — маленькая деталь, реагирующая на свет, — измеряет освещённость вокруг, а Arduino каждые полсекунды выводит значение на экран компьютера. Закрой

4.6(81)
138