TDS là gì ???
TDS là viết tắt của “Total Dissolved Solids”, có thể gọi nôm na là Tổng chất rắn hòa tan.
TDS là một trong những chỉ số dùng để kiểm tra chất lượng của nước, hàm lượng tất cả các chất hữu cơ, vô cơ chứa trong chất lỏng (cụ thể là nước)
Đơn vị TDS: mg/l (minigrams/liter) hoặc ppm (part/million)
Chỉ số TDS càng nhỏ thì nước càng sạch, nhưng nếu nhỏ quá mức thì nước gần như không có khoáng chất, tuy nhiên không phải chỉ số TDS cao là nước bẩn
TDS không được coi là chỉ số gây ô nhiễm, nó là chỉ số tổng hợp về sự hiện diện của các hợp chất hóa học.
Dưới đây là thang chỉ số TDS áp dụng cho nước sinh hoạt
Một project nhỏ giúp đo chỉ số TDS của nước, truyền hiển thị dữ liệu lên máy tính thông qua cổng UART
Phần cứng cần chuẩn bị
1 Kit Arduino Uno
http://mlab.vn/1697809-uno-vn01-arduino-uno-phien-ban-viet-nam.html
Hoặc http://mlab.vn/2356225-dfrduino-uno-r3-arduino-uno-r3-compatible.html
1 Cảm biến TDS đo tổng chất rắn hòa tan
http://mlab.vn/2458624-cam-bien-tds-do-tong-chat-ran-hoa-tan.html
1 Cốc nước để đo TDS
Kết nối
Code mẫu
#define TdsSensorPin A1 #define VREF 5.0 // analog reference voltage(Volt) of the ADC #define SCOUNT 30 // sum of sample point int analogBuffer[SCOUNT]; // store the analog value in the array, read from ADC int analogBufferTemp[SCOUNT]; int analogBufferIndex = 0,copyIndex = 0; float averageVoltage = 0,tdsValue = 0,temperature = 25; void setup() { Serial.begin(115200); pinMode(TdsSensorPin,INPUT); } void loop() { static unsigned long analogSampleTimepoint = millis(); if(millis()-analogSampleTimepoint > 40U) //every 40 milliseconds,read the analog value from the ADC { analogSampleTimepoint = millis(); analogBuffer[analogBufferIndex] = analogRead(TdsSensorPin); //read the analog value and store into the buffer 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; // read the analog value more stable by the median filtering algorithm, and convert to voltage value float compensationCoefficient=1.0+0.02*(temperature-25.0); //temperature compensation formula: fFinalResult(25^C) = fFinalResult(current)/(1.0+0.02*(fTP-25.0)); float compensationVolatge=averageVoltage/compensationCoefficient; //temperature compensation tdsValue=(133.42*compensationVolatge*compensationVolatge*compensationVolatge - 255.86*compensationVolatge*compensationVolatge + 857.39*compensationVolatge)*0.5; //convert voltage value to tds value //Serial.print("voltage:"); //Serial.print(averageVoltage,2); //Serial.print("V "); Serial.print("TDS Value:"); Serial.print(tdsValue,0); Serial.println("ppm"); } } 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; }
Và đây là kết quả