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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM