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