zoukankan      html  css  js  c++  java
  • OneWire应用 单总线温度传感器DS18系列

    OneWire DS18S20, DS18B20, DS1822 Temperature

    DS18B20

    The DS18B20 digital thermometer provides 9-bit to 12-bit Celsius temperature measurements and has an alarm function with nonvolatile user programmable upper and lower trigger points. The DS18B20 communicates over a 1-Wire bus that by definition requires only one data line (and ground) for communication with a central microprocessor. It has an operating temperature range of -55°C to +125°C and is accurate to ±0.5°C over the range of -10°C to +85°C. In addition, the DS18B20 can derive power directly from the data line (“parasite power”), eliminating the need for an external power supply.  分辨率9-12位,可设置报警,适用于1-Wire 总线,测量温度-55-125摄氏度
    Each DS18B20 has a unique 64-bit serial code, which allows multiple DS18B20s to function on the same 1-Wire bus. Thus, it is simple to use one microprocessor to control many DS18B20s distributed over a large area. Applications that can benefit from this feature include HVAC environmental controls, temperature monitoring systems inside buildings, equipment, or machinery, and process monitoring and control systems.  一个控制器可连接多个传感器,可应用于许多领域

    FEATURES 特点
    § Unique 1-Wire® Interface Requires Only One Port Pin for Communication
    § Each Device has a Unique 64-Bit Serial Code Stored in an On-Board ROM
    § Multidrop Capability Simplifies Distributed Temperature-Sensing Applications
    § Requires No External Components
    § Can Be Powered from Data Line; Power Supply Range is 3.0V to 5.5V
    § Measures Temperatures from -55°C to +125°C (-67°F to +257°F)
    § ±0.5°C Accuracy from -10°C to +85°C
    § Thermometer Resolution is User Selectable from 9 to 12 Bits
    § Converts Temperature to 12-Bit Digital Word in 750ms (Max)

     

     64-BIT LASERED ROM CODE   64位光刻ROM编码
    Each DS18B20 contains a unique 64–bit code (see Figure 6) stored in ROM. The least significant 8 bits of the ROM code contain the DS18B20’s 1-Wire family code: 28h(8位家族编码). The next 48 bits contain a unique serial number(48位序列码). The most significant 8 bits contain a cyclic redundancy check (CRC) byte that is calculated from the first 56 bits of the ROM code(8位冗余检验码). A detailed explanation of the CRC bits is provided in the CRC Generation section. The 64-bit ROM code and associated ROM function control logic allow the DS18B20 to operate as a 1-Wire device using the protocol detailed in the 1-Wire Bus System section.
    Figure 6. 64-Bit Lasered ROM Code

      

    示例程序

      1 #include <OneWire.h>
      2 
      3                                                                                              
      4 
      5 // OneWire DS18S20, DS18B20, DS1822 Temperature Example
      6 
      7 //
      8 
      9 // http://www.pjrc.com/teensy/td_libs_OneWire.html
     10 
     11 //
     12 
     13 // The DallasTemperature library can do all this work for you!
     14 
     15 // http://milesburton.com/Dallas_Temperature_Control_Library
     16 
     17  
     18 
     19 OneWire  ds(10);   // on pin 10,定义单总线设备ds,连接于10号引脚
     20 
     21  
     22 
     23 void setup(void)
     24 
     25 {
     26 
     27   Serial.begin(9600);
     28 
     29 }
     30 
     31  
     32 
     33 void loop(void) 
     34 
     35 {
     36 
     37   byte i;
     38 
     39   byte present = 0;
     40 
     41   byte type_s;
     42 
     43   byte data[12];
     44 
     45   byte addr[8];     //传感器的ROM,共8个字节的数据,64位
     46 
     47   float celsius, fahrenheit;
     48 
     49   
     50 
     51   if ( !ds.search(addr))    //查询不到ds就一直查询
     52 
     53 {
     54 
     55     Serial.println("No more addresses.");
     56 
     57     Serial.println();
     58 
     59     ds.reset_search();
     60 
     61     delay(250);
     62 
     63     return;
     64 
     65   }
     66 
     67   
     68 
     69   Serial.print("ROM =");    //查询到则显示ds的地址
     70 
     71   for( i = 0; i < 8; i++)
     72 
     73 {
     74 
     75     Serial.write(' ');
     76 
     77     Serial.print(addr[i], HEX);
     78 
     79   }
     80 
     81  
     82 
     83   if (OneWire::crc8(addr, 7) != addr[7])  // CRC检验失败的情况
     84 
     85 {
     86 
     87       Serial.println("CRC is not valid!");
     88 
     89       return;
     90 
     91   }
     92 
     93   Serial.println();
     94 
     95  
     96 
     97   // the first ROM byte indicates which chip ,根据addr[0]决定DS18系列的型号
     98 
     99   switch (addr[0]) 
    100 
    101 {
    102 
    103     case 0x10:
    104 
    105       Serial.println("  Chip = DS18S20");   // or old DS1820
    106 
    107       type_s = 1;
    108 
    109       break;
    110 
    111     case 0x28:        //0x28是DS18B20的家族编码
    112 
    113       Serial.println("  Chip = DS18B20");
    114 
    115       type_s = 0;
    116 
    117       break;
    118 
    119     case 0x22:
    120 
    121       Serial.println("  Chip = DS1822");
    122 
    123       type_s = 0;
    124 
    125       break;
    126 
    127     default:
    128 
    129       Serial.println("Device is not a DS18x20 family device.");
    130 
    131       return;
    132 
    133   } 
    134 
    135  
    136 
    137   ds.reset();   //复位
    138 
    139   ds.select(addr);  // 选择设备
    140 
    141   ds.write(0x44,1);        
    142 
    143  // start conversion, with parasite power on at the end,
    144 
    145 //传感器内部温度变换保存在暂存器,0x44是传感器的协议编码
    146 
    147   
    148 
    149   delay(1000);       // maybe 750ms is enough, maybe not
    150 
    151   // we might do a ds.depower() here, but the reset will take care of it.
    152 
    153   
    154 
    155   present = ds.reset();     //返回1表示有设备存在
    156 
    157   ds.select(addr);    
    158 
    159   ds.read(0xBE);         // Read Scratchpad 读暂存器,0xBE是传感器的协议编码
    160 
    161  
    162 
    163   Serial.print("  Data = ");
    164 
    165   Serial.print(present,HEX);
    166 
    167   Serial.print(" ");
    168 
    169   for ( i = 0; i < 9; i++)
    170 
    171 {           // we need 9 bytes
    172 
    173     data[i] = ds.read();
    174 
    175     Serial.print(data[i], HEX);
    176 
    177     Serial.print(" ");
    178 
    179   }
    180 
    181   Serial.print(" CRC=");
    182 
    183   Serial.print(OneWire::crc8(data, 8), HEX);
    184 
    185   Serial.println();
    186 
    187  
    188 
    189   // convert the data to actual temperature
    190 
    191  
    192 
    193   unsigned int raw = (data[1] << 8) | data[0];
    194 
    195   if (type_s)       //DS18S20对应的温度转换
    196 
    197 {
    198 
    199     raw = raw << 3;    // 9 bit resolution default
    200 
    201    if (data[7] == 0x10)
    202 
    203    {
    204 
    205       // count remain gives full 12 bit resolution
    206 
    207       raw = (raw & 0xFFF0) + 12 - data[6];
    208 
    209     }
    210 
    211   } 
    212 
    213 else      //DS18B20,DS1822对应的温度转换
    214 
    215 {
    216 
    217     byte cfg = (data[4] & 0x60);
    218 
    219     if (cfg == 0x00) raw = raw << 3;    // 9 bit resolution, 93.75 ms
    220 
    221     else if (cfg == 0x20) raw = raw << 2;   // 10 bit res, 187.5 ms
    222 
    223     else if (cfg == 0x40) raw = raw << 1;   // 11 bit res, 375 ms
    224 
    225     // default is 12 bit resolution, 750 ms conversion time
    226 
    227   }
    228 
    229   celsius = (float)raw / 16.0;    //摄氏温度
    230 
    231   fahrenheit = celsius * 1.8 + 32.0;    //华氏温度
    232 
    233   Serial.print("  Temperature = ");
    234 
    235   Serial.print(celsius);
    236 
    237   Serial.print(" Celsius, ");
    238 
    239   Serial.print(fahrenheit);
    240 
    241   Serial.println(" Fahrenheit");
    242 
    243 }
  • 相关阅读:
    SQLSERVER 根据传入的参数拼接sql语句字符串,反馈结果集
    SQLSERVER 时间函数汇总
    在网页中加入百度地图
    关于收到谷歌邮件 Googlebot can't access your site 的解决方法
    phoneGap 3.5 eclipise 模拟器调试
    将MongoDB设为Windows服务
    apply 判定变量类型
    angularjs 手动启动
    Angular js ie 7,8 兼容性
    jQuery 之正则表达式篇
  • 原文地址:https://www.cnblogs.com/MyAutomation/p/9500828.html
Copyright © 2011-2022 走看看