Categories

ESP8266 Project : DS18b20 temperature on an OLED

In this particular example we are going to display temperature readings from a DS18B20 on an OLED display, we will be using a Wemos mini and a variety of shields which make it easy to create projects like this with no wiring.

Lets take a look a the shields and boards

 

Image Summary
The Wemos mini – ESP8266 based board, it comes with various headers. This is the beauty of it you can create stackable projects with the board and pin compatible shields
Not an official Wemos board but readily available featuring the ever popular DS18B20 temperature sensor
A little 64×48 OLED screen
This is simply a base, you plug the Wemos Mini into one side and you can plug a shield or shields into the other side

 

 

 

Parts List

1 x Wemos Mini
1 x Wemos Dual Base
1 x OLED Shield
1 x Ds18B20 shield

I connect the Wemos Mini to the dual base and then put the OLED shield along side this, I then place the DS18b20 shield on top of the Wemos Mini. This image hopefully shows this

 

Code

Various libraries required – you can install these via the library manager, here are links to them

https://github.com/sparkfun/SparkFun_Micro_OLED_Arduino_Library 

You will also have to install the OneWire library

#include <OneWire.h>
#include <SFE_MicroOLED.h> // Include the SFE_MicroOLED library
#define PIN_RESET 255 //
#define DC_JUMPER 0 // I2C Addres: 0 - 0x3C, 1 - 0x3D
// OneWire DS18S20, DS18B20, DS1822 Temperature Example
OneWire ds(D2); // on pin D2 (a 4.7K resistor is necessary)
MicroOLED oled(PIN_RESET, DC_JUMPER); // Example I2C declaration
void setup(void)
{
Serial.begin(9600);
oled.begin();
oled.clear(ALL); // Clear the display's memory (gets rid of artifacts)
oled.display();
}
void loop(void)
{
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius, fahrenheit;
if ( !ds.search(addr))
{
ds.reset_search();
delay(250);
return;
}
if (OneWire::crc8(addr, 7) != addr[7])
{
Serial.println("CRC is not valid!");
return;
}
// the first ROM byte indicates which chip
switch (addr[0])
{
case 0x10:
type_s = 1;
break;
case 0x28:
type_s = 0;
break;
case 0x22:
type_s = 0;
break;
default:
Serial.println("Device is not a DS18x20 family device.");
return;
}
ds.reset();
ds.select(addr);
ds.write(0x44, 1); // start conversion, with parasite power on at the end
delay(1000);
present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad
for ( i = 0; i < 9; i++)
{
data[i] = ds.read();
}
// Convert the data to actual temperature
int16_t raw = (data[1] << 8) | data[0];
if (type_s) {
raw = raw << 3; // 9 bit resolution default
if (data[7] == 0x10)
{
raw = (raw & 0xFFF0) + 12 - data[6];
}
}
else
{
byte cfg = (data[4] & 0x60);
if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms
else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
}
oled.clear(PAGE);
oled.setFontType(0); // set font type 0, please see declaration in SFE_MicroOLED.cpp
oled.setCursor(1, 3);
celsius = (float)raw / 16.0;
fahrenheit = celsius * 1.8 + 32.0;
oled.print("Cels = ");
oled.setCursor(1, 12);
oled.print(celsius);
oled.print(" *C");
oled.setCursor(1, 21);
oled.print("Fahr =");
oled.setCursor(1, 30);
oled.print(fahrenheit);
oled.print(" *F");
oled.display();
}

Can’t be bothered typing all that in – Wemos_OLED_DS18b20

 

Output

Here you can see the output and my setup

DS18b20 and WEMOS output

DS18b20 and WEMOS output

 

 

Links

You can hopefully pick this all up for $10

Smart Electronics D1 mini – Mini NodeMcu 4M bytes development board based ESP8266 by WeMos

Shield for WeMos D1 mini V2 DS18B20 Single-bus digital temperature and humidity sensor module sensor

0.66″ inch For Wemos Oled 64X48 IIC I2C LCD OLED LED Display Shield

Dual Base Expansion board for WeMos D1 mini NodeMCU ESP8266

Raspberry PI and DS18b20 with LED warning

In a previous example, we connected a DS18b20 to our Raspberry PI and measured and displayed the temperature, in a slight twist what about if we acted on this reading and if the temperature exceeded a minimum voltage we switched an LED on. In the real world it could be an audible warning or perhaps you would try and reduce the temperature somehow.

