湿敏电阻CM-R / HR202应用 原理图 IO输出交流 AD采样 (附NTC热敏电阻)


【本文发布于https://blog.csdn.net/Stack_/article/details/113827555,未经许可不得转载,转载须注明出处】




在学校里学习时,测量温湿度多用DHT22模块,因为这模块容易上手。但是这个模块很贵,且各DHT22模块温湿度数值不统一还容易坏:手上的几个DHT22湿度误差最大能到20%,且有个别久放之后读到的湿度一直是99%。性价比太低。
用热敏电阻和湿敏电阻测量温湿度是个值得研究的方案。
热敏电阻测温实现起来不难,难在湿敏电阻的使用经验分享是少之又少,花了不少功夫去查资料、研究。

【该文章的方案仅实现了用电阻测量温湿度,不考虑精度】



一、IO测电阻法

数据手册提供的这张电路图,其测量湿敏电阻阻值的过程简单来说就是:
1、所有IO设为输出,拉低,将电容余电放尽;
2、检测电平IO和湿敏电阻IO设为输入,10K电阻IO设为输出并拉高,同时开始计时。电容充电中;
3、检测电平IO变为高电平时(检测电平IO有上升沿中断功能更好),停止计时,记录下这个时间T1;
4、重复1、2、3的步骤,只是步骤2的通过10K电阻充电改为通过湿敏电阻充电,记录下充电时间T2;
5、根据关系式T1 / 10K = T2 / R湿敏,计算出湿敏电阻阻值,查表得到湿度值。

(充放电都确保电流流经湿敏电阻,满足交流的要求应该能大大延长湿敏电阻寿命)

【参考资料】

官方电路图



==============================================================================



上述方法我未实践过,只实践过下面这个:采用IO模拟交流输出,AD采样的方法【参考资料】


二、AD测电阻

在这里插入图片描述

DEMO板原理图



在这里插入图片描述

DEMO板

.
.


/**
  * @brief  产生1KHz交流方波
  * @note   固定电阻端和湿敏电阻端IO此高彼低产生交流方波
  * 此函数在main中循环,循环中没有死等的延时,time2_cnt在250us定时中断中递增
  * 如果单片机速度足够快,该函数可直接放置于250us中断中执行
  * @param  None
  * @retval None
  * @author PWH 
  * @ CSDN Tyrion.Mon
  * @date   2021/2
  */
void humd_create_1KHzAndStartAdc(void)
{
	static uint32_t time = 0;
	static uint8_t flag = 1;

	if ((time2_cnt - time) > 0)	//time2_cnt每250us加1
	{
		time = time2_cnt;
		if (flag == 1)	//1KHz开始,固定电阻端拉高,湿敏电阻端拉低
		{
			flag = 2;
			SENSOR_HUMID_10K_GPIO->ODR |= (uint8_t)SENSOR_HUMID_10K_PIN;
			SENSOR_HUMID_RH_GPIO->ODR &= (uint8_t)(~SENSOR_HUMID_RH_PIN);
			return;
		}
		else if (flag == 2)	//高电平二分之一处采样
		{
			flag = 3;
			if (humdHasStart == 1)
			{
				/* Clear the ADC1 channels */
				ADC1->CSR &= (uint8_t)(~ADC1_CSR_CH);
				/* Select the ADC1 channel */
				ADC1->CSR |= (uint8_t)(ADC1_CHANNEL_3);
				ADC1->CR1 |= ADC1_CR1_ADON;
				humdHasStart = 2;
			}
			return;
		}
		else if (flag == 3)	//翻转,固定电阻端拉低,湿敏电阻端拉高
		{
			flag = 4;
			SENSOR_HUMID_RH_GPIO->ODR |= (uint8_t)SENSOR_HUMID_RH_PIN;
			SENSOR_HUMID_10K_GPIO->ODR &= (uint8_t)(~SENSOR_HUMID_10K_PIN);
			return;
		}
		else if (flag == 4)
		{
			flag = 1;
			return;
		}
	}
}

产生1KHz方波


在这里插入图片描述

95%时的1KHz方波

在这里插入图片描述

60%左右湿度的1KHz方波



根据电路设计和湿度-阻值表算出各温湿度、各阻值下的ADC值。CM-R和HR202的曲线较为相似,据说C5-M3可被CM-R替代【HR202手册】【CM-R手册】

