DS18B20 is one of the popular temperature sensors because it is cheap, easy to use, and also waterproof. It is a very cheap waterproof temperature sensor we can get from the market.
Here’s the complete video tutorial :
From the DS18B20 datasheet we knew the recommended application of this sensor.
- Thermostatic Controls
- Industrial Systems
- Consumer Products
- Thermometers
- Thermally Sensitive Systems
And some features we extract from the datasheet.
- Unique 1-Wire® Interface Requires Only One Port Pin for Communication
- MeasuresTemperatures from -55°C to +125°C (-67°F to+257°F)
- ±0.5°C Accuracy from -10°C to +85°C
So now you can decide if this sensor is a match for your project.
Now we will learn how to use DSB18B20 with Arduino. So here I already have an Arduino UNO, DS18B20 sensor, and also a 10k resistor. We can also use any Arduino like Arduino mega or nano the same way.
Wiring Diagram
The Code for DS18B20 with arduino
You need to download and place the library in your Arduino library folder. Or simply use library manager like mentioned in the video.
This is the library link if you want to download it manually.
// Include the libraries we need #include <OneWire.h> #include <DallasTemperature.h> // Data wire is plugged into port 2 on the Arduino #define ONE_WIRE_BUS 2 // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs) OneWire oneWire(ONE_WIRE_BUS); // Pass our oneWire reference to Dallas Temperature. DallasTemperature sensors(&oneWire); // arrays to hold device address DeviceAddress insideThermometer; /* * Setup function. Here we do the basics */ void setup(void) { // start serial port Serial.begin(9600); Serial.println("Dallas Temperature IC Control Library Demo"); // locate devices on the bus Serial.print("Locating devices..."); sensors.begin(); Serial.print("Found "); Serial.print(sensors.getDeviceCount(), DEC); Serial.println(" devices."); // report parasite power requirements Serial.print("Parasite power is: "); if (sensors.isParasitePowerMode()) Serial.println("ON"); else Serial.println("OFF"); // Assign address manually. The addresses below will beed to be changed // to valid device addresses on your bus. Device address can be retrieved // by using either oneWire.search(deviceAddress) or individually via // sensors.getAddress(deviceAddress, index) // Note that you will need to use your specific address here //insideThermometer = { 0x28, 0x1D, 0x39, 0x31, 0x2, 0x0, 0x0, 0xF0 }; // Method 1: // Search for devices on the bus and assign based on an index. Ideally, // you would do this to initially discover addresses on the bus and then // use those addresses and manually assign them (see above) once you know // the devices on your bus (and assuming they don't change). if (!sensors.getAddress(insideThermometer, 0)) Serial.println("Unable to find address for Device 0"); // method 2: search() // search() looks for the next device. Returns 1 if a new address has been // returned. A zero might mean that the bus is shorted, there are no devices, // or you have already retrieved all of them. It might be a good idea to // check the CRC to make sure you didn't get garbage. The order is // deterministic. You will always get the same devices in the same order // // Must be called before search() //oneWire.reset_search(); // assigns the first address found to insideThermometer //if (!oneWire.search(insideThermometer)) Serial.println("Unable to find address for insideThermometer"); // show the addresses we found on the bus Serial.print("Device 0 Address: "); printAddress(insideThermometer); Serial.println(); // set the resolution to 9 bit (Each Dallas/Maxim device is capable of several different resolutions) sensors.setResolution(insideThermometer, 9); Serial.print("Device 0 Resolution: "); Serial.print(sensors.getResolution(insideThermometer), DEC); Serial.println(); } // function to print the temperature for a device void printTemperature(DeviceAddress deviceAddress) { // method 1 - slower //Serial.print("Temp C: "); //Serial.print(sensors.getTempC(deviceAddress)); //Serial.print(" Temp F: "); //Serial.print(sensors.getTempF(deviceAddress)); // Makes a second call to getTempC and then converts to Fahrenheit // method 2 - faster float tempC = sensors.getTempC(deviceAddress); if(tempC == DEVICE_DISCONNECTED_C) { Serial.println("Error: Could not read temperature data"); return; } Serial.print("Temp C: "); Serial.print(tempC); Serial.print(" Temp F: "); Serial.println(DallasTemperature::toFahrenheit(tempC)); // Converts tempC to Fahrenheit } /* * Main function. It will request the tempC from the sensors and display on Serial. */ void loop(void) { // call sensors.requestTemperatures() to issue a global temperature // request to all devices on the bus Serial.print("Requesting temperatures..."); sensors.requestTemperatures(); // Send the command to get temperatures Serial.println("DONE"); // It responds almost immediately. Let's print out the data printTemperature(insideThermometer); // Use a simple function to print out the data } // function to print a device address void printAddress(DeviceAddress deviceAddress) { for (uint8_t i = 0; i < 8; i++) { if (deviceAddress[i] < 16) Serial.print("0"); Serial.print(deviceAddress[i], HEX); } }
Upload code above to your Arduino and now you should get temperature values in the Serial monitor.
Display Temperature Value to an LCD
Now if you want to display the result of sensor reading you can add an LCD to your Arduino. I use 20X4 LCD with an I2C LCD backpack so it simpler to use. You can use any size of LCD too. Here’s the wiring diagram.
DS18B20 Wiring Diagram with arduino and LCD
And here’s the complete code to display your temperature to the LCD
// Include the libraries we need #include <OneWire.h> #include <DallasTemperature.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 20, 4); //The LCD address and size. You can change according you yours // Data wire is plugged into port 2 on the Arduino #define ONE_WIRE_BUS 2 //pin for sensor // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs) OneWire oneWire(ONE_WIRE_BUS); // Pass our oneWire reference to Dallas Temperature. DallasTemperature sensors(&oneWire); /* The setup function. We only start the sensors here */ void setup(void) { // start serial port Serial.begin(9600); Serial.println("Dallas Temperature IC Control Library Demo"); // Start up the library sensors.begin(); lcd.init(); // Print a message to the LCD. lcd.backlight(); lcd.setCursor(0, 0); lcd.print("DS18B20 TEST!"); lcd.setCursor(0, 1); lcd.print("by miliohm.com"); delay(2000); lcd.clear(); } /* Main function, get and show the temperature */ void loop(void) { // call sensors.requestTemperatures() to issue a global temperature // request to all devices on the bus Serial.print("Requesting temperatures..."); sensors.requestTemperatures(); // Send the command to get temperatures Serial.println("DONE"); // After we got the temperatures, we can print them here. // We use the function ByIndex, and as an example get the temperature from the first sensor only. float tempC = sensors.getTempCByIndex(0); // Check if reading was successful if (tempC != DEVICE_DISCONNECTED_C) { Serial.print("Temperature for the device 1 (index 0) is: "); Serial.println(tempC); lcd.setCursor(0, 0); lcd.print("Temperature:"); lcd.setCursor(0, 1); lcd.print(tempC); lcd.print((char)223); lcd.print("C"); lcd.print(" | "); lcd.print(DallasTemperature::toFahrenheit(tempC)); lcd.print(" F"); } else { Serial.println("Error: Could not read temperature data"); } }
Now you should able to see the reading result to the LCD.