We add the LED and resistor to pin 18

pi and ds18b20 and led

pi and ds18b20 and led

Most of the instructions are as per our previous example, here is the python code

Note you will have to replace the 28-0000027a4334 value

import RPi.GPIO as GPIO
import time
 
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD) ## Use board pin numbering
GPIO.setup(18, GPIO.OUT) ## Setup GPIO Pin 18 to OUT
 
while 1:
	tempfile = open("/sys/bus/w1/devices/28-0000027a4334/w1_slave")
	temptext = tempfile.read();
	tempfile.close()
	tempdata = temptext.split("\n")[1].split(" ")[9]
	temperature = float(tempdata[2:])
	temperature = temperature / 1000
	print temperature
	if temperature > 24:
		GPIO.output(18,True)
	else:
		GPIO.output(18,False)
	time.sleep(1)

Run the program, now touch the sensor and raise the temperature above 24 c. You may need to change the value

DS18b20 and the Raspberry PI example

In this example we connect a DS18b20 temperature sensor to our Raspberry PI and read in the value, here is the schematic for this.

 

pi and ds18b20

pi and ds18b20

Start the terminal and entering the following

sudo modprobe w1-gpio
 
sudo modprobe w1-therm
 
cd /sys/bus/w1/devices
ls
 
cd 28-xxxxxxxxxx (change this to match the serial number that pops up)
 
cat w1_slave

You should see something like this

terminal_ds18b20

terminal_ds18b20

In the output above the t=18875 is the temperature, in this case this is equal to 18.875

Now we will try this in python

Open the terminal and type in the following

sudo idle

Wait for IDLE to open,  then click File > New to open a new window. Or you can use CTRL + N.

Now type in the following code

import time
 
while 1:
 tempfile = open("/sys/bus/w1/devices/28-0000027a4334/w1_slave")
 temptext = tempfile.read();
 tempfile.close()
 tempdata = temptext.split("\n")[1].split(" ")[9]
 temperature = float(tempdata[2:])
 temperature = temperature / 1000
 print temperature
 
 time.sleep(1)

Click File > Save when you are finished (Ctrl + S).

To run your program, click Run > Run (Ctrl + F5), your should output like the following

ds18b20_out

ds18b20_out

 

Arduino and DS18B20 example

The DS18B20 is a nice little temperature sensor that can be used in various simple projects.  This part uses the 1 wire bus and you can connect multiple sensors up to your Arduino.

The part is also relatively low cost and only requires a 4k7 pull up resistor. In the example below we shall make a basic example that reads the temperature and outputs via serial and can be verified using the serial monitor in the Arduino IDE.

Lets look at the parts list and the the parts laid out on a mini breadboard which sits on an arduino protoboard shield, as you can see 2 parts and some hook up wire.

Parts List

Label Part Type Properties
DS1 DS18B20 1-Wire Temperature Sensor part # DS18B20
Part1 Arduino Uno (Rev3) type Arduino UNO (Rev3)
R1 4.7k Ω Resistor package THT; tolerance ±5%; bands 4; resistance 4.7kΩ; pin spacing 400 mil
ds18b20 breadboard

ds18b20 breadboard

Layout

 

ds1820 layout

ds1820 layout

Coding

You need to download 2 libraries and copy them into your Arduino libraries folder, this makes life easier.

“DallasTemperature” Library
“1-Wire” Library

Now copy and paste this into a new sketch

 

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

//the pin you connect the ds18b20 to
#define DS18B20 2

OneWire ourWire(DS18B20);
DallasTemperature sensors(&ourWire);

void setup()
{
Serial.begin(9600);
delay(1000);
//start reading
sensors.begin();
}

void loop()
{
//read temperature and output via serial
sensors.requestTemperatures();
Serial.print(sensors.getTempCByIndex(0));
Serial.println(” degrees C”);
}

 

When you upload the sketch, go to Tools -> Serial Monitor and you should see something like the following. Put your finger on the DS18B20 and you should see the temperature vary.

 

ds18b20 output

ds18b20 output

Links

I’m seeing some great prices for DS18B20 parts, 10 of these for about $7.

Buy DS18B20 from Amazon UK

 

Buy DS18B20 from Amazon US