Exploring Edison - The DS18B20 1-Wire Temperature Sensor
Written by Harry Fairhead   
Monday, 07 March 2016
Article Index
Exploring Edison - The DS18B20 1-Wire Temperature Sensor
Initialization and Writing Bits
Initiating a Temperature Conversion
Program Listing

The Edison doesn't have built in support for the Maxim 1-Wire bus and this means you can't use the very popular DS18B20 temperature sensor. However with a little careful planning you can and you can do it from user rather than kernel space. 

This is a chapter from our ebook on the Intel Edison. The full contents can be seen below. Notice this is a first draft and a work in progress. Use the comments or email harry.fairhead@i-programmer.info with your queries or suggestions.



Now On Sale!

You can now buy a print edition of Exploring Intel Edison.
You can buy it from:

USA and World  Amazon.com
Canada              Amazon.ca
UK                      Amazon.co.uk
France                Amazon.fr
Germany            Amazon.de
Spain                  Amazon.es
Brazil                  Amazon.br
Italy                    Amazon.it
Japan                 Amazon.co.jp
Mexico               Amazon.com.mx 

Chapter List

  1. Meet Edison
    In this chapter we consider the Edison's pros and cons and get an overview of its structure and the ways in which you can make use of it. If you have ever wondered if you need an Edison or an Arduino or even a Raspberry Pi then this is the place to start. 

  2. First Contact
    When you are prototyping with the Edison you are going to need to use one of the two main breakout boards - the Arduino or the mini. This chapter explains how to set up the Edison for both configurations. 

  3. In C
    You can program the Edison in Python, JavaScript or C/C+ but there are big advantages in choosing C. It is fast, almost as easy as the other languages and gives you direct access to everything. It is worth the effort and in this chapter we show you how to set up the IDE and get coding. 

  4. Mraa GPIO
    Using the mraa library is the direct way to work with the GPIO lines and you have to master it. Output is easy but you do need to be aware of how long everything takes. Input is also easy but using it can be more difficult. You can use polling or the Edison interrupt system which might not work exactly as you would expect.

  5. Fast Memory Mapped I/O
    There is a faster way to work with GPIO lines - memory mapped I/O. Using this it is possible to generate pulses as short at 0.25 microsecond and read pulse widths of 5 microseconds. However getting things right can be tricky. We look at how to generate fast accurate pulses of a given width and how to measure pulse widths.

  6. Near Realtime Linux 
    You need to be aware how running your programs under a non-realtime operating system like Yocto Linux effects timings and how accurately you can create pulse trains and react to the outside world. In this chapter we look the realtime facilities in every version of Linux. 

  7. Sophisticated GPIO - Pulse Width Modulation 
    Using the PWM mode of the GPIO lines is often the best way of solving control problems. PWM means you can dim an LED or position a servo and all using mraa. 

  8. Sophisticated GPIO -  I2C 
    I2C is a simple communications bus that allows you to connect any of a very large range of sensors. 

  9. I2C - Measuring Temperature  
    After looking at the theory of using I2C here is a complete case study using the SparkFun HTU21D hardware and software. 
  10. Life At 1.8V
    How to convert a 1.8V input or output to work with 5V or 3.3V including how to deal with bidirectional pull-up buses.

  11. Using the DHT11/22 Temperature Humidity Sensor at 1.8V 
    In this chapter we make use of all of the ideas introduced in earlier chapters to create a raw interface with the low cost DHT11/22 temperature and humidity sensor. It is an exercise in interfacing two logic families and implementing a protocol directly in C. 

  12. The DS18B20 1-Wire Temperature 
    The Edison doesn't have built in support for the Maxim 1-Wire bus and this means you can't use the very popular DS18B20 temperature sensor. However with a little careful planning you can and you can do it from user rather than kernel space. 

  13. Using the SPI Bus 
    The SPI bus can be something of a problem because it doesn't have a well defined standard that every device conforms to. Even so, if you only want to work with one specific device it is usually easy to find a configuration that works - as long as you understand what the possibilities are. 

  14. SPI in Practice The MCP3008 AtoD 
    The SPI bus can be difficult to make work at first, but once you know what to look for about how the slave claims to work it gets easier. To demonstrate how its done let's add eight channels of 12-bit AtoD using the MCP3008.

  15. Beyond mraa - Controlling the features mraa doesn't. 
    There is a Linux-based approach to working with GPIO lines and serial buses that is worth knowing about because it provides an alternative to using the mraa library. Sometimes you need this because you are working in a language for which mraa isn't available. It also lets you access features that mraa doesn't make available. 


