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とは?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はOneWireという1本のデータ線を使うプロトコルで通信し、精度は±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+VCCへ4.7 kΩ | GPIO 4+3V3へ4.7 kΩ | GP22+3V3へ4.7 kΩ |
ArduinoのTDS測定コード:メディアンフィルタと温度補償
- ライブラリマネージャからOneWireとDallasTemperatureのライブラリをインストールしてください。
- 表のとおりにTDSモジュールとDS18B20を配線し、プローブと温度センサーを同じ水に入れてください。
- コードを書き込み、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| コードの部分 | 役割 |
|---|---|
| 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の目安:飲料水、水槽、水耕栽培
表示された数値の意味を知ることは、センサー自体と同じくらい大切です。世界保健機関の味に関する評価では、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〜150 | RO水にミネラルを加えて調整します |
| アフリカンシクリッドの水槽 | 300〜500 | ミネラルの豊富な硬水を好みます |
| 海水 | 約35,000 | このセンサーの測定範囲を大きく超えます |
水耕栽培の培養液の濃度は通常、導電率(EC)で表し、植物によって適正値が異なります。ただし、このセンサーの上限は1000 ppmで、トマトやピーマンなど栄養を多く必要とする植物の培養液はそれを超えるため、注意してください。その場合は、試料を蒸留水で既知の比率に薄めて測り、結果に希釈倍率を掛けるか、より測定範囲の広いECセンサーを使ってください。
| 植物 | 推奨EC(mS/cm) | 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〜1250 ppm(希釈が必要) |
| トマト、ピーマン | 2.0〜3.5 | 1000〜1750 ppm(希釈が必要) |
浄水フィルターを監視する
家庭でTDSセンサーが最も役立つ用途は、逆浸透(RO)フィルターの監視です。正常なRO膜は流入水に含まれるミネラルの大部分を除去します。300 ppmの水が入ると、処理後の水は通常10〜30 ppm程度になります。性能は除去率=(1 − 出口 / 入口)× 100で計算します。入口が300 ppmで出口が15 ppmなら、除去率は95%です。膜が劣化すると出口のTDSが徐々に上がります。除去率が80〜85%を下回り始めたら、膜とプレフィルターの交換時期が近づいています。Arduinoに2本のプローブと2個のDS18B20をつなぎ、入口と出口を同時に測れば、数か月にわたる変化をグラフにできます。
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時計の記事で説明しています。
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を求め、コードに書き込めます。
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)
31TDSセンサーとpHセンサーの違い
水質測定のプロジェクトではTDSセンサーとpHセンサーがよく混同されますが、測るものはまったく異なります。TDSは水中のイオンの量を示し、pHは酸性やアルカリ性の強さ(水素イオン活量)を示します。コップの水にレモン汁を数滴加えると、pHは大きく下がりますがTDSはほとんど変わりません。塩をひとつまみ加えると、TDSは急上昇しますがpHはほぼ変わりません。水槽や水耕栽培では、通常は両方を合わせて監視します。
| 項目 | TDSセンサー | pHセンサー |
|---|---|---|
| 測定対象 | 溶解イオンの量(導電率) | 酸性・アルカリ性の強さ(0〜14) |
| 単位 | ppm(mg/L)またはµS/cm | pH値 |
| プローブ | 丈夫な一対の金属電極 | 壊れやすいガラス電極 |
| キャリブレーション | 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つずつ測るか、絶縁型モジュールを使ってください。
この記事を読んだ後に作れるプロジェクト
全プロジェクトを見る
スマート水やりステーション
旅行中も植物が枯れないよう、自動で水やりをするシステムです。土壌水分センサーで土の湿り具合を測定し、乾燥するとArduinoが給水ポンプを数秒間動かして、青いライトを点灯させます。水分が適切なときは緑のライトが点灯します。土がひどく乾燥すると、赤いライトが点滅し、ブザーが鳴って知らせます。

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

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

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

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

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

LDRで光の強さを測定
部屋の明るさを数値で見てみませんか?光に反応する小さな部品、LDRで周囲の光を測定し、Arduinoが0.5秒ごとにその値をコンピューターの画面に表示します。手で覆うと数値が変わる様子を確認できます。自動で点灯する常夜灯などのプロジェクトへの第一歩です。
ほかの記事
BlueGraysアプリ
この回路をスマホでステップごとに作る
回路図、コード、部品リストを1つの画面で確認できます。Arduino、ESP32、Picoのプロジェクトを200件以上用意しています。

