您的位置:

Arduino DS18B20温度传感器

一、介绍

DS18B20温度传感器是一种数字温度传感器,控制协议简单,数据稳定可靠,而且价格低廉,非常适合用于单片机控制系统中。

DS18B20采用单总线结构,只需要三根引脚即可完成通讯。它可以工作在-55℃至125℃的温度范围内,并提供了9至12位分辨率。此外, DS18B20还可以通过使用外部供电提高精度。

二、DS18B20的接线

DS18B20只需要三根线(DQ, GND, VCC)即可完成与单片机的连接。

DQ - 连接到单片机的任意IO口,用于数据的传输

GND - 连接到单片机的 GND

VCC - 连接到单片机的 VCC

              +---------+ 
              |         |
              |        VCC --------------- 3.3V - 5V
              |         |
              |        GND --------------- GND
              |         |
              |         |
DQ ------------+         +--------------- 

三、使用DS18B20进行温度测量

DS18B20通过一次性写入指令来启动温度测量,并通过读取传感器的数据进行温度的计算。以下是使用DS18B20进行温度测量的基本步骤:

1、复位信号线:

void reset() {
  digitalWrite(DQ, LOW);
  delayMicroseconds(480);
  pinMode(DQ, INPUT);
  delayMicroseconds(60);
  
  int presence = digitalRead(DQ);
  delayMicroseconds(420);
}

2、向DS18B20发送写入指令以启动温度测量:

void writeBit(uint8_t bit) {
  pinMode(DQ, OUTPUT);
  digitalWrite(DQ, LOW);
  delayMicroseconds(5);
  digitalWrite(DQ, bit);
  delayMicroseconds(60);
  pinMode(DQ, INPUT);
}

void writeByte(uint8_t byte) {
  for (uint8_t i=0; i<8; i++) {
    writeBit(byte & 1);
    byte >>= 1;
  }
}

void startConversion() {
  reset();
  writeByte(0xCC);  // Skip ROM command 
  writeByte(0x44);  // Start Conversion
}

3、读取DS18B20返回的数据:

void readBit(uint8_t& bit) {
  pinMode(DQ, OUTPUT);
  digitalWrite(DQ, LOW);
  delayMicroseconds(1);
  pinMode(DQ, INPUT);
  delayMicroseconds(14);
  bit = digitalRead(DQ);
  delayMicroseconds(45);
}

uint8_t readByte() {
  uint8_t byte = 0;
  for (uint8_t i=0; i<8; i++) {
    uint8_t bit;
    readBit(bit);
    byte |= (bit << i);
  }
  return byte;
}

void readScratchpad(uint8_t* scratchpad) {
  reset();
  writeByte(0xCC);  // Skip ROM command 
  writeByte(0xBE);  // Read Scratchpad 

  for (uint8_t i=0; i<9; i++) {
    scratchpad[i] = readByte();
  }
}

4、将DS18B20返回的数据进行温度计算:

float readTemperature() {
  startConversion();
  delay(750);

  uint8_t scratchpad[9];
  readScratchpad(scratchpad);

  int16_t raw = scratchpad[0] | (scratchpad[1] << 8);
  float temp = (float)raw / 16.0;
  return temp;
}

四、示例代码

下面是一个简单的示例程序,用于读取DS18B20的温度值并将其打印到串口:

#include <OneWire.h>

OneWire ds(DQ);

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

void loop() {
  float temp = readTemperature();
  Serial.print("Temperature: ");
  Serial.print(temp, 1);
  Serial.println("C");
  
  delay(1000);
}

void reset() {
  //...
}

void writeBit(uint8_t bit) {
  //...
}

void writeByte(uint8_t byte) {
  //...
}

void startConversion() {
  //...
}

void readBit(uint8_t& bit) {
  //...
}

uint8_t readByte() {
  //...
}

void readScratchpad(uint8_t* scratchpad) {
  //...
}

float readTemperature() {
  //...
}