当前位置: 首页 > news >正文

TDS传感器 - 从零开始认识各种传感器【二十五期】

TDS传感器|从零开始认识各种传感器

1. 什么是TDS传感器?

read-normal-img

TDS传感器是用来检测水中的总溶解固体的含量的传感器。TDS(Total Dissolved Solids),中文名总溶解固体,又称溶解性固体总量,表明1升水中溶有多少毫克溶解性固体。一般来说,TDS值越高,表示水中含有的溶解物越多,水就越不纯净。因此,TDS值的大小,可作为反映水的洁净程度的依据之一。

read-normal-img

TDS传感器在各种领域都有广泛的应用,包括饮用水检测,工业过程控制,农业灌溉等。

2. TDS传感器是如何工作的?

TDS传感器的工作原理是基于电导率(EC,Electrical Conductivity)测量。电导率是指水样中离子导电的能力,水中溶解的固体(如盐类、矿物质)会增加水的电导率。

TDS传感器通过在两个或多个电极之间施加电压。那么带正电的离子(如钠离子,钙离子,镁离子等)向带负电荷的电极移动,而带负电荷的离子(如氯离子,硫酸根离子,碳酸氢根离子等)会向带正电荷的电极移动。这种离子的移动形成了电流。仪表通过检测离子的移动来确定电流并通过换算得到液体的TDS值。

可能有读者会问,既然是测量电导率,而电导率又是电阻率的倒数,那能用万用表代替TDS传感器来测量吗?答案是不可以。 这是因为万用表测试用的是直流电。 而直流电会引起离子的持续移动形成化学反应。举个例子,如果我们向海水中施加直流电,由于海水中存在大量的离子,会有大量的化学反应在电极上发生。有些离子会附着在电极上,有些会产生气体,电极本身也可能发生溶解。这些反应都会对溶液造成影响,从而改变电导率。

read-normal-img

那么,TDS测试是如何避免这些问题的呢?它使用的是交流电,交流电电场方向变化速度非常快,不会形成电离子整体移动的效果。在一秒钟内,带电离子在不断往复运动。从总体上讲,溶液和电极都没有变化,因此可以测量精确的电导率。

read-normal-img

3、常见的TDS传感器的种类

按照工作方式不同,TDS传感器一般分为电极型和电感型两种。大部分产品都是电极型的TDS传感器。

3.1 电极型TDS传感器

read-normal-img

电极型TDS传感器属于直接测量,是最常见的类型。它利用两个或多个电极在水中产生电场,通过测量电极之间的电导率来确定水中的溶解固体浓度。电导率(EC,Electrical Conductivity)与TDS值之间存在一定的比例关系,因此通过电导率可以推算出TDS值。

read-normal-img

3.2 电感型TDS传感器

read-normal-img

电感型电导率传感器采用电磁感应原理对电导率进行测量。电磁感应是指的是指放在变化磁通量中的导体,会产生电动势,被称为感应电动势。若处于闭合回路中,则该电动势会驱使电子流动,形成感应电流。 下图中,由于开关的通断动作,左边线圈中会出现电流的不断变化,会导致左边线圈磁通量的改变,从而会在右边线圈感应出电流。

电感型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_tempcurrent_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)/65535return 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()

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • websocket实现简易聊天室
  • Python连接数据库:JDBC不是唯一选择!
  • 什么是接口?
  • 【Pytorch实用教程】PyTorch中的Tensor拼接与组合以及其意义
  • nginx负载均衡、java、tomcat装包
  • 【代码随想录_Day32】 62.不同路径 63. 不同路径 II
  • Python习题 102:计算两个日期之间的天数
  • 物联网协议篇(1):modbus tcp和modbusRTU的区别是什么?
  • 改进:利用哈希表加密密码管理系统中的密码,改进密码管理系统
  • 软件技术(游戏软件开发方向)实训室解决方案
  • SQLite库笔记:命令行shell
  • JavaScript基础——JavaScript调用的三种方式
  • 在Windows系统上生成SSH秘钥
  • frp的配置参考
  • Vue前端的安全
  • [译]前端离线指南(上)
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • CAP理论的例子讲解
  • go append函数以及写入
  • JSONP原理
  • js递归,无限分级树形折叠菜单
  • SQLServer之创建显式事务
  • Travix是如何部署应用程序到Kubernetes上的
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • vue脚手架vue-cli
  • yii2权限控制rbac之rule详细讲解
  • 翻译:Hystrix - How To Use
  • 猴子数据域名防封接口降低小说被封的风险
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 力扣(LeetCode)357
  • 我的业余项目总结
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • 数据可视化之下发图实践
  • ​​​【收录 Hello 算法】10.4 哈希优化策略
  • ​【经验分享】微机原理、指令判断、判断指令是否正确判断指令是否正确​
  • ​iOS实时查看App运行日志
  • ​比特币大跌的 2 个原因
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • (2024,Flag-DiT,文本引导的多模态生成,SR,统一的标记化,RoPE、RMSNorm 和流匹配)Lumina-T2X
  • (24)(24.1) FPV和仿真的机载OSD(三)
  • (8)STL算法之替换
  • (k8s)Kubernetes本地存储接入
  • (k8s中)docker netty OOM问题记录
  • (STM32笔记)九、RCC时钟树与时钟 第一部分
  • (笔试题)分解质因式
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (四)Controller接口控制器详解(三)
  • (转)mysql使用Navicat 导出和导入数据库
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .net6 core Worker Service项目,使用Exchange Web Services (EWS) 分页获取电子邮件收件箱列表,邮件信息字段
  • .NET开源项目介绍及资源推荐:数据持久层