查看: 14206|回复: 11

NTC 热敏电阻测温 解决LM35温度漂移的问题

[复制链接]
  • TA的每日心情
    开心
    2018-9-20 15:06
  • 签到天数: 279 天

    [LV.8]以坛为家I

    发表于 2017-3-4 16:30 | 显示全部楼层 |阅读模式
    本帖最后由 sun910231 于 2017-4-1 16:30 编辑

    众所周知,使用ARDUINO,用LM35做温度传感器因为参考电压的问题,LM35输出的电压漂移很大,十分不准确~
    我们在实际生活中家用电器或者一些室内温度检测装置很少用LM35,一般都用的是玻封的NTC电阻,使用时有的外面包裹一层环氧,或者好一些的加个金属外壳,实际上这个NTC电阻的成本比LM35低很多,而且精度很高,主要是在温度不同时,阻值变化很大,有兴趣的可以到网上找规格书去看一看,但是,实际使用时,阻值变化也不是线性的,计算相当复杂,今天我自己计算这东西时间超过一个小时,主要是数学的玩意都差不多还给老师了,涉及到解方程和对数运算,有点麻烦:
    电阻变化计算公式:Rt= R1*EXP(B*(1/(273.15+Tt)-1/(273.15+T1)))  我自己程式中用的是R1=50K(T1=25摄氏度) B=4150,所以电阻为:Rt=50*EXP(4150*(1/(273.15+Tt)-1/(273.15+25)))    ,经过方程变换解出:Tt=1/((ln(Rt/50))/4150+1/298.15)-273.15 因为测试传感输入的ARDUINO模拟输入口只能读取电压值,所以,使用一个51K的分压电阻串在NTC上,两端供电用ARDUINO的板载5V,NTC和电阻之间用抽头接到ARDUINO的模拟输入脚,读取NTC两端的电压,根据分压公式Vt=5*Rt/(Rt+Ra)  (Ra=51K),所以,Vt=5*Rt/(Rt+51)        简化方程组,计算出Tt=1/((ln(51*Vt/(5-Vt)/50))/4150+1/298.15)-273.15  将计算出的温度用串口助手打印出来;程序如下:




    [kenrobot_code]/**
    * 日期: 2017/03/04
    * 作者:sun910231
    * 描述: NTC环境温度测试
    */

    int ntc = A0;
    void setup()
    {
      // 初始化串口通信
      Serial.begin(9600);
    }

    void loop()
    {
      float hq = 5.2*(analogRead(ntc))/1024 ;// 读取传感器模拟值
    float x=51 * hq/(5.0 - hq);//计算当前的电阻值
    float hs= log(x/50);//计算NTC对应阻值的对数值
    float temp = 1/( hs/4150+1/298.15)-273.15;//计算当前的温度值


      
      // 将温度输出至串口显示
      Serial.print("temperature   " );                       
      Serial.print(temp);           
      Serial.println(" C");  
       
      delay(1000);                     
    }[/kenrobot_code]
    NTC2.jpg
    ntc.jpg
    N3.jpg
    请无视上图面包板上的二极管


    如果选用不同的NTC电阻,只要根据规格书上的特性温度的R值,温度以及B值直接代人公式,正确连接电路,基本一次就成,温度显示稳定,也可以用LCD屏做成室内温度计;

    注:程式中用的5.2,是我将NTC用外接电源供电,测试电源电压为5.2V,板上的电压是5V,为了准确,方程式里面的数值有些调整
  • TA的每日心情
    开心
    2018-9-20 15:06
  • 签到天数: 279 天

    [LV.8]以坛为家I

     楼主| 发表于 2017-3-4 17:24 | 显示全部楼层
    02.jpg

    加了1602 LCD显示 温度

    [kenrobot_code]/**
    * 日期: 2017/03/04
    * 作者: sun910231
    * 描述: NTC测试环境温度+ 1602LCD温度显示
    */

    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>
    LiquidCrystal_I2C lcd(0x27,16,2);

    int ntc = A0;


    void setup()
    {
       lcd.init();                      // initialize the lcd
       lcd.init();   
      
      // 初始化串口通信
      Serial.begin(9600);
    }

    void loop()
    {
    float hq = 5.2*(analogRead(ntc))/1024 ;
      // 读取传感器模拟值

    float x=51 * hq/(5.0 - hq);//计算当前的电阻值
    float hs= log(x/50);//计算NTC对应阻值的对数值
    float temp = 1/( hs/4150+1/298.15)-273.15;//计算当前的温度值


      
      // 将温度输出至串口显示
      Serial.print("temperature   " );                       
      Serial.print(temp);           
      Serial.println(" C");   
      
      lcd.setCursor(0,0);
      lcd.print("Temp   ");
      lcd.print(temp);
      lcd.print(" C ");
      
      lcd.setCursor(2,1);
       lcd.print("Hello Arduino!");
       
      delay(1000);                     
    }
    [/kenrobot_code]
  • TA的每日心情
    开心
    2020-9-8 03:22
  • 签到天数: 1174 天

    [LV.10]以坛为家III

    发表于 2018-6-8 19:04 来自手机 | 显示全部楼层
    不错,学习的好实例
  • TA的每日心情

    2018-8-29 09:38
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    发表于 2018-7-30 10:40 | 显示全部楼层
    大神真牛,太解决问题了
  • TA的每日心情

    2018-9-4 15:16
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    发表于 2018-8-27 19:15 | 显示全部楼层
    学习了,非常有用的例子

    该用户从未签到

    发表于 2019-3-25 10:21 来自手机 | 显示全部楼层
    只能说干得漂亮

    该用户从未签到

    发表于 2019-11-25 22:39 | 显示全部楼层
    你好请问电路图怎么接?
  • TA的每日心情
    开心
    2018-9-20 15:06
  • 签到天数: 279 天

    [LV.8]以坛为家I

     楼主| 发表于 2019-12-25 13:04 | 显示全部楼层
    倾听唯美 发表于 2019-11-25 22:39
    你好请问电路图怎么接?

    帖子里有连接图
  • TA的每日心情
    奋斗
    2020-11-16 17:21
  • 签到天数: 92 天

    [LV.6]常住居民II

    发表于 2020-1-2 10:37 | 显示全部楼层
    感谢楼主分享,开拓了一个新的思路。

    该用户从未签到

    发表于 2020-10-8 10:06 | 显示全部楼层
    楼主您好,请问下公式中的273.15是怎么来的呀
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    热门推荐

    【创客入门偏方】一起来造六轴机械臂(三) 配件收集篇
    【创客入门偏方】一起来造
    【创客入门偏方】一起来造六轴机械臂(二) 3D打印篇
    【创客入门偏方】一起来造
    【创客入门偏方】一起来造机械臂(一) 项目介绍篇
    【创客入门偏方】一起来造
    使用lcd屏幕和ds18b20测温度时程序编译错误
    使用lcd屏幕和ds18b20测温
    希望有大佬帮助一下刚入门的小萌新,真心求教!
    【Arduino】108种传感器模块系列实验(资料+代码+图形+仿真)
    【Arduino】108种传感器模
    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
    快速回复 返回顶部 返回列表