部品 · 読了まで12分

ArduinoでTDSセンサーを使う:ppm測定、キャリブレーション、水質監視

ArduinoでTDSセンサーを使う方法を紹介します。ppmの意味、DS18B20による温度補償、キャリブレーション、飲料水・水槽・水耕栽培の目安、ESP32での記録を解説します。

TDSセンサーとArduinoを組み合わせると、水に溶けているミネラル、塩類、金属の量を、数秒でppm(100万分の1)単位で示す安価な水質計になります。TDS(総溶解固形物量)は、水道水の硬度の判断、浄水フィルターがまだ機能しているかの確認、水槽の水換え時期の判断、水耕栽培用培養液の濃度の把握に最も実用的な指標です。ペン型TDS計も同じ原理で動作します。Arduinoなら、測定値を連続して記録し、ディスプレイに表示し、しきい値を超えたときに警告を出せます。

この記事では、ppmの意味、センサーが実際に導電率を測る仕組み、温度が結果に与える影響とDS18B20による補正、標準液でのキャリブレーション、Arduino Unoのコード、飲料水・水槽・水耕栽培の値の目安、浄水フィルターの監視、ESP32でのタイムスタンプ付き記録、Raspberry Pi Picoのコードを順に説明します。最後に、TDSセンサーとpHセンサーの違いと、よくある間違いを紹介します。

TDS水質・導電率センサー
TDSセンサーは、2本の電極を持つ防水プローブと信号処理基板で構成されます。基板にはVCC、GND、アナログ出力(A)のピンがあります。

TDSとは?ppmは何を意味する?

TDSは、水1リットルに溶けているすべての物質の総量です。その大部分は、カルシウム、マグネシウム、ナトリウム、カリウム、炭酸水素、塩化物、硫酸、硝酸などのイオンです。単位はppm(100万分の1)、または水ではそれに相当するmg/Lです。1 ppmは、水1リットルに1ミリグラムの物質が溶けていることを意味します。例えば、250 ppmの水道水には、1リットルあたり4分の1グラムのミネラルが含まれています。純水(蒸留水)のTDSはほぼゼロですが、海水は約35,000 ppmです。

最初に理解しておきたいのは、TDSだけでは水が「きれいか汚いか」は分からないことです。ミネラルの豊富な湧き水はTDSが高くても、健康上まったく問題のない場合があります。一方、TDSが低い水にも、細菌、鉛、農薬が含まれている可能性があります。これらは水の導電率をほとんど変えないためです。TDSセンサーは、水のミネラル量とその変化を追跡するのに適しています。微生物学的な安全性を確認するには、検査機関での分析が必要です。

TDSセンサーの仕組み:導電率からppmへ

Arduino用として販売されているTDSセンサーの実体は、導電率(EC)計です。純水はほとんど電気を通さず、溶けているイオンが多いほど導電率が高くなります。基板はプローブ先端の2本の電極間に小さな電圧を加え、流れる電流を測ります。この電圧は直流ではなく交流です。直流では電極に気泡がたまって分極が起こり、測定値がドリフトし、電極が早く劣化するためです。基板は結果を0〜2.3 Vのアナログ電圧に変換します。Arduinoはそれを読み取り、まず導電率(µS/cm)に換算し、さらに換算係数を使ってTDSに変換します。

導電率からTDSへの換算は近似で、TDS (ppm) = EC (µS/cm) × kです。多くの測定器とこの記事のコードは、k = 0.5(塩化ナトリウム基準、または「500」スケール)を使います。水耕栽培用の測定器には0.7を使うものもあるため、同じ水を2台の測定器が500 ppmと700 ppmで示し、どちらも「正しい」場合があります。値を比較するときは係数を確認し、水耕栽培では可能ならEC(mS/cm)をそのまま使ってください。

項目値(一般的なTDSモジュール)
電源3.3〜5.5 V
出力0〜2.3 Vのアナログ出力
測定範囲0〜1000 ppm
精度約±10%(25 °C、フルスケールに対して)
励起交流(分極を防止)
プローブ防水、2電極、約55 °Cまで
基板防水ではないため、濡らさないでください

温度補償:DS18B20が必要な理由

