极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 154438|回复: 50

arduino学习笔记11 - 温度传感器实验

  [复制链接]
发表于 2011-7-24 16:17:55 | 显示全部楼层 |阅读模式

通过上一次的实验,我们学会了1602液晶的使用。下面我们做一个简单的温度传感器,通过一个LM35温度传感器读取室温后,使温度显示在1602液晶屏幕上。

上次我们驱动液晶是使用的手工编写代码,这次我们直接使用arduino自带的LiquidCrystal库来进行驱动,此库文件允许arduino控制板控制基于Hitachi HD44780或与之相兼容芯片大部分的液晶,可以工作于4bit或者8bit状态。

下图为我们所使用的arduino的LiquidCrystal库文件位置,只有这里显示的库文件,arduino才可以调用。




什么是温度传感器?

温度传感器就是利用物质随温度变化特性的规律,把温度转换为电量的传感器。按照测量方式可以分为接触式和非接触式两大类,按照传感器材料以及元件特性分为热电阻传感器和热电偶传感器两类。白光烙铁头使用的是热电偶传感器,本次试验使用的LM35是热电阻传感器。

LM35温度传感器实物如下图:




LM35使用非常普遍,他使用内部补偿机制,输出可以从0℃开始。封装为T0992,工作电压4—30V。而且在上述电压范围内,芯片的工作电流不超过60ua。根据产品使用手册,得知LM35传感器的输出电压与摄氏温度呈线性关系,0℃时输出为0V,每升高1℃,输出电压增加10mv。

下图为实验硬件连接方式






代码如下
  1. #include <LiquidCrystal.h>   //调用arduino自带的LiquidCrystal库

  2. LiquidCrystal lcd(12, 11, 5, 4, 3, 2);//设置接口

  3. int potPin = 4;                     //设置模拟口4为LM35的信号输入端口
  4. float temperature = 0;                //设置temperature为浮点变量
  5. long val=0;                       //设置val为长整数变量

  6. void setup()
  7. {
  8.   lcd.begin(16, 2);  //初始化LCD
  9. lcd.print("LM35 Thermometer");  //使屏幕显示文字LM35 Thermometer
  10. delay(1000); //延时1000ms
  11. }

  12. void loop ()                     
  13. {

  14. val = analogRead(potPin);             //val变量为从LM35信号口读取到的数值
  15. temperature = (val*0.0048828125*1000);         //把读取到的val转换为温度数值的10倍
  16. lcd.clear(); //清屏
  17. lcd.print("LM35 Thermometer"); //使屏幕显示文字LM35 Thermometer
  18. lcd.setCursor(0, 1) ; //设置光标位置为第二行第一个位置
  19. lcd.print((long)temperature / 10);   //显示温度整数位
  20. lcd.print(".");    //显示小数点
  21. lcd.print( (long)temperature % 10); //显示温度小数点后一位
  22. lcd.print((char)223); //显示o符号
  23. lcd.print("C"); //显示字母C

  24. delay(2000);                     //延时2秒,这里也就是刷新速度。

  25. }
复制代码

实验效果如下,为了使温度发生变化,用一个装了热水的塑料杯,放在传感器旁边。




关于LiquidCrystal库使用的更详细方法,请查看arduino官方介绍。
http://arduino.cc/en/Reference/LiquidCrystal


附件为LM35的产品说明书


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2011-7-25 14:57:08 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2011-12-19 15:39:33 | 显示全部楼层
val为什么要+1呢,+1就相当于+4.88mV,进而温度+0.488摄氏度。为什么要+1呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-12-19 15:57:16 | 显示全部楼层
树·水·风 发表于 2011-12-19 15:39
val为什么要+1呢,+1就相当于+4.88mV,进而温度+0.488摄氏度。为什么要+1呢?

因为读数是0-1023~~~所以要加1
回复 支持 反对

使用道具 举报

发表于 2011-12-19 16:43:46 | 显示全部楼层
弘毅 发表于 2011-12-19 15:57
因为读数是0-1023~~~所以要加1