解释一下这里的计算公式:

  • 这单片机的AD是10位的,供电3.3V,ADC量程是0~1023
  • 湿敏电阻和10K分压电阻组成的分压电路是成比例地分压,即湿敏电阻为10K时,湿敏电阻分得3.3V÷(10+10)x10,为20K时分得3.3V÷(20+10)x20,可变化为湿敏电阻分得的电压=20K/(20K+10K)x3.3V
  • 分这3.3V相当于分1024的AD值,于是等效于 湿敏电阻AD值=20K/(20K+10K)x1024
  • 当ADC为12位,1024需要改为4096

因为公式转为比例运算了,所以不需要考虑ADC参考电压


在这里插入图片描述

Excel计算出AD值
.

/* 各温度下20% 25% 30% 。。。95%对应的ADC值(10位AD) */
@ CSDN Tyrion.Mon
uint16_t const humd_adc[11][16] =
{
	/* 0℃ */
	1023, 1023, 1022, 1020, 1016, 1009, 997, 972, 937, 881, 810, 713, 630, 531, 438, 350,
	/* 5℃ */
	1023, 1022, 1021, 1019, 1014, 1003, 986, 955, 915, 850, 785, 658, 564, 470, 350, 271,
	/* 10℃ */
	1023, 1022, 1020, 1016, 1009,  994, 970, 935, 889, 823, 739, 622, 512, 421, 332, 259,
	/* 15℃ */
	1022, 1021, 1019, 1014, 1004,  986, 955, 912, 853, 777, 682, 568, 461, 391, 307, 236,
	/* 20℃ */
	1022, 1020, 1018, 1012,  999,  976, 936, 883, 815, 726, 622, 522, 428, 332, 259, 198,
	/* 25℃ */
	1021, 1019, 1016, 1008,  990,  960, 911, 850, 774, 682, 600, 470, 379, 287, 224, 170,
	/* 30℃ */
	1021, 1018, 1014, 1004,  987,  953, 899, 834, 750, 630, 536, 435, 345, 265, 198, 156,
	/* 35℃ */
	1020, 1017, 1012, 1000,  982,  945, 883, 801, 713, 590, 490, 387, 307, 224, 163, 133,
	/* 40℃ */
	1019, 1014, 1008,  993,  971,  919, 856, 768, 664, 552, 435, 350, 265, 191, 141, 109,
	/* 45℃ */
	1018, 1012, 1006,  986,  950,  896, 823, 722, 617, 498, 387, 297, 224, 163, 125,  93,
	/* 50℃ */
	1016, 1009, 1000,  972,  938,  868, 785, 670, 566, 448, 336, 254, 211, 141, 109,  84
};

制表
. . .

/**
  * @brief  计算并查表得出湿度值
  * @note
  * @param  None
  * @retval None
  * @author PWH
  * @ CSDN Tyrion.Mon
  * @date   2021/2
  */
uint16_t humd_get(void)
{
	uint16_t adcVal = 0;
	int8_t i = 0;
	uint16_t tempVal = 0;
	uint8_t row = 0;
	adcVal = humd_getAdcValue();	//当前湿度ADC值
	if (!adcVal)					
	{
		return 0xffff;				//AD转换未完成
	}
	tempVal = temp_get_static();	//当前温度值(为实际温度的10倍)
	if (tempVal & 0x8000)			//温度为负
	{
		row = 0;
	}
	else
	{
		row = tempVal / 10 / 5;
	}
	if (row > 10)
	{
		return 0xffff;
	}
	for (i = 15; i > -1; i--)
	{
		if (adcVal <= humd_adc[row][i])
		{
			return (20 + i * 5) * 10;
		}
	}
	return 0xffff;
}


查表

.
.
在这里插入图片描述

测试结果



在这个温湿度下测试结果很理想,和DHT22的数值很接近:温度误差1℃内,湿度5%内。

【该代码没有引入插值算法,如果需要小数部分以作更为精确的测量,可以到我主页找NTC温度采集的文章,参考里面的插值算法】

【电路设计上切记远离热源,尤其是LDO等电源芯片】

(代码写得很随意,上面的描述已经很全了,我整理的文件并不比上面多多少,上面这个上位机也是我简单编写的,酌情下载)
【硬软、文档、调试上位机】





【2024-4 更新:又坏了3个,于是打了几块板子,彻底替换DHT22。支持小数,但还比较粗糙,可能有bug,待有时间继续完善。 访问 : 立创开源



  • 17
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 20
    评论