水の導電率は温度によって大きく変わります。温まるとイオンの動きが速くなり、同じ水でも1 °C上がるごとに導電率が約2%高くなります。同じ水を15 °Cと30 °Cで測ると、およそ3分の1の差が出ます。測定そのものの誤差よりはるかに大きな誤差です。そのため、TDSの測定値は25 °Cに補正します。式は補正電圧=測定電圧 / (1 + 0.02 × (T − 25))です。水温の測定には、ステンレス製の保護管に入った防水のDS18B20が最適です。TDSプローブの隣で、同じ水に入れて使います。

DS18B20温度センサー
DS18B20は1本のデータ線で通信するデジタル温度センサーです。防水版をTDSプローブの隣の水中に入れ、温度補償に使います。

DS18B20はOneWireという1本のデータ線を使うプロトコルで通信し、精度は±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+VCCへ4.7 kΩGPIO 4+3V3へ4.7 kΩGP22+3V3へ4.7 kΩ
TDSモジュールの信号処理基板は防水ではありません。水に入れるのはプローブだけです。容器の底や側面にプローブを触れさせず、少なくとも数センチメートル離してください。金属製の容器では測定値がドリフトします。同じ容器でTDSプローブとpHプローブを同時に動作させると、互いの測定に干渉することがあります。同時に測らないか、どちらかを電気的に絶縁するモジュールを使ってください。

ArduinoのTDS測定コード:メディアンフィルタと温度補償

  1. ライブラリマネージャからOneWireとDallasTemperatureのライブラリをインストールしてください。
  2. 表のとおりにTDSモジュールとDS18B20を配線し、プローブと温度センサーを同じ水に入れてください。
  3. コードを書き込み、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
コードの部分役割
40 msごとにanalogRead直近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 msの変換を待たずにサンプリングを続けます
cal:707とEEPROM既知の標準液からK係数を計算し、永続的に保存します

コードの3次多項式は、基板の出力電圧を導電率に換算する実験的な曲線です。基板上の回路は線形ではないため、単純な倍率だけでは換算できません。この曲線は一般的なGravityタイプのTDS基板に適用されます。別の基板を使う場合は、メーカーの式を使うか、値が分かっている複数の溶液で独自の曲線を求めてください。5 VのUnoではアナログ読み取りの基準が5.0 V、ESP32とPicoでは3.3 Vであることに注意してください。ボードに合わせてVREFを設定しないと、最初から結果が誤ってしまいます。

標準液でTDSセンサーをキャリブレーションする

プローブと基板には個体差があるため、できるだけ正確な結果を得るには、値が分かっている液体でセンサーをキャリブレーションしてください。実験用品や電子部品の販売店で入手できる1413 µS/cmの塩化カリウム(KCl)標準液が最も一般的です。係数0.5では約707 ppmに相当します。一部のペン型TDS計に付属する342 ppmの塩化ナトリウム溶液も使えます。キャリブレーションするには、プローブをきれいな水ですすぎ、ペーパータオルで軽く押さえて水分を取り、標準液に入れます。1〜2分待ってから、シリアルモニタにcal:と続けて標準液のppm値を入力してください。コードは測定値と真値の比をK係数としてEEPROMに保存するため、電源を切っても設定が残ります。

標準液がない場合は、精度のよいペン型TDS計で同じ水を測り、両方の値を比較する暫定的な方法もあります。自分で溶液を作ることもできます。蒸留水1リットルに純粋な塩(NaCl)0.5グラムを溶かすと、およそ500 ppmになります。はかりの精度が結果に直接影響します。数か月ごとにキャリブレーションを繰り返し、使用済みの標準液は絶対に元のボトルに戻さないでください。

TDSの目安:飲料水、水槽、水耕栽培

表示された数値の意味を知ることは、センサー自体と同じくらい大切です。世界保健機関の味に関する評価では、300 ppm未満は非常に良好、300〜600 ppmは良好、600〜900 ppmは普通、900〜1200 ppmは不良、1200 ppmを超えると受け入れられないとされています。これらは味と使いやすさの目安であり、健康上の限度値ではありません。以下の表は、よくある用途の典型的な値をまとめたものです。

水の種類一般的なTDS(ppm)補足
蒸留水、逆浸透(RO)処理後の水0〜50フィルターがよく機能しています
山の湧き水、ミネラルの少ないボトル入り飲料水20〜150非常に軽い口当たりの軟水
水道水(地域によって異なります)100〜500水源によって異なり、急な上昇には注意が必要です
ボトル入りミネラルウォーター300〜1500+ミネラルを多く含むことを意図した水です
淡水の水槽(一般的な場合)150〜350水換えの前後に測定します
エビの水槽(Caridina)80〜150RO水にミネラルを加えて調整します
アフリカンシクリッドの水槽300〜500ミネラルの豊富な硬水を好みます
海水約35,000このセンサーの測定範囲を大きく超えます

