Programming DS18B20

Hi,

I'm working on a digital thermometer and I have two working separate sketches for a DS18B20 temperature sensor & LCD 1602. I need help merging them.

(Note: The attached file picture below is a lm35 part for visual purpose only as i can't find a DS18B20)

First Sketch DS18B20

#include <OneWire.h>
#include <DallasTemperature.h>
 
// Sensor input pin
#define DATA_PIN 6
// How many bits to use for temperature values: 9, 10, 11 or 12
#define SENSOR_RESOLUTION 9
// Index of sensors connected to data pin, default: 0
#define SENSOR_INDEX 0
 
OneWire oneWire(DATA_PIN);
DallasTemperature sensors(&oneWire);
DeviceAddress sensorDeviceAddress;
 
void setup() {
  Serial.begin(9600);
 
  sensors.begin();
  sensors.getAddress(sensorDeviceAddress, 0);
  sensors.setResolution(sensorDeviceAddress, SENSOR_RESOLUTION);
}
 
 
void loop() {
  sensors.requestTemperatures();
  // Measurement may take up to 750ms
 
  float temperatureInCelsius = sensors.getTempCByIndex(SENSOR_INDEX);
  float temperatureInFahrenheit = sensors.getTempFByIndex(SENSOR_INDEX);
 
  Serial.print("Temperature: ");
  Serial.print(temperatureInCelsius, 4);
  Serial.print(" Celsius, ");
  Serial.print(temperatureInFahrenheit, 4);
  Serial.println(" Fahrenheit");
}

Here's the LCD code and wiring. It's a Hello World code.

/*
  LiquidCrystal Library - Hello World

 Demonstrates the use a 16x2 LCD display.  The LiquidCrystal
 library works with all LCD displays that are compatible with the
 Hitachi HD44780 driver. There are many of them out there, and you
 can usually tell them by the 16-pin interface.

 This sketch prints "Hello World!" to the LCD
 and shows the time.

  The circuit:
 * LCD RS pin to digital pin 12
 * LCD Enable pin to digital pin 11
 * LCD D4 pin to digital pin 5
 * LCD D5 pin to digital pin 4
 * LCD D6 pin to digital pin 3
 * LCD D7 pin to digital pin 2
 * LCD R/W pin to ground
 * LCD VSS pin to ground
 * LCD VCC pin to 5V
 * 10K resistor:
 * ends to +5V and ground
 * wiper to LCD VO pin (pin 3)

//https://learn.adafruit.com/assets/938 (Turial Website)

 Library originally added 18 Apr 2008
 by David A. Mellis
 library modified 5 Jul 2009
 by Limor Fried (http://www.ladyada.net)
 example added 9 Jul 2009
 by Tom Igoe
 modified 22 Nov 2010
 by Tom Igoe

 This example code is in the public domain.

 http://www.arduino.cc/en/Tutorial/LiquidCrystal
 */

// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

void setup() {
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("Hello, World!");
}

void loop() {
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  lcd.setCursor(0, 1);
  // print the number of seconds since reset:
  lcd.print(millis() / 1000);
}

First thing to check for is pin conflicts- this should be obvious if you try to wire everything up whether the 2 pieces of hardware are trying to use the same pin.

Once you have all the hardware wired then try to run each sketch individually on the merged hardware. This will confirm you have no hardware conflicts.

If this succeeds then you can try to merge them: create a new empty sketch, copy the #includes and other heading stuff from both sketches into the new sketch and try to verify- this will test for software conflicts within the libraries used.

Assuming that went OK copy the setup() and loop() code from the existing sketches into the corresponding sections of the new sketch and try that.

If thats OK then you probably can change the lcd.print(millis() / 1000); line to print out temperatures instead..

If you get stuck at any time then post your actual code and error messages back here and people will try to help

Thanks rw950431,

I merged both codes together below. But I'm still having some trouble. Refer to the next coment below for New Re-Vised Code.

Merged Code:

OneWire oneWire(DATA_PIN);
DallasTemperature sensors(&oneWire);
DeviceAddress sensorDeviceAddress;

LiquidCrystal lcd(7, 8, 9, 10, 11, 12);


void setup() {
  Serial.begin(9600);
 
  sensors.begin();
  sensors.getAddress(sensorDeviceAddress, 0);
  sensors.setResolution(sensorDeviceAddress, SENSOR_RESOLUTION);

   lcd.begin(16, 2);
   lcd.print("Hello, World!");
}

void loop() {
   sensors.requestTemperatures();
  // Measurement may take up to 750ms
 
  float temperatureInCelsius = sensors.getTempCByIndex(SENSOR_INDEX);
  float temperatureInFahrenheit = sensors.getTempFByIndex(SENSOR_INDEX);
 
  Serial.print("Temperature: ");
  Serial.print(temperatureInCelsius, 4);
  Serial.print(" Celsius, ");
  Serial.print(temperatureInFahrenheit, 4);
  Serial.println(" Fahrenheit");

   // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  lcd.setCursor(0, 1);
  // print the number of seconds since reset:
  lcd.print(millis() / 1000);

}

I changed/deleted some things on the above merge code. Only problem I have left is:

1.) How to retrieve my temperature readings (Fahrenheit/Celsius) to display on my screen as my temperature readings is displaying in the "Serial Monitor".

RIght now my LCD is displaying this but no values:

Celsius:
Fahrenheit:

Re-vised Code:

#define DATA_PIN 6
#define SENSOR_RESOLUTION 9
#define SENSOR_INDEX 0


OneWire oneWire(DATA_PIN);
DallasTemperature sensors(&oneWire);
DeviceAddress sensorDeviceAddress;

LiquidCrystal lcd(7, 8, 9, 10, 11, 12);


void setup() {
 Serial.begin(9600);
 
  sensors.begin();
  sensors.getAddress(sensorDeviceAddress, 0);
  sensors.setResolution(sensorDeviceAddress, SENSOR_RESOLUTION);

   lcd.begin(16, 2);

}

void loop() {
   sensors.requestTemperatures();
  // Measurement may take up to 750ms
 
  float temperatureInCelsius = sensors.getTempCByIndex(SENSOR_INDEX);
  float temperatureInFahrenheit = sensors.getTempFByIndex(SENSOR_INDEX);
 
  Serial.print("Temperature: ");
  Serial.print(temperatureInCelsius, 4);
  Serial.print(" Celsius, ");
  Serial.print(temperatureInFahrenheit, 4);
  Serial.println(" Fahrenheit");

 // (0,0)= line top
 // (0,1)= linw bottom
lcd.setCursor(0, 0);
lcd.print(" Celsius: ");

lcd.setCursor (0, 1);
lcd.print(" Fahrenheit: ");

}

Anybody?

crvtec:
RIght now my LCD is displaying this but no values:

Celsius:
Fahrenheit:

That is because you have instructed Arduino to print the text to LCD, but have neglected to instruct it to print the values.

The values you see on monitor may be 85. This is because you have not provided any delay in order for the DS18B20s to get the readings sorted.

Thanks for the replied.

I assume I have to input something after the colon on this part of the code " Celsius: " and " Fahrenheit: " to get the Temp?

Code

lcd.setCursor(0, 0);
lcd.print(" Celsius: ");

lcd.setCursor (0, 1);
lcd.print(" Fahrenheit: ");

NVM sir...I got it working. You got me put on my thinking cap. Thank You Kind sir

#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>

#define DATA_PIN 6
#define SENSOR_RESOLUTION 9
#define SENSOR_INDEX 0


OneWire oneWire(DATA_PIN);
DallasTemperature sensors(&oneWire);
DeviceAddress sensorDeviceAddress;

LiquidCrystal lcd(7, 8, 9, 10, 11, 12);


void setup() {
 Serial.begin(9600);
 
  sensors.begin();
  sensors.getAddress(sensorDeviceAddress, 0);
  sensors.setResolution(sensorDeviceAddress, SENSOR_RESOLUTION);

   lcd.begin(16, 2);

}

void loop() {
   sensors.requestTemperatures();
  // Measurement may take up to 750ms
 
  float temperatureInCelsius = sensors.getTempCByIndex(SENSOR_INDEX);
  float temperatureInFahrenheit = sensors.getTempFByIndex(SENSOR_INDEX);
 

 // (0,0)= line top
 
lcd.setCursor(0, 0);
lcd.print(temperatureInCelsius, 4);
lcd.print(" Celsius, ");

// (0,1)= line bottom

lcd.setCursor (0, 1);
lcd.print(temperatureInFahrenheit, 4);
lcd.println(" Fahrenheit");
}

Thanks for posting your working code, it helps others learn.