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

在学校里学习时,测量温湿度多用DHT22模块,因为这模块容易上手。但是这个模块很贵,且各DHT22模块温湿度数值不统一还容易坏:手上的几个DHT22湿度误差最大能到20%,温度也会差个1~2℃,且有个别久放之后读到的湿度一直是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此高彼低产生交流方波* @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手册】

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%内。

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

(上面的描述已经很全了,我整理的文件并不比上面多多少,酌情下载)
【硬软、文档】

湿敏电阻CM-R / HR202应用 原理图 IO输出交流 AD采样相关推荐

  1. 单片机IO输出,上拉下拉电阻,图腾柱,线与

    在讲上拉下拉之前先,先讲讲什么是强1强0,高阻态,弱1弱0: 图一 如图可见:所谓强1,就是output直接接到vcc上,这样可以保证output后的器件的高电平识别门限,输出电平逻辑可以保证为1:同 ...

  2. 三态输出门实验报告注意事项_数电基础知识:各种IO输出的类型

    集电极开路(OC) 集电极开路输出的结构如图1所示,右边的那个三极管集电极什么都不接,所以叫做集电极开路:左边的三极管为反相之用,使输入为"0"时,输出也为"0" ...

  3. 32 开漏输出 高电平_关于各种IO输出类型详解

    集电极开路输出的结构如图1所示,右边的那个三极管集电极什么都不接,所以叫做集电极开路;左边的三极管为反相之用,使输入为"0"时,输出也为"0". 对于图 1,当 ...

  4. 设n个整数的集合{1,2,3,,,n},从中取出r个进行排序,输出排序结果一本通P247

    设n个整数的集合{1,2,3,n},从中取出r个进行排序,输出排序结果 #include<iostream> using namespace std; int c[1001],n,r; / ...

  5. R语言高清图片输出设置

    以ggplot2等包为基础的R语言可视化是科研人员非常喜爱的一个方式,不过我也在这个上遇到了些问题.就是导出高分辨率的图片之后,插入到word里,就显得模糊不清(压缩得非常厉害).如果不压缩的话,wo ...

  6. Arduino UNO模拟输入端口(A0-A5)改成数字IO输出使用

    Arduino UNO模拟输入端口(A0-A5)改成数字IO输出使用

  7. Codesys如何控制高创驱动器数字IO输出的通断

    Codesys如何控制高创驱动器数字IO输出的通断 一.首先确保线路接的正确.可以确保通过高创驱动子自身的软件控制数字IO的通断. 二.查找手册. 从下图手册可以看出 第一步1向 60FE sub_i ...

  8. HR202湿敏电阻总结与程序整理

    来源:https://www.amobbs.com/thread-5561786-1-1.html?_dsign=d5a64904 第一部分   来源:https://www.amobbs.com/t ...

  9. 湿敏电阻的原理,结构,分类与应用场景要点总结

      

  10. 湿敏电阻的规格型号和用途总结

      

最新文章

  1. 用“脸”打卡,抬头就能签到!
  2. 30万奖金等你拿,“信也科技杯”第五届数据解决方案应用大赛火热报名中!...
  3. Centos7安装Python3并更改默认版本为python3(编译安装)
  4. (二):集成日志框架:springboot使用logback日志框架
  5. C#多线程使用进度条
  6. BeanFactory和ApplicationContext对比
  7. [每日一题jQuery] jQuery选择器总结:进一步过滤、同级操作、后代操作
  8. Cesium多屏展示
  9. MySQL 基准测试(mysqlslap)出现 Using a password on the command line interface can be insecure 警告
  10. Silverlight 3一瞥
  11. mysql 系统月份_MySQL里求给定的时间是所在月份的第几个星期
  12. ahk写入excel单元格_AHK(二):设置Excel操作快捷键
  13. 4种网游外挂制作方法
  14. 工程师思维(简化版)——聪明人的10个工程思维
  15. cordova 微信支付
  16. 有哪些分体式降噪耳机推荐?最值得入手的分体式降噪耳机
  17. UIView的animateWithDuration动画不执行问题
  18. Linux解压压缩包到同名目录,里面的文件会自动覆盖吗?
  19. Android10 系统应用wifi连接和静态ip代理设置
  20. GSM/GPRS+GPS模块SIM808

热门文章

  1. 【整理】爬取网页数据的方法汇总
  2. 随感10-Transecndence超验骇客
  3. linux bluefish制作网页,基于Linux文本模式的网页编辑器Bluefish
  4. Unity UnityWebRequest从网页加载图片并永久保存在本地
  5. 几何公差(GDT)的特征项目及符号
  6. Java服务端接入苹果内购。实现票据二次校验、自动续期订阅
  7. 除了“造车再创业”,小米还能拼什么?
  8. 使用matplotlib绘制正弦曲线图
  9. 一分钟内搞定!熊猫杀毒软件研发提升扫描速度的技术
  10. Python 基于语法提取音节个数的方法(可能不完美,欢迎指教)