DS18B20 in Fahrenheit
Using an Arduino Nano + I2C LCD + DS18B20 temperature display example part 2:
Here is the temp converted from Celsius to Fahrenheit...
The initial example was in Celsius but that makes life confusing when you live in an area where everything is measured in Fahrenheit. I wanted to see how complex the conversion between C & F was so I tweaked my code from the last example.
//Initial I2C LCD example from:
// http://arduino-info.wikispaces.com/LCD-Blue-I2C
// Initial DS18B20 example from:
// http://bildr.org/2011/07/ds18b20-arduino/
// Read the DS18B20 and then write to an I2C LCD and serial monitor
// http://www.hoaglun.com/blog/2013/1/31/ds18b20-in-fahrenheit
//The formula to convert Celsius to Fahrenheit
//Ftemp = (CTemp * 9.0)/ 5.0 + 32.0;
#include <Wire.h>
#include <OneWire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display
int DS18S20_Pin = 2; //DS18S20 Signal pin on digital 2
//Temperature chip i/o
OneWire ds(DS18S20_Pin); // on digital pin 2
void setup(void) {
Serial.begin(9600);
lcd.init(); // initialize the lcd
// Print a message to the LCD.
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Nano+I2C+DS18B20");
// lcd.setCursor(0, 1);
// lcd.print("Second Line");
}
void loop(void) {
float tempC = getTemp();
float tempF = (tempC * 9.0)/ 5.0 + 32.0;
Serial.println(tempF);
lcd.setCursor(0, 1);
lcd.print(tempF);
delay(100); //just here to slow down the output so it is easier to read
}
float getTemp(){
//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;
}
To find the formula and implement it took about 10 minutes. It would probably be shorter if I actually worked with this platform often enough to retain the structure in my brain. :-)
73 de NG0R