TDS传感器|从零开始认识各种传感器
1. 什么是TDS传感器?
TDS传感器是用来检测水中的总溶解固体的含量的传感器。TDS(Total Dissolved Solids),中文名总溶解固体,又称溶解性固体总量,表明1升水中溶有多少毫克溶解性固体。一般来说,TDS值越高,表示水中含有的溶解物越多,水就越不纯净。因此,TDS值的大小,可作为反映水的洁净程度的依据之一。
TDS传感器在各种领域都有广泛的应用,包括饮用水检测,工业过程控制,农业灌溉等。
2. TDS传感器是如何工作的?
TDS传感器的工作原理是基于电导率(EC,Electrical Conductivity)测量。电导率是指水样中离子导电的能力,水中溶解的固体(如盐类、矿物质)会增加水的电导率。
TDS传感器通过在两个或多个电极之间施加电压。那么带正电的离子(如钠离子,钙离子,镁离子等)向带负电荷的电极移动,而带负电荷的离子(如氯离子,硫酸根离子,碳酸氢根离子等)会向带正电荷的电极移动。这种离子的移动形成了电流。仪表通过检测离子的移动来确定电流并通过换算得到液体的TDS值。
可能有读者会问,既然是测量电导率,而电导率又是电阻率的倒数,那能用万用表代替TDS传感器来测量吗?答案是不可以。 这是因为万用表测试用的是直流电。 而直流电会引起离子的持续移动形成化学反应。举个例子,如果我们向海水中施加直流电,由于海水中存在大量的离子,会有大量的化学反应在电极上发生。有些离子会附着在电极上,有些会产生气体,电极本身也可能发生溶解。这些反应都会对溶液造成影响,从而改变电导率。
那么,TDS测试是如何避免这些问题的呢?它使用的是交流电,交流电电场方向变化速度非常快,不会形成电离子整体移动的效果。在一秒钟内,带电离子在不断往复运动。从总体上讲,溶液和电极都没有变化,因此可以测量精确的电导率。
3、常见的TDS传感器的种类
按照工作方式不同,TDS传感器一般分为电极型和电感型两种。大部分产品都是电极型的TDS传感器。
3.1 电极型TDS传感器
电极型TDS传感器属于直接测量,是最常见的类型。它利用两个或多个电极在水中产生电场,通过测量电极之间的电导率来确定水中的溶解固体浓度。电导率(EC,Electrical Conductivity)与TDS值之间存在一定的比例关系,因此通过电导率可以推算出TDS值。
3.2 电感型TDS传感器
电感型电导率传感器采用电磁感应原理对电导率进行测量。电磁感应是指的是指放在变化磁通量中的导体,会产生电动势,被称为感应电动势。若处于闭合回路中,则该电动势会驱使电子流动,形成感应电流。 下图中,由于开关的通断动作,左边线圈中会出现电流的不断变化,会导致左边线圈磁通量的改变,从而会在右边线圈感应出电流。
电感型TDS传感器通过对感应电流进行测量来确定液体的TDS值。因为液体的电导率在一定范围内与感应电压呈正比关系。再通过电导率与TDS值之间存在的比例关系,就可以推算出TDS值。
电感型TDS传感器检测器不直接与被测液体接触,具有极强的抗污染能力与耐腐蚀性。也不存在电极极化与电极被污染的问题。但它的测量原理决定了它仅适用于测量具有高电导率的液体而不是测试自来水,矿泉水这样低电导率的液体。
4、TDS传感器实验演示
我们来演示使用 MCU 读取显示TDS传感器的数据。这是一款电极型的TDS传感器模块,模块的探头插入杯中。屏幕实时显示了它传回来的TDS值,当前杯中使用的是纯净水,所以测得TDS值只有个位数。在水中加入少量可乐,可以看到测得的TDS数值增大到了25左右。
代码:
from breakout_colourlcd240x240 import BreakoutColourLCD240x240
from machine import ADC, Pin, Timer, PWM
from utime import sleep
import time, math,array
#------------------------------------------------------------------
width = BreakoutColourLCD240x240.WIDTH
height = BreakoutColourLCD240x240.HEIGHT
display_buffer = bytearray(width * height*2)
display = BreakoutColourLCD240x240(display_buffer)
timer1 = Timer()
stemp = ADC(2)
current_temp = 0
#-------------------------------------------------------------------
def display_init():
display.set_pen(0,255,0)
display.rectangle(58,30,13,160)
display.circle(64,190,10)
display.set_pen(255,0,0)
display.text("current", 150, 20, 194, 2)
display.text("value", 150, 35, 194, 2)
display.update()
for i in range(6):
display.set_pen(0,200,0)
display.pixel_span(80,27 + i*30,10)
display.text(str(50 - i *10), 100, 20+i*30, 194, 2)
display.set_pen(0,0,220)
if i < 5:
for j in range(4):
display.pixel_span(80,33 + j*6 + i * 30,5)
display.update()
#---------------------------------------------------------------------
def display_change(temp, color):
global current_temp
current_temp = temp
#print(temp)
display.set_pen(color[0], color[1], color[2])
display.rectangle(58,30,13,160)
display.circle(64,190,10)
display.set_pen(0,0,150)
display.rectangle(58,20,13,7+int((50-temp)/2)*6)
display.set_pen(0,0,0)
display.rectangle(150,50,90,40)
display.set_pen(0,255,0)
display.text(str(temp), 150, 50, 5, 5)
display.update()
#----------------------------------------------------------------------
def get_temp():
Analogvalue=stemp.read_u16()
voltage=200*float(Analogvalue)/65535
return voltage
#----------------------------------------------------------------------
def main():
color = [0,255,0]
timer1 = Timer()
display_init()
timer1.init(freq=5,mode=Timer.PERIODIC, callback=lambda t:display_change(round(get_temp(),1), color))
while True:
sleep(0.1)
main()
版权归原作者 硬禾科技 所有, 如有侵权,请联系我们删除。