还是不明白。val读数是0-1023,当真实温度为0摄氏度时,电压为0V,(根据产品使用手册,得知LM35传感器的输出电压与摄氏温度呈线性关系,0℃时输出为0V,每升高1℃,输出电压增加10mv),即val测得为0,再计算temperature=0就好了啊;
要是+1,外界为0度时,temperature=4.88,最后显示就是0.488摄氏度了,不就不对了吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-12-19 17:39:43 | 显示全部楼层
树·水·风 发表于 2011-12-19 16:43
还是不明白。val读数是0-1023,当真实温度为0摄氏度时,电压为0V,(根据产品使用手册,得知LM35传感器的 ...

{:soso_e154:} 貌似我+1错了。。。。应该直接val就好。。。555555555马上改正
回复 支持 反对

使用道具 举报

发表于 2011-12-19 17:46:12 | 显示全部楼层
想知道LM35受气压和湿度的影响大么?
说明书上的那堆表格实在是没看明白
回复 支持 反对

使用道具 举报

发表于 2012-1-17 07:08:34 | 显示全部楼层
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-1-18 20:31:46 | 显示全部楼层
wing 发表于 2011-12-19 17:46
想知道LM35受气压和湿度的影响大么?
说明书上的那堆表格实在是没看明白

{:soso_e136:} 这个问题。。偶也想知道。。。还没测试过
回复 支持 反对

使用道具 举报

发表于 2012-2-4 18:22:30 | 显示全部楼层
那张示意图使用什么软件画的,感觉很不错的样子啊。
回复 支持 反对

使用道具 举报

发表于 2012-2-5 00:04:06 | 显示全部楼层
本帖最后由 沧海笑1122 于 2012-2-5 00:13 编辑

根据弘毅的教程,在ZZZ和小强的帮助下,测试了温度传感器LM35.给弘毅的教程添砖加瓦。
感谢弘毅、小强、ZZZ等。我从入门一步步学习arduino,从中获得乐趣。
这是一个最简单的LM35测试,没有采用液晶显示器,而是直接将模拟pin读取至串口监视窗。
  1. /*项目名称:LM35温度传感器连接UNO试验
  2. 试验时间:2012-02-04
  3. 元器件:LM-35 DZ模拟传感器一只,正对标示,从左往右,+5V,模拟输出,GND
  4. 连接方法:接好+5V,GND,将LM35的模拟输出接UNO的模拟PIN4
  5. 结果运用 : 使用串口助手读取环境温度:Tep= ** C
  6. 代码原型:弘毅教程--学习笔记11,另外结合网络资源整理

  7. */


  8. int potPin = 4;                     //设置模拟口4为LM35的信号输入端口
  9. float temperature = 0;                //设置temperature为浮点变量
  10. long val=0;                       //设置val为长整数变量

  11. void setup()
  12. {
  13. Serial.begin(9600);//设置波特率
  14. }

  15. void loop ()                     
  16. {
  17.     val=analogRead(potPin);//温度传感器LM35接到模拟PIN4上;val变量为从LM35信号口读取到的数值
  18.    temperature = (val*0.0048828125*100);         //把读取到的val转换为温度数值,系数一:0.00488125=5/1024,0~5V对应模拟口读数1~1024,系数二:100=1000/10,1000是毫伏与伏的转换;10是每10毫伏对应一度温升。
  19.     Serial.print("Tep=  ");
  20.     Serial.print(temperature);
  21.     Serial.println(" C");
  22.     delay(500);//延时500毫秒,这里也就是刷新速度。
  23.                  

  24. }      
复制代码
附件就是我的串口助手显示的卧室室温。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2012-2-5 00:23:56 | 显示全部楼层
房子温度达标了
回复 支持 反对

使用道具 举报

发表于 2012-5-10 16:41:56 | 显示全部楼层
代码注释的很详细
回复 支持 反对

使用道具 举报

发表于 2012-5-10 16:42:36 | 显示全部楼层
代码注释的很详细
回复 支持 反对

使用道具 举报

发表于 2012-9-21 20:29:05 | 显示全部楼层
也发一个我的程序,可以直接显示小数点后两位的的温度,另外如何把程序发上来的时候和楼主一样呢?
  1. #include <LiquidCrystal.h>

  2. LiquidCrystal lcd(8,13, 9, 4, 5, 6, 7);


  3. void setup()
  4. {
  5.   lcd.clear();
  6.   lcd.begin(16, 2);


  7. }

  8. void loop()

  9. {  
  10.   int n = analogRead(A1);
  11.   float vol = n * (5.0 / 1023.0*100);
  12.   lcd.setCursor(0,0);
  13.   lcd.print("temp inspecter");
  14.   lcd.setCursor(0,17);
  15.   lcd.print("temp:");
  16.   lcd.print(vol);
  17.   lcd.print(" C");
  18.   delay(3000);
  19.   lcd.clear();
  20. }
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-19 04:22 , Processed in 0.062331 second(s), 30 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表