作为一名小白,上网找资料不齐全,现在摸索明白了,故写下此文章,供大家参考

免费源码:

【免费】免费:TSW-30浊度传感器+STM32F103C8T6+Keil5资源-CSDN文库

该篇文章是看了b站博主领悟后写下来的,看不懂我的文章可以看下面链接的视频

特此鸣谢:b站的up主 单片机俱乐部

【mcuclub】浑浊度传感器-TSW-30_哔哩哔哩_bilibili

【mcuclub】浑浊度传感器-TSW-30 - 单片机俱乐部

一、接线

下图是我的模块接线图,引脚A我接的是开发板的PA2

二、原理与公式

1、原理(仅供了解)

     这款浊度传感器利用光学原理,通过溶液中的透光率和散射率来综合判断浊度情况。传感器内部是一个红外线对管,当光线穿过一定量 的水时,光线的透过量取决于该水的污浊程度,水越污浊,透过的光就越少。光 接收端把透过的光强度转换为对应的电流大小,透过的光多,电流大,反之透过 的光少,电流小。
      浊度传感器模块将传感器输出的电流信号转换为电压信号,通过单片机进行AD 转换数据处理。具有模拟量和数字量输出接口。模拟量可通过单片 A/D 转换器进行采样处理,以获知当前水的污浊度。数字量可通过模块上的 电位器调节触发阈值,当浊度达到设置好的阈值后, D1 指示灯会被点亮,传感 器模块输出由高电平变成低电平,单片机通过监测电平的变化,判断水的浊度是 否超标,从而预警或者联动其他设备。

2、公式

传感器模块输出电压与浑浊度关系如下图所示。
浊度值与模块输出电压满足如下关系:
TU =-865.68× U+K
上式中 TU 为当前浊度值, U 为当前温度条件下模块的输出电压值, K 为截距值,需通过标定方法得到。
传感器输出电压值大小受温度影响,输出电压与温度曲线关系如下图所示。进行浊度测量时需进行温度补偿以保证测量精度。
温度校正公式:
∆U=- 0.0192×(T-25)
上式中U 为温度变化引起的电压差; T 为当前测量温度值。

3、校准方法,即求出k值

由于浊度传感器的个体差异、环境光或未进行温度补偿等原因。为获得更精确的浊度值,在测量之前,必须进行校准。具体操作方法介绍如下。
      第一步:安装浊度传感器,给传感器模块供电。使用 0NTU 的标准溶液(或
者接近 0NTU 的纯净水或蒸馏水)进行校准;
      第二步:在传感器使用环境状态下(尽量避免光线强弱引起的误差)测量记
录当前校准溶液的温度值并记录为 T 1 ;测量并记录传感器模块的输出电压为
U 1
     第三步:计算温差引起的电压差值∆U 。将测量得到 T1 代入温度修正公式。
∆U=- 0.0192×(T1-25)
     第四步:计算 0NTU 标准液( 25 ℃)标准电压值 U 2
U2=U1-∆U
     第五步:计算 K 值,将计算得到标准电压值 U 2 代入标准曲线公式。
K= -865.68×U2
     第六步:修正标准曲线公式。将计算得到的 K 代入标准曲线公式。
TU =-865.68× U+K

三、实操+代码

1、代码

#include "stm32f10x.h"
#include "bsp_usart1.h"
#include <string.h>
#include "delay.h"
#include "driver_1602.h"
#include "math.h"
#include "bsp_adc.h"
#include "ds18b20.h"
 
float TU=0.0;
float TU_value=0.0;
float TU_calibration=0.0;

float temp_data=250.0;
float K_Value=2856.046553;

u8 ISendByte(unsigned char sla,unsigned char c);
u8 IRcvByte(unsigned char sla);	
u8 SPIx_ReadWriteByte(u8 TxData);


// ADC1转换的电压值通过MDA方式传到SRAM
extern __IO uint16_t ADC_ConvertedValue;

// 局部变量,用于保存转换计算后的电压值 	 
float ADC_ConvertedValueLocal;  


/**************TDS值采集函数***************/
void TU_Value_Conversion()
{
	TU =(float) ADC_ConvertedValue/4096*3.3; // 读取转换的AD值
	
	TU_calibration=-0.0192*(temp_data/10-25)+TU;  
	TU_value=-865.68*TU_calibration+ K_Value ;
	
	if(TU_value<=0){TU_value=0;}
	if(TU_value>=3000){TU_value=3000;}
}

void TEMP_Value_Conversion()
{
	  temp_data=DS18B20_Get_Temp();
}


int main(void)
{	
    /*初始化DS18B20模块*/
    //DS18B20_Init();

    /* 配置USART1 */
    USART1_Config();
	// ADC 初始化
	ADCx_Init();  
	
  while(1)
	{	
		//TEMP_Value_Conversion();
		TU_Value_Conversion();	
		
		printf("%.2f\n",TU_value);
		delay_ms(1000);
		
	}	
}

2、校准浑浊度,求k值

因为没有ds18b20模块测水温,所以我直接设定水温temp_data为25℃。

求出k值:TU_value值即为k值。将TU_Value_Conversion函数改动两个地方,如下图

将浊度模块放入清水中,代码烧录到开发板,串口打印出数据。

注意:校准时,模块测的数据一定是清水里的,而不是在空气中

将K_Value设为串口打印的数值。将代码恢复会原状。烧录代码,串口打印为0.00

注意:

刚开始浊度模块的数据有跳动,要等到稳定为止,如果还是有小浮动的跳动,要取数据的最小值求k值。因为根据公式

水越清,电压越高。则TU_value越小(负数),k越小。如果不取最小值作为k值,会导致有点浑浊也会浑浊度为0

将浑浊度模块放到不同浊度的水里,串口打印不同数据

我是将泥土放进杯中检测的,因为泥土会不断下沉,所以浑浊度是不断减小的。

四、注意事项

1、浊度传感器可以测量水中什么物质?
答:浊度传感器测量的是水环境中的颗粒状漂浮物,如:泥沙、黏土、金属颗粒、有机物、浮游生物和微生物等悬浮物质;不太适合测量例如墨汁、颜色色料造成的水质污染环境;用几滴墨水混合纯净水来测量的方式是错误的方案。

2、浊度传感器顶端不防水,使用时禁止将浊度传感器完全抛入水中,水面不能没过顶盖与壳体连接处,传感器进水会造成传感器烧坏。

3、传感器头部壳体需保持清洁,避免污染物遮挡造成测量不准。

4、传感器光敏二极管接收光线的波长范围为(500~1050nm),日光或日光 灯光线波长会影响传感器光敏电阻的接收,影响测量输出。日光或灯光直射会增 大传感器测量误差,传感器使用时应避免日光或灯光直射。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