One-Wire Temperature Sensor - DS18B20

From NearWiki
Jump to: navigation, search

Reference Information


  • Techinical Spec: Temperature range: -55°C to +125°C - Accuracy: ±0.5°C( -10°C to +85°C)



Temperature Sensor - DS18B20 - (Waterproof)


Temp probe 18B20.jpg



MyNbios Code - Example


In order to run this code you should copy the following code into the area delimited by the MY_BIOS CUSTOM CODE banners in the Hello_World_xxx.ino example.

#include <OneWire.h>

OneWire  ds(3);  // Arduino PIN_3
 
void Nearbus::MyNbios_0( byte portId, ULONG setValue, ULONG* pRetValue, byte vmcuMethod, PRT_CNTRL_STRCT* pPortControlStruct )
{
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius, fahrenheit;
    
    for (i=0 ; i < 20 ; i++) {
        if ( ds.search(addr)) {
            break;
        }
        ds.reset_search();
        delay(250); 
    }
        if (i == 20 ) {
            *pRetValue = 0;  
            return;
        }

    if(OneWire::crc8(addr, 7) != addr[7]) {
        *pRetValue = 0;
        return;
    }

    // the first ROM byte indicates which chip
    switch (addr[0]) {
        case 0x10:
            type_s = 1;
            break;
		
        case 0x28:
            type_s = 0;
            break;
		
        case 0x22:
            type_s = 0;
            break;
		
        default:
            *pRetValue = 0;
            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
    present = ds.reset();
    ds.select(addr);    
    ds.write(0xBE);                                       // Read Scratchpad

    for ( i = 0; i < 9; i++) {                            // we need 9 bytes
        data[i] = ds.read();
    }

    int16_t 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);
        // at lower res, the low bits are undefined, so let's zero them
        if (cfg == 0x00) raw = raw & ~7;                  // 9 bit resolution, 93.75 ms
        else if (cfg == 0x20) raw = raw & ~3;             // 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;       
  
    if ( !setValue ) {                                    // NearAPI: [value=1] => Fahrenheit - [value=0] => Celsius
        *pRetValue = (ULONG) (celsius * 100);
    }
    else {
        *pRetValue = (ULONG) (fahrenheit * 100);
    }    
}