ESP8266-Arduino编程实例-TDS(溶解固体总量)水质传感器驱动
TDS(溶解固体总量)水质传感器驱动
TDS (Total Dissolved Solids,溶解固体总量)传感器用于计指示溶液中的总溶解固体,如盐、矿物质和金属。 这些参数可用于了解水质并比较不同来源的水。 TDS 计的主要应用之一是水族馆水质监测。

TDS具有如下特性:
- 输入电压:DC 3.3 ~ 5.5V
- 输出电压:0~2.3V
- 工作电流:3~6mA
- TDS测量范围:0~1000ppm
- TDS 测量精度:± 10% F.S. (25℃)
- 模块接口:XH2.54-3P
- 电极接口:XH2.54-2P
本文将演示如何使用TDS来检测水质。
1、硬件准备
- ESP8266 NodeMCU开发板一块
- TDS传感器模块一个
- 面板板一个
- 杜邦线若干
- 数据线一条
硬件接线如下:
| TDS 传感器 |
ESP8266 |
| GND |
GND |
| VCC |
3.3V |
| Data |
A0 |
3、软件准备
- Arduino IDE或VSCode + PlatformIO
在前面的文章中,对如何搭建ESP8266开发环境做了详细的介绍,请参考:
ESP8266 NodeMCU的引脚介绍在前面的文章中做了详细的介绍,请参考:
4、代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
| #define TdsSensorPin A0 #define VREF 3.3 // ADC参考电压 #define SCOUNT 30 // 采样次数
int analogBuffer[SCOUNT]; // 储存ADC采样结果 int analogBufferTemp[SCOUNT]; int analogBufferIndex = 0; int copyIndex = 0;
float averageVoltage = 0; float tdsValue = 0; float temperature = 23; // 温度补偿值
// 中值滤波 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毫秒,从ADC读取模拟值 analogSampleTimepoint = millis(); analogBuffer[analogBufferIndex] = analogRead(TdsSensorPin); //储存ADC采样数据 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; // 温度补偿公式: fFinalResult(25^C) = fFinalResult(current)/(1.0+0.02\*(fTP-25.0)); float compensationCoefficient = 1.0+0.02\*(temperature-25.0); // 温度补偿 float compensationVoltage=averageVoltage / compensationCoefficient; // 将电压转换成TDS数据 tdsValue=(133.42\*compensationVoltage\*compensationVoltage\*compensationVoltage - 255.86\*compensationVoltage\*compensationVoltage + 857.39\*compensationVoltage)\*0.5; //Serial.print("voltage:"); //Serial.print(averageVoltage,2); //Serial.print("V "); Serial.print("TDS Value:"); Serial.print(tdsValue,0); Serial.println("ppm"); } } }
|
文章来源: https://iotsmart.blog.csdn.net/article/details/127762437
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!