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