水耕栽培の培養液の濃度は通常、導電率(EC)で表し、植物によって適正値が異なります。ただし、このセンサーの上限は1000 ppmで、トマトやピーマンなど栄養を多く必要とする植物の培養液はそれを超えるため、注意してください。その場合は、試料を蒸留水で既知の比率に薄めて測り、結果に希釈倍率を掛けるか、より測定範囲の広いECセンサーを使ってください。

植物推奨EC(mS/cm)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〜1250 ppm(希釈が必要)
トマト、ピーマン2.0〜3.51000〜1750 ppm(希釈が必要)

浄水フィルターを監視する

家庭でTDSセンサーが最も役立つ用途は、逆浸透(RO)フィルターの監視です。正常なRO膜は流入水に含まれるミネラルの大部分を除去します。300 ppmの水が入ると、処理後の水は通常10〜30 ppm程度になります。性能は除去率=(1 − 出口 / 入口)× 100で計算します。入口が300 ppmで出口が15 ppmなら、除去率は95%です。膜が劣化すると出口のTDSが徐々に上がります。除去率が80〜85%を下回り始めたら、膜とプレフィルターの交換時期が近づいています。Arduinoに2本のプローブと2個のDS18B20をつなぎ、入口と出口を同時に測れば、数か月にわたる変化をグラフにできます。

活性炭フィルターや沈殿物除去フィルターは、におい、味、塩素、沈殿物を取り除きますが、溶けているミネラルはほとんど減らしません。これらのフィルターを通してもTDSが変わらないのは正常です。TDSで有意義に監視できるのは、ROとイオン交換(軟水化)のシステムだけです。また、フィルター出口のTDSが低くても、微生物学的に安全な水とは限りません。

ESP32でTDSを記録する

ESP32なら、TDSの測定値を1分ごとにタイムスタンプ付きで記録し、後でインターネットへ送れます。以下のコードはNTPでインターネットから時刻を取得し、毎分水温とTDSを測り、ボード内蔵フラッシュメモリのLittleFSファイルシステムにある「/tds.csv」というファイルに「date,temperature,tds」の行を追記します。後でExcelでこのファイルを開き、グラフを描けます。ESP32のADCは線形ではないため、コードではチップに保存されたキャリブレーションデータを使うanalogReadMilliVolts()を利用します。TDSの信号は、Wi-Fiが有効でも動作するADC1のピン(GPIO 32〜39)のいずれかに接続してください。ADC2のピンはWi-Fiと同時に使えません。NTPによる時刻取得は、ESP32のNTP時計の記事で説明しています。

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スプレッドシートやMQTT経由でHome Assistantへ送れます。詳細はESP32とGoogleスプレッドシートとESP32のMQTTの記事をご覧ください。フラッシュメモリには書き込み寿命があります。1分ごとに短い行を書き込む程度なら問題ありませんが、毎秒書き込むより、測定値をRAMにためてまとめて書き込む習慣を付けるとよいでしょう。

Raspberry Pi PicoでTDSを測る(MicroPython)

Picoでは、TDSの信号をGP26(ADC0)、DS18B20をGP22に接続します。MicroPythonでは、DS18B20に必要なonewireとds18x20のモジュールがファームウェアに組み込まれているため、追加のインストールは不要です。PicoのADCはread_u16()で0〜65535の値を返します。これを3.3 Vを基準とする電圧に換算します。式と温度補償はArduinoのコードと同じです。Arduinoのキャリブレーション方法でK_FAKTORを求め、コードに書き込めます。

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(mg/L)またはµS/cmpH値
プローブ丈夫な一対の金属電極壊れやすいガラス電極
キャリブレーション1点(例:1413 µS/cm)2点または3点(pH 4、7、10の緩衝液)
メンテナンス時々洗浄します湿潤状態で保管し、定期的にキャリブレーションし、1〜2年ごとにプローブを交換します
価格安価比較的高価
主な用途フィルターの監視、硬度、培養液の濃度水槽、プール、水耕栽培のpH制御

