การใช้งาน NodeMCU ESP8266 ร่วมกับเซนเซอร์ TDS (วัดคุณภาพน้ำ)
ในบทความนี้ คุณจะได้เรียนรู้วิธีการใช้เซนเซอร์ TDS Meter (Total Dissolved Solids) ร่วมกับบอร์ด ESP8266 NodeMCU เพื่อวัดค่าสารละลายรวมที่ละลายอยู่ในน้ำ เช่น เกลือ แร่ธาตุ และโลหะหนัก ซึ่งค่านี้สามารถใช้เป็นตัวบ่งชี้คุณภาพน้ำในเบื้องต้น และใช้เปรียบเทียบน้ำจากแหล่งต่างๆ ได้ โดยแอปพลิเคชันยอดนิยมคือการตรวจสอบคุณภาพน้ำในตู้ปลาหรืองานไฮโดรโปนิกส์
รู้จักกับ TDS Meter
TDS Meter ทำหน้าที่วัดจำนวนสารละลายรวมที่ละลายอยู่ในน้ำ เมื่อจำนวนสารละลายเพิ่มขึ้น ค่าการนำไฟฟ้าของน้ำก็จะสูงขึ้นตาม ซึ่งช่วยให้เราสามารถคำนวณค่าสารละลายรวมออกมาเป็นหน่วย ppm (mg/L) ได้

⚠️ ข้อควรระวัง: แม้ว่าค่า TDS จะเป็นตัวบ่งชี้คุณภาพน้ำที่ดี แต่ไม่ได้ทำหน้าที่วัดสารปนเปื้อน (Contaminants) ทั้งหมด ดังนั้นจึงไม่ควรใช้ค่านี้เพียงอย่างเดียวในการตัดสินว่าน้ำนั้นปลอดภัยสำหรับการบริโภคหรือไม่
การใช้งานที่เหมาะสม: สระว่ายน้ำ, ตู้ปลา, บ่อเลี้ยงปลา, การปลูกพืชไฮโดรโปนิกส์ และระบบกรองน้ำ
📋 คุณสมบัติและสเปกของเซนเซอร์ (Keyestudio TDS V1.0)
- แรงดันไฟฟ้าขาเข้า: DC 3.3 ~ 5.5V
- แรงดันไฟฟ้าขาออก: 0 ~ 2.3V
- กระแสไฟฟ้าขณะทำงาน: 3 ~ 6mA
- ช่วงการวัด TDS: 0 ~ 1000ppm
- ความแม่นยำ: ± 10% F.S. (ที่อุณหภูมิ 25 ℃)
- หัวโพรบ (Probe): กันน้ำ (Waterproof), สายยาว 60 ซม.
🔌 การต่อวงจร TDS Sensor กับ ESP8266
เนื่องจากเซนเซอร์ส่งสัญญาณออกมาเป็น Analog เราจะใช้ขา A0 ของ NodeMCU ในการรับค่า:
| TDS Sensor Pin | NodeMCU (ESP8266) Pin |
|---|---|
| GND | GND |
| VCC | 3.3V |
| Data / Signal | A0 |
💻 โค้ดโปรแกรม (Arduino IDE)
โค้ดนี้มีการใช้ Median Filtering Algorithm เพื่อช่วยให้ค่าที่อ่านได้มีความนิ่งและแม่นยำมากขึ้น อัปโหลดโค้ดนี้ลงในบอร์ดของคุณ:
#define TdsSensorPin A0
#define VREF 3.3 // แรงดันอ้างอิงของ ADC (ใช้ 3.3V สำหรับ NodeMCU)
#define SCOUNT 30 // จำนวนจุดตัวอย่างเพื่อหาค่าเฉลี่ย
int analogBuffer[SCOUNT];
int analogBufferTemp[SCOUNT];
int analogBufferIndex = 0;
int copyIndex = 0;
float averageVoltage = 0;
float tdsValue = 0;
float temperature = 25; // กำหนดอุณหภูมิปัจจุบัน (ใช้สำหรับการชดเชยค่า)
// อัลกอริทึม Median Filter เพื่อลดสัญญาณรบกวน
int getMedianNum(int bArray[], int iFilterLen){
int bTab[iFilterLen];
for (byte i = 0; i<iFilterLen; i++) bTab[i] = bArray[i];
int i, j, bTemp;
for (j = 0; j < iFilterLen - 1; j++) {
for (i = 0; i < iFilterLen - j - 1; i++) {
if (bTab[i] > bTab[i + 1]) {
bTemp = bTab[i];
bTab[i] = bTab[i + 1];
bTab[i + 1] = bTemp;
}
}
}
if ((iFilterLen & 1) > 0) bTemp = bTab[(iFilterLen - 1) / 2];
else bTemp = (bTab[iFilterLen / 2] + bTab[iFilterLen / 2 - 1]) / 2;
return bTemp;
}
void setup(){
Serial.begin(115200);
pinMode(TdsSensorPin, INPUT);
}
void loop(){
static unsigned long analogSampleTimepoint = millis();
if(millis() - analogSampleTimepoint > 40U){ // อ่านค่าทุก 40 มิลลิวินาที
analogSampleTimepoint = millis();
analogBuffer[analogBufferIndex] = analogRead(TdsSensorPin);
analogBufferIndex++;
if(analogBufferIndex == SCOUNT) analogBufferIndex = 0;
}
static unsigned long printTimepoint = millis();
if(millis() - printTimepoint > 800U){
printTimepoint = millis();
for(copyIndex=0; copyIndex<SCOUNT; copyIndex++)
analogBufferTemp[copyIndex] = analogBuffer[copyIndex];
// คำนวณแรงดันไฟฟ้าเฉลี่ย
averageVoltage = getMedianNum(analogBufferTemp, SCOUNT) * (float)VREF / 1024.0;
// สูตรชดเชยอุณหภูมิ (Temperature Compensation)
float compensationCoefficient = 1.0 + 0.02 * (temperature - 25.0);
float compensationVoltage = averageVoltage / compensationCoefficient;
// แปลงค่าแรงดันไฟฟ้าเป็นค่า TDS (ppm)
tdsValue = (133.42 * pow(compensationVoltage, 3) - 255.86 * pow(compensationVoltage, 2) + 857.39 * compensationVoltage) * 0.5;
Serial.print("TDS Value: ");
Serial.print(tdsValue, 0);
Serial.println(" ppm");
}
}
✨ บทสรุป
เซนเซอร์ TDS เป็นเครื่องมือที่ยอดเยี่ยมในการตรวจสอบคุณภาพน้ำเบื้องต้น โดยให้ผลลัพธ์เป็นหน่วย ppm คุณสามารถนำไปประยุกต์ใช้ร่วมกับเซนเซอร์อุณหภูมิ DS18B20 แบบกันน้ำ เพื่อสร้างระบบมอนิเตอร์ตู้ปลาอัจฉริยะที่ส่งข้อมูลผ่าน Wi-Fi ไปยังแอปพลิเคชันบนมือถือได้อีกด้วย!
หากคุณสนใจอยากให้สอนทำ Web App สำหรับควบคุมอุณหภูมิและคุณภาพน้ำในตู้ปลาผ่าน ESP8266 สามารถคอมเมนต์บอกกันไว้ได้เลยนะครับ!