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
Become a Hackaday.io Member
Create an account to leave a comment. Already have an account? Log In.