Arduino_DS18B20

库教程

 

1. DS18B20介绍

DS18B20是常用的数字温度传感器,使用集成芯片,采用单总线技术,能够有效的减小外界的干扰,提高测量的精度。其输出的是数字信号,接线非常方便,封装成不同方式可以应用于不同场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式。

 

 

主要特点:

采用单总线的接口方式。只需要一条数据线就能双向通讯。
测量范围宽,精度高。其测量范围为-55℃ — +125℃ ,在-10—+85℃ 范围内,精度为±0.5℃ 。
多点组网功能。多个DS18B20可以并联在惟一的三线上,实现多点测温。
供电方式灵活。可通过内部寄生电路从数据线上获取电源。
测量参数可配置。DS18B20的测量分辨率可通过程序设定9—12位。
掉电保护功能。内部含有EEPROM,在系统掉电以后,仍可保存分辨率及报警温度的设定值。

 


2. 实验材料
Due开发板
配套USB数据线
面包板及配套连接线
DS18B20
10K直插电阻
3. 安装库
本实验用到两个库,分别为「OneWire」和「DallasTemperature」,前者是单总线库,后者是在前者基础上针对Dallas温度传感器封装的库。

在IDE中点击「Tools」—「加载库」—「管理库」,查找「OneWire」,选择最新版本进行安装。目前最新版本为2.3.4。


查找「DallasTemperature」,选择最新版本进行安装。目前最新版本为3.8.0。


4. 实验步骤

线路连接非常简单,DS18B20的VCC、DQ、GND分别连接到开发板的5V、4、GND。10K电阻一段连接VCC,另一端连接DQ,上拉电阻用于提高I/O口的驱动能力。

#include <DallasTemperature.h>

#include <OneWire.h>
#define ONE_WIRE_BUS 4
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

void setup() {
  Serial.begin(9600);
  sensors.begin();
}

void loop() {
  
  sensors.requestTemperatures();
  float tep = sensors.getTempCByIndex(0);
  Serial.print("Temperature for the device :");
  Serial.println(tep);
  delay(2000);
} 

 不使用Arduino库

int DS18B20DQ = 4;
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}

void loop() {
  float t;
  t= Ds18b20GetTemp();
  Serial.print("The temperature is :");
  Serial.println(t);
  delay(2000);
  /*byte TH=0,TL=0;  debug的时候为了调试方便
   Ds18b20Rst();
   Serial.println( Ds18b20Check());
   Ds18b20WriteByte(0XCC);
   Ds18b20WriteByte(0X44);
   delay(10);
   Ds18b20Rst();
   Ds18b20Check();
   Ds18b20WriteByte(0XCC);//skip rom
   Ds18b20WriteByte(0XBE);//read,start form the 0 byte,LSB forst
   TL=Ds18b20ReadByte();//LSB
   TH=Ds18b20ReadByte();//MSB
   Serial.println(TH);
   Serial.println(TL);
   if(TH>7)
   {
       TH=~TH;
       TL=~TL;
       temp=0;//the temperature is negative
    }
    else temp=1;// the temperature is positive
    tem=TH;//高八位
    tem<<=8;
    Serial.println(tem);
    delay(1000); 
    tem+=TL;//低八位
    Serial.println(tem);
    delay(1000);
   t=((float)tem*0.0625);
    Serial.println(t);
    delay(1000);
    */
}

void Ds18b20Rst(void)
{
     pinMode(DS18B20DQ,OUTPUT);
     digitalWrite(DS18B20DQ,LOW);
     delayMicroseconds(750);//主机发送复位脉冲480us-960us
     digitalWrite(DS18B20DQ,HIGH);
     delayMicroseconds(15);//18b20等待15-60us   
}

/*等待18b20响应
 * 返回1:未检测到18b20
 * 返回0:存在
 */
byte Ds18b20Check()
{  
   byte retry=0;
   pinMode(DS18B20DQ,INPUT);
   while(digitalRead(DS18B20DQ)&&retry<200)
       {   retry++;
           delayMicroseconds(1);
         }
   if(retry>=200)return 1;
   else retry=0;
   while(!digitalRead(DS18B20DQ)&&retry<240) 
   {
       retry++;
       delayMicroseconds(1);
    }  
    if(retry>240)return 1;
    return 0;    
  }
/*从18b20读取一个位
 * 返回值1/0
 */
byte Ds18b20ReadBit(void)
{
     byte data;
     pinMode(DS18B20DQ,OUTPUT);
     digitalWrite(DS18B20DQ,LOW);
     delayMicroseconds(2);
     digitalWrite(DS18B20DQ,HIGH);
     pinMode(DS18B20DQ,INPUT);
     delayMicroseconds(12);
     if(digitalRead(DS18B20DQ))data=1;
     else data=0;
     delayMicroseconds(50);
     return data;
  }
/*从18b20读取一个字节
 * 返回值:读到的数据
 */
byte Ds18b20ReadByte(void)
{
    byte i,j,dat;
    dat=0;
    for(i=1;i<=8;i++)
    {
        j=Ds18b20ReadBit();
        dat=(j<<7)|(dat>>1);//低位在前
      }
    return dat;
  }
/*写一个字节到Ds18b20
 * dat:要写入的字节
 */



 
void Ds18b20WriteByte(byte dat)
{  
   byte i;
   byte temp;
   pinMode(DS18B20DQ,OUTPUT);
   for(i=1;i<=8;i++)
   {
      temp=dat&0x01;
      dat=dat>>1;
      if (temp)//write 1
      {
          digitalWrite(DS18B20DQ,LOW);
          delayMicroseconds(2);  
          digitalWrite(DS18B20DQ,HIGH);
          delayMicroseconds(60);  
        }
       else
       {
          digitalWrite(DS18B20DQ,LOW);
          delayMicroseconds(60);  
          digitalWrite(DS18B20DQ,HIGH);
          delayMicroseconds(2);  
        }
    } 
  }

/*开始温度转换
 * 
 */
void Ds18b20Start(void)
{
   Ds18b20Rst();
   Ds18b20Check();
   Ds18b20WriteByte(0XCC);
   Ds18b20WriteByte(0X44);
 }
/*从Ds18b20得到温度值
 * 精度0.1c
 * 返回值:温度值(-550-1250)
 */
float Ds18b20GetTemp()
{
   byte temp;
   byte TH=0,TL=0;
   short tem;
   float t;
   Ds18b20Start();
   Ds18b20Rst();
   Ds18b20Check();
   Ds18b20WriteByte(0XCC);//skip rom
   Ds18b20WriteByte(0XBE);//read,start form the 0 byte,LSB forst
   TL=Ds18b20ReadByte();//LSB
   TH=Ds18b20ReadByte();//MSB
   //Serial.println(TH);
   //Serial.println(TL);
   if(TH>7)
   {
       TH=~TH;
       TL=~TL;
       temp=0;//the temperature is negative
    }
    else temp=1;// the temperature is positive
    tem=TH;//高八位
    tem<<=8;
    tem+=TL;//低八位
    t=((float)tem*0.0625);
    if(temp)return t;
    else return -t;
  }

 

DS18B20通信图,测试平台Arduino Due

 

posted @ 2022-01-22 15:08  xiaoberber  阅读(1641)  评论(0编辑  收藏  举报