Temperature Meter using DS18B20 OLED Display & Arduino
In this post, we will learn how to interface DS18B20 Temperature Sensor with OLED Display & Arduino. Simply we will interface DS18B20 Dallas Temperature sensor with Arduino & display the temperature value in 128×64 OLED Display.
The DS18B20 temperature sensor is a 1-wire digital temperature sensor. This comes with a sealed package that lets precisely measure temperatures in wet environments with a simple 1-wire interface. It communicates on a common bus. It means it can connect several devices and read their values using just one digital pin of the Arduino.
Bill of Materials
The components required for making Digital Temperature Meter are as follows. All these components can be purchased easily from Amazon.
| S.N. | Components Name | Quantity | Purchase Links |
|---|---|---|---|
| 1 | Arduino Nano Board | 1 | Amazon | AliExpress |
| 2 | DS18B20 Temperature Sensor | 1 | Amazon | AliExpress |
| 4 | 0.96" I2C OLED Display | 1 | Amazon | AliExpress |
| 5 | Resistor 4.7K | 1 | Amazon | AliExpress |
| 6 | Connecting Wires | 10 | Amazon | AliExpress |
| 7 | Breadboard | 1 | Amazon | AliExpress |
DS18B20 Waterproof Digital Temperature Sensor:
This is a pre-wired and waterproofed version of the DS18B20 sensor. Handy for when you need to measure something far away, or in wet conditions. The Sensor can measure the temperature between -55 to 125°C (-67°F to +257°F). The cable is jacketed in PVC.
Because it is digital, there is no signal degradation even over long distances. These 1-wire digital temperature sensors are fairly precise, i.e ±0.5°C over much of the range. It can give up to 12 bits of precision from the onboard digital-to-analog converter. They work great with any microcontroller using a single digital pin.
The only downside is they use the Dallas 1-Wire protocol, which is somewhat complex and requires a bunch of code to parse out the communication. We toss in a 4.7k resistor, which is required as a pullup from the DATA to the VCC line when using the sensor.
To learn more about this sensor you can check this post: Digital Thermometer Using Arduino & DS18B20 Temperature Sensor
Circuit Diagram & Connections
Connect VDD pin of DS18B20 to 5V and GND Pin to Ground. Connect its data pin to Analog pin A0 of Arduino. Between data pin & VDD connect 4.7K resistor.
Connect SSD1306 0.96″ OLED Display to I2C Pins of Arduino as shown in the figure above.
Source Code/Program
The source code for interfacing OLED Display & DS18B20 Sensor with Arduino is given below. We need to add the following 2 libraries:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 |
#include <Wire.h> // include Arduino wire library for I2C devices #include <Adafruit_GFX.h> // include Adafruit graphics library #include <Adafruit_SSD1306.h> // include Adafruit SSD1306 OLED display driver #define OLED_RESET 4 // define display reset pin Adafruit_SSD1306 display(OLED_RESET); #define DS18B20_PIN A0 // define DS18B20 data pin connection void setup(void) { delay(1000); // wait a second display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize the SSD1306 OLED display with I2C address 0x3C display.clearDisplay(); // clear the display buffer. display.setTextSize(2); display.setTextColor(WHITE, BLACK); display.setCursor(34, 5); display.print("HOW2ELECTRONICS"); display.setTextSize(1); display.setTextColor(WHITE, BLACK); display.setCursor(29, 33); display.print("Temperature:"); display.display(); display.setTextSize(2); } unsigned int ds18b20_temp; char _buffer[11]; void loop() { display.setCursor(1, 50); if(ds18b20_read(&ds18b20_temp)) { if (ds18b20_temp & 0x8000) // if temperature < 0 { ds18b20_temp = ~ds18b20_temp + 1; // change temperature value to positive form sprintf(_buffer, "-%02u.%04u C", (ds18b20_temp/16) % 100, (ds18b20_temp & 0x0F) * 625); } else { // otherwise (temperature >= 0) if (ds18b20_temp/16 > 100) // if temperature >= 100 °C sprintf(_buffer, "%03u.%04u C", ds18b20_temp/16, (ds18b20_temp & 0x0F) * 625); else // otherwise ( 0 <= temperature < 100) sprintf(_buffer, " %02u.%04u C", ds18b20_temp/16, (ds18b20_temp & 0x0F) * 625); } display.print(_buffer); display.drawCircle(103, 52, 2, WHITE); // put degree symbol ( ° ) } else display.print(" ERROR "); display.display(); delay(1000); // wait a second } bool ds18b20_start() { bool ret = 0; digitalWrite(DS18B20_PIN, LOW); // send reset pulse to the DS18B20 sensor pinMode(DS18B20_PIN, OUTPUT); delayMicroseconds(500); // wait 500 us pinMode(DS18B20_PIN, INPUT); delayMicroseconds(100); // wait to read the DS18B20 sensor response if (!digitalRead(DS18B20_PIN)) { ret = 1; // DS18B20 sensor is present delayMicroseconds(400); // wait 400 us } return(ret); } void ds18b20_write_bit(bool value) { digitalWrite(DS18B20_PIN, LOW); pinMode(DS18B20_PIN, OUTPUT); delayMicroseconds(2); digitalWrite(DS18B20_PIN, value); delayMicroseconds(80); pinMode(DS18B20_PIN, INPUT); delayMicroseconds(2); } void ds18b20_write_byte(byte value) { byte i; for(i = 0; i < 8; i++) ds18b20_write_bit(bitRead(value, i)); } bool ds18b20_read_bit(void) { bool value; digitalWrite(DS18B20_PIN, LOW); pinMode(DS18B20_PIN, OUTPUT); delayMicroseconds(2); pinMode(DS18B20_PIN, INPUT); delayMicroseconds(5); value = digitalRead(DS18B20_PIN); delayMicroseconds(100); return value; } byte ds18b20_read_byte(void) { byte i, value; for(i = 0; i < 8; i++) bitWrite(value, i, ds18b20_read_bit()); return value; } bool ds18b20_read(int *raw_temp_value) { if (!ds18b20_start()) // send start pulse return(0); ds18b20_write_byte(0xCC); // send skip ROM command ds18b20_write_byte(0x44); // send start conversion command while(ds18b20_read_byte() == 0); // wait for conversion complete if (!ds18b20_start()) // send start pulse return(0); // return 0 if error ds18b20_write_byte(0xCC); // send skip ROM command ds18b20_write_byte(0xBE); // send read command *raw_temp_value = ds18b20_read_byte(); // read temperature LSB byte and store it on raw_temp_value LSB byte *raw_temp_value |= (unsigned int)(ds18b20_read_byte() << 8); // read temperature MSB byte and store it on raw_temp_value MSB byte return(1); } |
Working of the Project
The Arduino code below doesn’t use any library for the DS18B20 sensor. Rather Analog pin is used for measuring temperature.
- bool ds18b20_start(): checks whether DS18B20 sensor is correctly connected to the circuit or not & returns 1 if OK and 0 if error.
- ds18b20_write_bit(bool value): write a single bit to the DS18B20 sensor, which maybe 1 or 0.
- ds18b20_write_byte(byte value): write 1 byte (8 bits) to the DS18B20 sensor
- bool ds18b20_read_bit(void): reads 1 bit from the DS18B20 sensor, returns the read value (1 or 0).
- byte ds18b20_read_byte(void): reads 1 byte from the DS18B20 sensor, based on the previous value.
- bool ds18b20_read(int *raw_temp_value): reads the temperature raw data which is 16-bit long (two 8-bit registers), the data is stored in the variable raw_temp_value, returns 1 if OK and 0 if error.










2 Comments
C:\Users\termy\AppData\Local\Temp\arduino_modified_sketch_471779\sketch_apr21d.ino: In function ‘void loop()’:
C:\Users\termy\AppData\Local\Temp\arduino_modified_sketch_471779\sketch_apr21d.ino:37:17: warning: invalid conversion from ‘unsigned int‘ to ‘int‘ [-fpermissive]
if(ds18b20_read(&ds18b20_temp))
^~~~~~~~~~~~~
C:\Users\termy\AppData\Local\Temp\arduino_modified_sketch_471779\sketch_apr21d.ino:122:6: note: initializing argument 1 of ‘bool ds18b20_read(int*)’
bool ds18b20_read(int *raw_temp_value)
^~~~~~~~~~~~
this is what i get. It just hangs at how2electronics on the led
if for someone it is not working, adjust “display.setCursor(1, 10);” lines