欢迎光临
我们一直在努力

线性温度传感器DS18b20 示例教程 适用于Arduino平台

1. 产品图片

2. 产品购买地址点我购买

3. 产品概述
DSl820 数字温度计提供 9 位(二进制)温度读数 指示器件的温度 信息经过单线接口送入 DSl820 或从 DSl820 送出 因此从主机 CPU 到 DSl820 仅需一条线(和地线) DSl820 的电源可以由数据线本身提供而不需要外部电源 因为每一个 DSl820 在出厂时已经给定了唯一的序号 因此任意多个 DSl820 可以存放在同一条单线总线上 这允许在许多不同的地方放置温度敏感器件 DSl820 的测量范围从-55 到+125 增量值为 0.5 可在 l s(典型值)内把温度变换成数字每一个 DSl820 包括一个唯一的 64 位长的序号 该序号值存放在 DSl820 内部的 ROM(只读存贮器)中 开始8 位是产品类型编码(DSl820 编码均为 10H) 接着的 48位是每个器件唯一的序号 最后 8 位是前面 56 位的CRC(循环余校验)码 DSl820 中还有用于贮存测得的温度值的两个 8 位存贮器 RAM 编号为 0 号和 1号 1 号存贮器存放温度值的符号 如果温度为负( )则 1 号存贮器 8 位全为 1 否则全为 0 0 号存贮器用于存放温度值的补码 LSB(最低位)的 1 表示 0.5 将存贮器中的二进制数求补再转换成十进制数并除以将存贮器中的二进制数求补再转换成十进制数并除以 2 就得到被测温度值就得到被测温度值(-550 125 ) DSl820 的引脚 每只 D51820 都可以设置两种供电方式 即数据总线供电方式和外部供电方式 采取数据总线供电方式可以节省一根导线 但完成温度测量。

4. 产品参数
①、 独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。
② 、测温范围 -55℃到+125℃,固有测温误差(注意,不是分辨率,这里之前是错误的)1℃。
③、支持多点组网功能,多个DS18B20可以并联在唯一的三线上,最多只能并联8个,实现多点测温,如果数量过多,会使供电电源电压过低,从而造成信号传输的不稳定。
④、工作电源: 3.0-5.5V/DC (可以数据线寄生电源)
⑤ 、在使用中不需要任何外围元件
⑥、 测量结果以9-12位数字量方式串行传送
⑦ 、不锈钢保护管直径 Φ6
⑧ 、适用于DN15-25, DN40-DN250各种介质工业管道和狭小空间设备测温
⑨、 标准安装螺纹 M10X1, M12X1.5, G1/2”任选
⑩ 、PVC电缆直接出线或德式球型接线盒出线,便于与其它电器设备连接。

DS18B20温度传感器跟我们前节所讲的输出1或者0的数字传感器有些不同,DS18B20作为一个IC类型的数字传感器,使用它就必须满足它的条件,在数字电路里面,控制芯片的时序就能正常操作芯片。DS18B20是单总线控制通信,也就是控制信号在一根线上来回传输。单总线(One-Wrie)是 Dallas公司的一项特有的总线技术,它才用信号线实现数据的双向传输,具有节省I/O口资源、结构简单、便于扩展和维护等优点。
单总线的结构是怎么样的呢,由于单总线使用一根信号线进行双向的数据传输,所以在总线上的每个节点都必须是漏极和集电极开路的,这样设备在不发送数据的时候将释放数据总线,以便其他设备使用总线。单总线要求在外接一个5K的上拉电阻以保证总线在闲置状态下为高电平,无论是什么原因,如果在传输过程中需要暂时挂起,且要求传输过程中还能继续,则总线必须处于空闲状态。在传输之间的回复时间没有限制,只要总线在恢复时期处于空闲状态。如果总线保持低电平保持 480us,总线上所有的器件将复位。
单总线的控制方式,在系统中,主机对从机的控制操作可分3步:
第一步: 初始化 初始化的过程是由主机发出的复位信脉冲和从机响应的应答脉冲组成,应答脉冲使主机知道总线上有从机设备去,且准备就绪。
第二步: ROM指令 单总线器件内部有一个64bit的只读存取区(ROM),ROM中的数据是唯一的,用以在总线中区分不同节点。其中前八位是单线系类编码(比如 DS18B20的编码是19H),接下来是48bit是器件唯一的系列号,最后8bit是以56bit数据的CRC校验码。ROM指令的目的是使主机指定某个从机设备获取总线上有多少从机设备机器设备类型。
第三步: 操作指令 在主机指定某个从机之后,接着就发送操作指令对器件进行控制,不同类型的单总线器件机器操作指令可能会有一些差异。
程序的设计上,我们要运用OneWrie库,将压缩文件解压到libraries文件里即可。
单独使用OneWrie库函数来试验。

5. 接线方式

接线方式:VD和GND引脚分别接Arduino 5V和GND,DQ接Arduino PIN 10. 其中接的电阻为10K。
(温湿度传感器模块上已经内置有上拉电阻了,无需再接电阻)

6. 示例程序

//中贝斯特UltiRobot温度传感器DS18B20模块示例教程
//程序效果:将上述程序复制至Arduino ide,并上传到板子里,实现温度测控。
//淘宝店地址:zhongbest.taobao.com
//专业Arduino资料网站:www.arduino365.com
#include <OneWire.h>

OneWire  ds(10);  // 连接arduino10引脚

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

void loop(void) {
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius, fahrenheit;

  if ( !ds.search(addr)) {
    Serial.println("No more addresses.");
    Serial.println();
    ds.reset_search();
    delay(250);
    return;
  }

  Serial.print("ROM =");
  for( i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(addr[i], HEX);
  }

  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return;
  }
  Serial.println();

  // the first ROM byte indicates which chip
  switch (addr[0]) {
    case 0x10:
      Serial.println("  Chip = DS18S20");  // or old DS1820
      type_s = 1;
      break;
    case 0x28:
      Serial.println("  Chip = DS18B20");
      type_s = 0;
      break;
    case 0x22:
      Serial.println("  Chip = DS1822");
      type_s = 0;
      break;
    default:
      Serial.println("Device is not a DS18x20 family device.");
      return;
  } 

  ds.reset();
  ds.select(addr);
  ds.write(0x44,1);         // start conversion, with parasite power on at the end

  delay(1000);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.

  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // Read Scratchpad

  Serial.print("  Data = ");
  Serial.print(present,HEX);
  Serial.print(" ");
  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
    Serial.print(data[i], HEX);
    Serial.print(" ");
  }
  Serial.print(" CRC=");
  Serial.print(OneWire::crc8(data, 8), HEX);
  Serial.println();

  // convert the data to actual temperature

  unsigned int raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // count remain gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    if (cfg == 0x00) raw = raw << 3;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw << 2; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw << 1; // 11 bit res, 375 ms
    // default is 12 bit resolution, 750 ms conversion time
  }
  celsius = (float)raw / 16.0;
  fahrenheit = celsius * 1.8 + 32.0;
  Serial.print("  Temperature = ");
  Serial.print(celsius);
  Serial.print(" Celsius, ");   
  Serial.print(fahrenheit);
  Serial.println(" Fahrenheit");
}

7. 相关下载
百度网盘:点我下载

未经允许不得转载:Arduino-Maker » 线性温度传感器DS18b20 示例教程 适用于Arduino平台

支付宝扫码打赏 微信打赏

原创文章,若帮到您,欢迎打赏

分享到:更多 ()

评论 抢沙发

评论前必须登录!

 

线上商城

中贝斯特创客空间蘑菇云创客教育