TDSセンサーのプロジェクトアイデア

  • フィルターの警報:RO処理後の水が50 ppmを超えたら、ブザーを鳴らし、ディスプレイに「フィルターを交換」と表示します。
  • 水槽モニター:TDS、水温、水位を1つのディスプレイに表示し、水換え時期を知らせます。
  • 水耕栽培の養分制御:ECが下がったらペリスタルティックポンプで養分を加えます。スマート温室プロジェクトと組み合わせてください。
  • 水道水の記録:家庭の水のTDSを何日も記録し、供給される水の変化をグラフで確認します。
  • 植物の水やり用の水:雨水、水道水、浄水を比較し、塩分に弱い植物に最適な水を選びます。
  • 学校の実験:量を変えて塩や砂糖を溶かし、導電率と溶けている物質の種類の関係を示します。

よくある間違いと対処法

症状考えられる原因対処法
値が変動し続けますプローブを入れたばかり、または気泡があります20〜30秒待ち、プローブを軽く揺らし、メディアンフィルタを使います
温水と冷水で結果が異なります温度補償がありませんDS18B20を追加し、温度を式に入力します
すべての値が約50%ずれますVREFが違います(5 Vの代わりに3.3 V、またはその逆)ボードのADC基準電圧を正しく設定します
ペン型の測定器と値が異なります換算係数が違う(0.5 / 0.7)、またはキャリブレーションしていません同じスケールを使い、既知の標準液でキャリブレーションします
高い値で測定値が上限に張り付きますセンサーの測定範囲は1000 ppmです試料を薄めるか、測定範囲の広いECセンサーを使います
pHセンサーと併用すると異常な値になります同じ水の中で2本のプローブが互いに干渉しています1つずつ測るか、絶縁型モジュールを使います
Wi-Fiが起動するとESP32の測定値がおかしくなります信号がADC2のピンに接続されていますADC1のGPIO 32〜39のいずれかを使います
測定後は毎回、プローブをきれいな水ですすぎ、乾燥した状態で保管してください。水槽や水耕栽培などで常に水中に入れる場合は、数週間ごとに柔らかいブラシでバイオフィルムを取り除いてください。電極が汚れると、時間とともに測定値が低くなります。

TDSセンサーは、水質を数値にする最も安価で手軽なツールです。適切な温度補償と簡単なキャリブレーションにより、水道水、フィルター、水槽、水耕栽培の培養液を安定して監視できます。結果を解釈するときは、TDSでは微生物学的な安全性を測れないことを忘れないでください。BlueGraysアプリには、スマート水やりステーションやタイムスタンプ付き温度ロガーなど、回路図とコード付きで手順を追えるプロジェクトがあり、TDSセンサーを追加できます。

よくある質問

TDSはどのくらいの値がよいですか?

飲料水について、世界保健機関の味に関する評価では300 ppm未満は非常に良好、300〜600 ppmは良好、1200 ppmを超えると味の面で受け入れられないとされています。逆浸透フィルターの処理後の水は通常10〜50 ppmです。水槽や水耕栽培では、生き物や植物によって理想的な値が異なります。

TDS計は何を測りますか?水の安全性も分かりますか?

TDS計は水の導電率から、溶けているミネラルや塩類の量を推定します。細菌、ウイルス、鉛、農薬などの汚染物質は導電率をほとんど変えないため、TDSが低くても水が安全とは限りません。TDSはフィルターの性能やミネラル量の変化を監視するために使ってください。

TDSセンサーはどうキャリブレーションしますか?

プローブを洗浄し、1413 µS/cmのKCl標準液(約707 ppm)など、値が分かっている標準液に入れます。測定値が安定したら、測定値と真値の比を係数として保存し、その後のすべての測定値に掛けます。キャリブレーション中は温度補償を有効にしてください。

TDSとECの違いは?

EC(電気伝導率)は、水がどのくらい電気を通すかをµS/cmまたはmS/cmで直接測ります。TDSは、その導電率に通常0.5または0.7の係数を掛けて求める、溶解物質量の推定値(ppm)です。水耕栽培ではEC、飲料水ではTDSがよく使われます。

TDSセンサーを水中に入れたままにできますか?

