DS18B20是常用的数字温度传感器,其输出的是数字信号,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。
前几天有位朋友让我帮忙写个DS18B20的Arduino驱动程序,忙了一个小时,终于成功了。
对比DS18B20与DHT11,他们的相同点是:都是数字信号,所需IO口都是1,都是温度传感器。但是DS18B20不具备DHT11所具有的湿度测量功能,DS18B20的优点是精度高(比DHT11强的没影),体积小。
好了,话不多说,上代码。
int DSPIN = D4;
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
}
void loop() {
// put your main code here, to run repeatedly:
double temp = TempRead();
temp *= 0.0625;//转换精度为0.0625/LSB
Serial.println(temp);
delay(500);
}
boolean DS18B20_Init()
{
pinMode(DSPIN, OUTPUT);
digitalWrite(DSPIN, HIGH);
delayMicroseconds(5);
digitalWrite(DSPIN, LOW);
delayMicroseconds(750);//480-960
digitalWrite(DSPIN, HIGH);
pinMode(DSPIN, INPUT);
int t = 0;
while(digitalRead(DSPIN))
{
t++;
if(t > 60) return false;
delayMicroseconds(1);
}
t = 480 - t;
pinMode(DSPIN, OUTPUT);
delayMicroseconds(t);
digitalWrite(DSPIN, HIGH);
return true;
}
void DS18B20_Write(byte data)
{
pinMode(DSPIN, OUTPUT);
for(int i=0; i<8; i++)
{
digitalWrite(DSPIN, LOW);
delayMicroseconds(10);
if(data & 1) digitalWrite(DSPIN, HIGH);
else digitalWrite(DSPIN, LOW);
data >>= 1;
delayMicroseconds(50);
digitalWrite(DSPIN, HIGH);
}
}
byte DS18B20_Read()
{
pinMode(DSPIN, OUTPUT);
digitalWrite(DSPIN, HIGH);
delayMicroseconds(2);
byte data = 0;
for(int i=0; i<8; i++)
{
digitalWrite(DSPIN, LOW);
delayMicroseconds(1);
digitalWrite(DSPIN, HIGH);
pinMode(DSPIN, INPUT);
delayMicroseconds(5);
data >>= 1;
if(digitalRead(DSPIN)) data |= 0x80;
delayMicroseconds(55);
pinMode(DSPIN, OUTPUT);
digitalWrite(DSPIN, HIGH);
}
return data;
}
int TempRead()
{
if(!DS18B20_Init()) return 0;
DS18B20_Write(0xCC);//发跳过ROM命令
DS18B20_Write(0x44);//发读开始转换命令
if(!DS18B20_Init()) return 0;
DS18B20_Write(0xCC);//发跳过ROM命令
DS18B20_Write(0xBE);//读寄存器,共九字节,前两字节为转换值
int temp = DS18B20_Read();//低字节
temp |= DS18B20_Read() << 8;//高字节
return temp;
}