### 回答1: 湿敏电阻HR202L是一种用于湿度测量的传感器。在编写程序时,首先需要引入所使用的库文件。由于HR202L是一个模拟传感器,需要通过模拟输入引脚来读取湿度值。因此,需要连接传感器的模拟输出引脚到单片机的模拟输入引脚。 接下来,需要在程序中配置相应的引脚作为输入和输出模式。通过设置模拟输入引脚为输入模式,可以读取传感器输出的模拟信号。然后,使用模拟输入引脚的读取函数,读取传感器输出的模拟值。 传感器输出的模拟信号需要进行转换,才能得到真实的湿度值。这通常可以通过使用一定的公式来进行计算。根据传感器的数据手册,可以得到湿度转换公式。在程序中,可以通过将读取到的模拟值代入公式,计算并得到湿度值。 最后,可以通过串口或其他方式将湿度值输出到终端设备,或者通过其他方式进行处理。在程序中,可以使用串口输出函数,将湿度值发送到串口终端。 综上所述,湿敏电阻HR202L的程序主要包括引入库文件、配置引脚模式、读取模拟信号、转换湿度值和输出湿度值。编写程序前需要仔细阅读HR202L的数据手册,了解其工作原理和相关参数,并按照手册中的要求进行程序设计和开发。 ### 回答2: 湿敏电阻HR202L程序是一种用于检测环境湿度的程序。湿敏电阻HR202L是一种基于电阻变化的传感器,它能够根据周围湿度的变化来改变其电阻值。 在编写湿敏电阻HR202L程序时,首先需要连接电阻单片机。可以通过连接器将电阻单片机的模拟输入引脚相连。接下来,需要在程序中初始化单片机的模拟输入引脚,并设置适当的引脚为输入模式。 然后,使用模拟转换功能来读取湿敏电阻电阻值。这可以通过调用单片机ADC(模拟数字转换)函数来实现。ADC函数将返回一个数字值,表示湿敏电阻电阻值。根据具体的单片机型号和开发环境,ADC函数的调用方式可能会有所不同。 接着,需要将从湿敏电阻读取到的电阻值转换为湿度值。由于湿敏电阻电阻值与湿度呈线性关系,可以使用适当的公式或查找表将电阻值转换为湿度值。这个公式或查找表可以根据湿敏电阻的特性手动调整。 最后,将湿度值输出到显示器或其他设备上。可以通过调用单片机的串口输出函数或其他输出函数来实现这一步骤。具体的输出方式也取决于单片机型号和开发环境。 总之,湿敏电阻HR202L程序需要通过模拟转换读取电阻值,将其转换为湿度值,并最后输出到合适的设备上。编写这个程序需要熟悉单片机的相关功能和编程语言,并根据具体的硬件和需求进行相应的设置和调整。 ### 回答3: 湿敏电阻HR202L是一种环境湿度传感器,可以用于测量周围环境的湿度。下面是使用HR202L的基本程序示例。 首先,我们需要将HR202L传感器连接到微控制器。HR202L传感器有三个引脚:VCC(供电正极)、GND(地)和OUT(输出)。将VCC引脚连接到微控制器的电源引脚,将GND引脚连接到微控制器的地引脚,将OUT引脚连接到微控制器的模拟输入引脚。 然后,在程序中配置模拟输入引脚为输入模式,并设置其他必要的引脚。接着,我们需要读取模拟输入引脚的电压值。 HR202L的输出电压与环境湿度呈线性关系。通过将模拟输入的电压值与已知湿度下的电压值进行比较,我们可以计算出当前环境湿度的近似值。 例如,假设我们已知在50%湿度下,HR202L的输出电压为2.5V。如果我们读取模拟输入引脚的电压为2V,则可以通过线性插值计算出当前环境湿度的近似值为40%。 最后,我们可以使用计算得到的湿度值进行其他操作,例如在LCD显示屏上显示当前湿度,或者触发警报系统。 需要注意的是,湿敏电阻HR202L的精度可能受到温度和供电电压的影响。为了获得更准确的湿度测量结果,我们可以在程序中考虑校准算法,以校正由于这些因素引起的误差。 总结来说,湿敏电阻HR202L程序的基本步骤包括连接硬件、读取模拟输入电压、计算湿度值,并根据需求进行进一步操作。通过这个程序,我们可以方便地测量周围环境的湿度。
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值