Temp sensor

From Reef Projects

Jump to: navigation, search

DS18B20 in Parasite Mode

This code will read the temperature from the DS18B20. This code can be modified for operation with other sensors and more information can be found Here. Data Sheet

  1. Wire up your DS18B20.
  2. Open a new Arduino sketch.
  3. You will have to download the one-wire library found Here.
  4. Copy the code into your workspace and go. Note that the thermometer is set to run off of pin 10, but can be changed to other pins:
#include <OneWire.h>

// DS18S20 Temperature chip i/o

OneWire ds(10);  // on pin 10


float c2f(float cel) {
 return (cel * (9.0/5.0)) + (float)3200;
}

void setup(void) {
  // initialize inputs/outputs
  // start serial port
  Serial.begin(9600);
}

void loop(void){
  byte i;
  byte present = 0;
  byte data[12];
  byte addr[8];
  int HighByte, LowByte, TReading, SignBit, Tc_100, Whole, Fract;
  
  if ( !ds.search(addr)) {
      // Serial.print("No more addresses.\n");
      ds.reset_search();
      return;
  }


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

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

  if ( addr[0] != 0x28) {
      Serial.print("Device is not a DS18S20 family device.\n");
      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("P=");
//  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();
   LowByte = data[0];
  HighByte = data[1];
  TReading = (HighByte << 8) + LowByte;
  SignBit = TReading & 0x8000;  // test most sig bit
  if (SignBit) // negative
  {
    TReading = (TReading ^ 0xffff) + 1; // 2's comp
  }
  Tc_100 = (6 * TReading) + TReading / 4;    // multiply by (100 * 0.0625) or 6.25

//  Serial.print("Temp C Raw = ");
//  Serial.print(Tc_100);
//  Serial.print("\n");

  Tc_100 = c2f(Tc_100);
  
//  Serial.print("Temp F Raw = ");
//  Serial.print(Tc_100);
//  Serial.print("\n");

  Serial.print("Temp = ");
  
  Whole = (Tc_100 / 100);  // separate off the whole and fractional portions

  Fract = (Tc_100 % 100);


  if (SignBit) // If its negative
  {
     Serial.print("-");
  }
  Serial.print(Whole);
  Serial.print(".");
  if (Fract < 10)
  {
     Serial.print("0");
  }
  Serial.print(Fract);

  Serial.print("\n");
  
}

DS18B20 in Normal Mode (no delay)

This code does a couple things:

  • Reads the temp on pin 10
  • Displays the High/Low/Current temp

Wiring:

  • The temp sensor is not in 1 wire configuration. See the schematics here.

Code:

#include <OneWire.h>

// DS18S20 Temperature chip i/o

OneWire ds(10);  // on pin 10


float c2f(float cel) {
 return (cel * (9.0/5.0)) + (float)3200;
}

void setup(void) {
  // start serial port
  Serial.begin(9600);
}

int High = 0;
int Low = 10000;

void loop(void){
  byte i;
  byte present = 0;
  byte data[12];
  byte addr[8];
  int HighByte, LowByte, TReading, SignBit, Tc_100, Whole, Fract;
  
  if ( !ds.search(addr)) {
      // Serial.print("No more addresses.\n");
      ds.reset_search();
      return;
  }

  for( i = 0; i < 8; i++) {

  }

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

  if ( addr[0] != 0x28) {
      Serial.print("Device is not a DS18S20 family device.\n");
      return;
  }

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

  //delay(1000);     // use delay if in parasite power
  // 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


  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
  }
  
  LowByte = data[0];
  HighByte = data[1];
  TReading = (HighByte << 8) + LowByte;
  SignBit = TReading & 0x8000;  // test most sig bit
  if (SignBit) // negative
  {
    TReading = (TReading ^ 0xffff) + 1; // 2's comp
  }
  Tc_100 = (6 * TReading) + TReading / 4;    // multiply by (100 * 0.0625) or 6.25

  Tc_100 = c2f(Tc_100);  //convert to fahrenheit
  
  if(Tc_100 > High){   //set high temp
    High = Tc_100;
  }
    Whole = (High / 100);  // separate off the whole and fractional portions
    Fract = (High % 100);
    Serial.print("High Temp = ");
    Serial.print(Whole);
    Serial.print(".");
    if (Fract < 10)
  {
     Serial.print("0");
  }
    Serial.print(Fract);
    
      if(Tc_100 < Low){  //set low temp
    Low = Tc_100;
  }
    Whole = (Low / 100);  // separate off the whole and fractional portions
    Fract = (Low % 100);
    Serial.print(" Low Temp = ");
    Serial.print(Whole);
    Serial.print(".");
    if (Fract < 10)
  {
     Serial.print("0");
  }
    Serial.print(Fract);
    Serial.print(" ");

  Serial.print("Temp = ");
  
  Whole = (Tc_100 / 100);  // separate off the whole and fractional portions

  Fract = (Tc_100 % 100);


  if (SignBit) // If its negative
  {
     Serial.print("-");
  }
  Serial.print(Whole);
  Serial.print(".");
  if (Fract < 10)
  {
     Serial.print("0");
  }
  Serial.print(Fract);
  

  Serial.print("\n");

  
}

DS18B20 Bare Bones Code

  • You will have to add delay if running in parasite power mode.
  • Just displays the temp in fahrenheit.
#include <OneWire.h>

// DS18S20 Temperature chip i/o

OneWire ds(10);  // on pin 10


float c2f(float cel) {
 return (cel * (9.0/5.0)) + (float)3200;
}

void setup(void) {
  // initialize inputs/outputs
  // start serial port
  Serial.begin(9600);
}

void loop(void){
  byte i;
  byte present = 0;
  byte data[12];
  byte addr[8];
  int HighByte, LowByte, TReading, SignBit, Tc_100, Whole, Fract;
  
  if ( !ds.search(addr)) {
      // Serial.print("No more addresses.\n");
      ds.reset_search();
      return;
  }

  for( i = 0; i < 8; i++) {

  }

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

  //delay(1000);     // use delay if in parasite power
  // 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

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

  }

   LowByte = data[0];
  HighByte = data[1];
  TReading = (HighByte << 8) + LowByte;
  SignBit = TReading & 0x8000;  // test most sig bit
  if (SignBit) // negative
  {
    TReading = (TReading ^ 0xffff) + 1; // 2's comp
  }
  Tc_100 = (6 * TReading) + TReading / 4;    // multiply by (100 * 0.0625) or 6.25

  Tc_100 = c2f(Tc_100);
  
  
  Whole = (Tc_100 / 100);  // separate off the whole and fractional portions

  Fract = (Tc_100 % 100);

  if (SignBit) // If its negative
  {
     Serial.print("-");
  }
  Serial.print(Whole);
  Serial.print(".");
  if (Fract < 10)
  {
     Serial.print("0");
  }
  Serial.print(Fract);
  

  Serial.print("\n");
  
}
Personal tools