Close

new temperature sensor

A project log for Milapli

An open source/hardware meteo station, also monitoring other environemental parameters

audrey-robinelAudrey Robinel 08/23/2014 at 04:160 Comments

Today i added a much better temperature sensor : a DS18B20. It is really simple to interface : the left wire goes to the ground, the middle wire goes to the GPIO and to VCC via a 4.7K resistor, and the left wire goes to VCC. This disposition is for when you look at the flat side of the probe, with the leads on the bottom.

Of course, in my case, the data pin goes into a Atmega328p rather than a picaxe.

Software side is a bit more complex, hopefully, there are libraries available :

http://www.pjrc.com/teensy/td_libs_OneWire.html

From there i use a function to read the temperature (can't remember where i found it) :

float getAirTemp()

{

//returns the temperature from one DS18S20 in DEG Celsius

byte data[12];

byte addr[8];

if ( !ds.search(addr)) {

//no more sensors on chain, reset search

ds.reset_search();

return -1000;

}

if ( OneWire::crc8( addr, 7) != addr[7]) {

Serial.println("CRC is not valid!");

return -1000;

}

if ( addr[0] != 0x10 && addr[0] != 0x28) {

Serial.print("Device is not recognized");

return -1000;

}

ds.reset();

ds.select(addr);

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

byte present = ds.reset();

ds.select(addr);

ds.write(0xBE); // Read Scratchpad

for (int i = 0; i < 9; i++) { // we need 9 bytes

data[i] = ds.read();

}

ds.reset_search();

byte MSB = data[1];

byte LSB = data[0];

float tempRead = ((MSB << 8) | LSB); //using two's compliment

float TemperatureSum = tempRead / 16;

return TemperatureSum;

}

From there, i can read the temperature using this function.

The temperatures that i get from this probe are a lot more accurate than those of the DS18B20, or the BMP085. Furthermore, i now have tenths of degrees rather than full degrees steps.

Discussions