プローブは防水なので、水槽や水耕栽培タンクに常設できます。ただし、数週間ごとに洗浄してください。信号処理基板は防水ではないため、濡らさないでください。プローブは約55 °Cを超える水では使わないでください。長期間使う場合は、時々キャリブレーションを行い、ドリフトを補正してください。

Arduino用TDSセンサーでpHを測れますか?

いいえ。TDSセンサーが測れるのは導電率と、そこから求める溶解固形物量だけです。pH、つまり酸性の強さを測るには、ガラス電極を備えた別のpHセンサーが必要です。同じプロジェクトで併用できますが、同じ容器内では測定が互いに干渉することがあるため、1つずつ測るか、絶縁型モジュールを使ってください。

全プロジェクトを見る
スマート水やりステーション
#83上級
プレミアム

スマート水やりステーション

旅行中も植物が枯れないよう、自動で水やりをするシステムです。土壌水分センサーで土の湿り具合を測定し、乾燥するとArduinoが給水ポンプを数秒間動かして、青いライトを点灯させます。水分が適切なときは緑のライトが点灯します。土がひどく乾燥すると、赤いライトが点滅し、ブザーが鳴って知らせます。

5.0(42)
57
ESP32温度データロガー(DHT22 + DS1307 RTC + microSD + OLED)
#144上級
プレミアム

ESP32温度データロガー(DHT22 + DS1307 RTC + microSD + OLED)

ESP32で日時付きの温度・湿度記録システムを作ります!DHT22で1分ごとに温度と湿度を読み取り、DS1307 RTCから取得した日時とともにmicroSDカードへCSV形式で記録します。OLEDには最新の温度を大きな文字で表示し、湿度のパーセント値、日時、総記録数も表示します。SDカードの/temp_log.csvファイルはExcel、Google Sheets、Pythonのpandasで開いて分析できます。温室の監視、家や部屋の温度管理、実験室のデータ収集、食品の保管環境や養蜂箱の監視に適しています。

4.7(7)
12
ESP32 DHT22温湿度計(LCDディスプレイ付き)
#117中級

ESP32 DHT22温湿度計(LCDディスプレイ付き)

DHT22センサーで周囲の温度と湿度を測定し、16x2 I2C LCDにリアルタイムで表示するプロジェクトです。Adafruit DHTライブラリを使い、1本の信号線を使うプロトコルでセンサーからデータを読み取ります。IoT気象観測装置やスマートホームの自動化、温室の環境監視システムの基礎となります。ESP32のGPIO 4ピンを介してDHT22と通信します。

4.8(38)
56
DHT11で温度と湿度を測定
#55中級

DHT11で温度と湿度を測定

部屋の温度は何度で、空気は湿っているでしょうか、それとも乾燥しているでしょうか?DHT11センサーが温度と湿度を測定し、Arduinoが2行のLCDディスプレイに値を表示して、数秒ごとに更新します。センサーに異常があればエラーメッセージが表示されます。自分だけの小さな気象観測装置を作る第一歩です。

4.7(47)
73
NTCと2x16 LCDディスプレイで温度を測定
#44初級
プレミアム

NTCと2x16 LCDディスプレイで温度を測定

小さなビーズのようなセンサーで周囲の温度を測ります。NTCというこの部品は、温まるほど電気が流れやすくなります。Arduinoがその変化を読み取り、数式で摂氏温度に変換して、2行のLCDディスプレイに0.5秒ごとに表示します。手のひらでセンサーを温めて、数値が上がる様子を見るのも楽しみの1つです。

4.5(33)
44
LCDディスプレイ付きデジタル電圧計
#56中級
プレミアム

LCDディスプレイ付きデジタル電圧計

自作の測定器で、電池や電源アダプターが出力する電圧を調べます。2つの抵抗で作る分圧回路が、高い電圧をボードで読み取れるレベルまで下げます。Arduinoが元の電圧を計算し、2行のLCDディスプレイにボルト単位で表示します。この回路では約55ボルトまでの直流電圧を測定できます。コンセントの商用電源には絶対に接続しないでください。

4.5(27)
36
LDRで光の強さを測定
#11初級

LDRで光の強さを測定

部屋の明るさを数値で見てみませんか?光に反応する小さな部品、LDRで周囲の光を測定し、Arduinoが0.5秒ごとにその値をコンピューターの画面に表示します。手で覆うと数値が変わる様子を確認できます。自動で点灯する常夜灯などのプロジェクトへの第一歩です。

4.6(81)
138