The Maxim 1-Wire bus is a proprietary bus that is very easy to use and has a lot of useful devices you can connect to it including their iButton security devices.  However probably the most popular of all 1-wire devices is the DS18B20 temperature sensor - it is small, very cheap and very easy to use. 

Easy to use - but only if the processor supports the 1-wire bus protocol and the Edison doesn't. However the protocol is easy enough to program in C and the Edison is fast enough to work with it without needing anything extra other than memory mapped I/O. 

The Hardware

The DS18B20 is available in an number of formats but the most common makes it look just like a standard BJT - which can sometimes be a problem when you are trying to find one.


You can also get them made up into waterproof sensors complete with cable. 


No matter how packaged they will work at 3.3V or 5V but not at 1.8V without a level converter.  Its basic specification is:

  • Measures Temperatures from -55°C to +125°C (-67°F to +257°F) 
  • ±0.5°C Accuracy from -10°C to +85°C 
  • Thermometer Resolution is User Selectable from 9 to 12 Bits 
  • Converts Temperature to 12-Bit Digital Word in 750ms (Max)

It can also be powered from the data line making the bus physically need only two wires - data and ground - however this "parasitic power" mode is difficult to make work reliably and best avoided in an initial design. 

In normal powered mode there are just three connections:



Ground needs to be connected to the system ground, VDD to 3.3V and DQ to the pullup resistor of an open collector bus. 




There can be multiple devices on the bus and each one has a unique 64bit lasered ROM code which can be used as an address to select the active devices. For simplicity it is better to start off with a single device and avoid the problem of enumerating the devices on the bus - although once you know how everything works this isn't difficult to implement. 

As we only have a single bus master, the Edison and a single slave device, the DS18B20, we can use the same single transistor level shift introduced in earlier chapters. However there is an additional problem we have to solve - fast switching between input and output. 

In the previous chapter we were able to implement the serial protocol because essentially the Edison sent the device a pulse and then the device did all the talking. This allowed the use of a single GPIO line. It first was set to output, used to send a pulse then switched to input mode ready to read the 40 bits of data. 

The problem is that changing between output and input mode is done using the SYSFS drivers and it is comparatively slow - 15 to 20 microseconds. Fortunately in the example of the DHT22 because it simply resulting in missing part of the acknowledge pulse. The Edison was ready to read data well before the device started to send it. 

In the case of the 1-wire bus things are very different. The master has to send a fast pulse on the line for every bit received and it has to be able to read the response in 15 microseconds. This is too fast to allow for time to change the line from output to input in time to read the data. However given the specification of the 1-wire bus it might be possible most of the time and with some devices. 

A more secure solution that should work with all 1-wire bus devices is to use two GPIO lines - one set to output and one set to input. 

This works because it eliminates the need to change the line's direction but it does mean that you need to use two GPIO lines to drive the 1-wire bus. As long as you can afford this doubling up of GPIO lines then the solution works well. 

The schematic of the level shifter and the DS18B20 is:


You will notice that it is the same circuit used in the previous chapter with the DS18B20 replacing the DHT22 and a second GPIO line connected. The pullup resistor R2 can be supplied by the Edison and if you opt to use its internal pullup you can omit R2 from the hardware. In the rest of the chapter is it assumed that R2 is present in the sensor and not supplied by the Edison.  

When you are first trying things out it is worth using a prototype board but this level shifter can be assembled in place on the DS18B20 to effectively convert the sensor to 1.8V operation:



Again use heat shrink sleeving to avoid shorts between component wires. The disadvantage is that now we need four wires back to the Edison whereas only three are needed for a 3.3V device. 





Last Updated ( Wednesday, 11 May 2016 )