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