mybag1 发表于 2013-10-29 22:15:47

arduino+DS18B20制作感温杯为何温度是逐渐上升?

根据坛子里各位大牛的方法,学着用arduino+DS18B20制作感温杯,但当把感温传感器DS18B20放入水杯时,温度不是一下达到水温,而是逐渐升上去的,这是为什么?这样感觉要过一段时间才能真正测出水杯里水的实际温度,如何能直接显示出实际温度?
我把我的具体做法列出来,请各位指导一下:

1、设计思路

      由于没有多种颜色的LED灯进行实验,因此本实验使用三个LED灯,用亮灯的个数来表示水温。当水温高于41度时,三个灯同时亮起,表示温度过高;当水温界于31度与40度之间,两个灯亮起,表示水温刚好;当水温低于31底时,一个灯亮起,表示水温过低。

2、硬件连接图



3、代码
#include <LiquidCrystal.h>
#include <DallasTemperature.h>
#include <OneWire.h>
#define ONE_WIRE_BUS 8
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);//设置接口
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
   
void setup(void)
{
    pinMode(6,OUTPUT);
    pinMode(7,OUTPUT);
    pinMode(9,OUTPUT);
    lcd.begin(16, 2);//初始化LCD
    delay(1000); //延时1000ms
    sensors.begin();
}
   
void loop(void)
{
    sensors.requestTemperatures();
    if (sensors.getTempCByIndex(0)<=31.00)
    {
   digitalWrite(6,HIGH);
   digitalWrite(7,LOW);
   digitalWrite(9,LOW);
    }
    else if (sensors.getTempCByIndex(0)>31.00 && sensors.getTempCByIndex(0)<=41.00)
    {
   digitalWrite(6,HIGH);
   digitalWrite(7,HIGH);
   digitalWrite(9,LOW);
    }
    else
    {
   digitalWrite(6,HIGH);
   digitalWrite(7,HIGH);
   digitalWrite(9,HIGH);      
    }
   
    lcd.clear(); //清屏
    lcd.setCursor(0,0);
    lcd.print("Local Temperature");
    lcd.setCursor(0, 1) ; //设置光标位置为第二行第一个位置
    lcd.print(" is ");
    lcd.setCursor(5, 1) ;
    lcd.print( sensors.getTempCByIndex(0)); //显示温度小数点后一位
//delay(1000);
    lcd.print((char)223); //显示o符号
    lcd.print("C"); //显示字母C
    delay(2000);
   
}

4、视频效果
http://player.youku.com/player.php/sid/XNjI3OTM2MDY0/v.swf

由于本人视频录制水平有限,所以在录制过程中效果体现的不是很明显。主要问题就是温度上升和下降的速度比较慢,如何能上其瞬间测量出实际温度,请各位给指导一下。谢谢

chaqing 发表于 2013-10-29 22:58:13

个人理解,温度测试都是如此吧?除非红外测温等方式,都需要个周期吧?

迷你强 发表于 2013-10-30 08:37:36

:lol热量传导的过程

pww999 发表于 2013-10-30 11:36:35

本帖最后由 pww999 于 2013-10-30 11:47 编辑

delay(200); //延时200ms

这样行吗?   至于温度变化速度楼上的说了

huan 发表于 2013-10-30 13:02:18

瞬间检测是不可能的,除非和上面的朋友说的用红外线检测,电子体温计测体温一般都要1分钟左右

mybag1 发表于 2013-10-30 14:50:23

:)哦,明白了

dengxbin 发表于 2013-10-30 17:29:49

DS78B20有好几种分辨率,在12位条件下,转换时间大约要750MS

惠普彩色打印机 发表于 2013-10-30 21:43:26

pww999 发表于 2013-10-30 11:36 static/image/common/back.gif
delay(200); //延时200ms

这样行吗?   至于温度变化速度楼上的说了

延时200ms只是显示延时呀,不是检测延时

x852770 发表于 2014-5-8 15:56:11

不好意思請問一下前輩!

我假如要用2顆DS18B20顯示兩個溫度! 接兩個接口可行嗎!不想集成一線!!有辦法嗎!

謝謝~~~!

x852770 发表于 2014-5-11 20:10:01

x852770 发表于 2014-5-8 15:56 static/image/common/back.gif
不好意思請問一下前輩!

我假如要用2顆DS18B20顯示兩個溫度! 接兩個接口可行嗎!不想集成一線!!有辦法嗎!
...

S大~可否在請教一下
#include <LiquidCrystal_I2C.h>
#include <DallasTemperature.h>
#include <OneWire.h>
#include <Wire.h>
int potPin = 0;
LiquidCrystal_I2C lcd(0x27,16,2);
#define ONE_WIRE_BUS 8<<<<<只這邊在定義一次嗎??還是有些不懂耶!不好意思><
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

void setup(void)
{
   
   Serial.begin(115200);
   Serial.println("Temperature Sensor");

    pinMode(6,OUTPUT);
    pinMode(7,OUTPUT);
    pinMode(9,OUTPUT);
    sensors.begin();
   lcd.init();
}

void loop(void)
{
    sensors.requestTemperatures();
   
   if (sensors.getTempCByIndex(0)>=1.00)
   {
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print(sensors.getTempCByIndex(0)); //显示温度小数点后一位
//delay(1000);
lcd.print((char)223); //显示o符号
lcd.print("C"); //显示字母C
delay(500);//延时0.5 秒
   }
    if (sensors.getTempCByIndex(0)<=31.00)
    {
   digitalWrite(6,HIGH);
   digitalWrite(7,HIGH);
   digitalWrite(9,HIGH);
    }
    else if (sensors.getTempCByIndex(0)>31.00 && sensors.getTempCByIndex(0)<=41.00)
    {
   digitalWrite(6,LOW);
   digitalWrite(7,LOW);
   digitalWrite(9,LOW);
    }
   
delay(500);//延时0.5 秒
}
页: [1]
查看完整版本: arduino+DS18B20制作感温杯为何温度是逐渐上升?