Reading Temperature from a 1-Wire Sensor

The second part of this week’s 2-Bullet Tuesday! See the first part here.
You can subscribe to the newsletter on the 2-Bullet Tuesday page!

Omega Tip of the Week: Using a 1-Wire Temperature Sensor

This week we’ll cover how to read the ambient temperature using the popular (and affordable) DS18B20 1-Wire temperature sensor! We’ll first wire up the sensor to our Omega, register a software 1-Wire bus master, and finally, read the temperature data.

The temperature sensor, like most 1-Wire devices, has three available connectors: the power, ground, and data line. Treat the side with the flat part as the front and wire it up like so:

  • Connect the ground (left pin) to the Omega’s ground.
  • Connect a 4.7kΩ pull-up resistor between the the data line (middle pin) and power pin (right pin).
  • Connect the data line to a GPIO on the Omega; we’ll be using GPIO19 for this example.
  • Provide 3.3V to the power pin.

Your setup should look something like this:

So we have our 1-Wire slave device connected to the Omega, what now? Well, 1-Wire is a master-slave communications bus and so the Omega will need to become the 1-Wire bus master. The Omega has dedicated hardware for several types of buses (I2C, SPI, I2S), but not for 1-Wire. So instead we’ll use software to imitate a 1-Wire bus master on one of our free GPIOs:

insmod w1-gpio-custom bus0=0,19,0

We’re telling Linux to load the w1-gpio-custom module and to setup bus 0 to use GPIO19 in non-open drain mode.

If everything worked properly, you’ll now be able to access to the /sys/devices/w1_bus_master1 directory. This directory will be our 1-Wire command centre!

To check how many slave devices are connected, we can cat /sys/devices/w1_bus_master1/w1_master_slave_count, and to find out the unique ID of each connected device, cat /sys/devices/w1_bus_master1/w1_master_slaves

1-Wire sensors all have a unique ID that is used when communicating with bus masters. While your sensor’s unique ID will be, well, unique, the command to read from it will follow this pattern:

cat /sys/devices/w1_bus_master1/(UniqueDeviceID)/w1_slave

It turns out our DS18B20 sensor’s unique ID is 28-041686e9d1ff. So we can run the following command to read data from the sensor:

root@Omega-7ADD:~# cat /sys/devices/w1_bus_master1/28-041686e9d1ff/w1_slave
7f 01 4b 46 7f ff 0c 10 ba : crc=ba YES
7f 01 4b 46 7f ff 0c 10 ba t=23937

The command shows us all of the output from the sensor, but we’re only interested in the t=23937 part that indicates the temperature is 23.937˚C.

Let’s do some string manipulation to isolate the temperature reading:

root@Omega-7ADD:~# awk -F= '/t=/ {printf "%.03f\n", $2/1000}' /sys/devices/w1_bus_master1/28-041686e9d1ff/w1_slave
23.875

And that’s it! For more info on 1-Wire and the Omega, check out the 1-Wire article in our documentation and Wikipedia for more info on the 1-Wire protocol.

 

Let us know what kind of stuff you would like to see featured on 2-Bullet Tuesday! Send a tweet to @OnionIoT with your suggestions!

Thanks for reading! Have a great week!

Team Onion

 

 

P.S. — Our Omega2 Indiegogo campaign will be ending in the near future! Don’t miss your chance to get the Omega2 for just $5!

Share

Lazar Demin

Leave your comment