Pi IoT In Python Using Linux Drivers -1-Wire And The DS18B20
Written by Harry Fairhead & Mike James   
Monday, 12 July 2021
Article Index
Pi IoT In Python Using Linux Drivers -1-Wire And The DS18B20
Listing Devices
Folders

Once the driver is loaded and the device is recognized you will find a set of new folders in the w1/devices folder:

oneWirefolders

Most of the files have functions that are obvious from their names but there are some points of detail:

 

  • name Returns the name of the device which is the same as
    its serial number.

  • w1_slave uses the nine bytes that the device returns in a check
    sum -if the check sum is OK then the string ends with
    t= the temperature in millidegrees Celsius.

  • temperature Returns the temperature in millidegrees Celsius – the
    string is not null terminated.

  • resolution Returns the number of bits of resolution used. Writing
    a number to it sets the resolution if the device supports
    it.

  • ext_power Reads 0 if the device is parasitic powered and 1 if
    externally powered.

  • alarms Reads or writes the high and low temperatures, TH and
    TL, for the temperature alarm. The values are space
    separated and the lowest value is automatically used
    for TL.

  • eeprom Saves the current configuration if you write “save” to
    it and restores it if you write “restore”. It supports a
    limited number of writes so should be used sparingly.

 

It is also worth knowing that the device is also added to the hwmon folder and that folder is replicated in the devices folder. The reason for this is to allow integration with any hwmon software you may have – there are no advantages over using the device directly.

The 1-wire master also has some useful files in the w1_bus_master folder:

onewirefolder2

therm_bulk_read Takes a temperature from all devices

w1_master_add Manually registers a slave device

w1_master_attempts Number of times a search was attempted

w1_master_max_slave_count Maximum number of slaves to search for

w1_master_name Name of the device (w1_bus_masterX)

w1_master_pullup 5V strong pull-up 0 enabled, 1 disabled

w1_master_remove Manually remove a slave device

w1_master_search Number of searches left to do

w1_master_slave_count Number of slaves found

w1_master_slaves Names of the slaves, one per line

w1_master_timeout Delay in seconds between searches

w1_master_timeout_us Delay in microseconds between searches

Normally a temperature conversion is triggered when you read the appropriate file but if you write trigger to the therm_bulk_read file all of the connected devices are read and the readings stored for the next time you read the device. Reading the file returns 0 if no bulk conversion is in progress, -1 if at least one device is still converting and 1 if conversion is complete but there is still data to be read from the devices.

You can set the w1_master_search to a small number if the attached devices rarely change. If your devices never change you could set it to zero and use w1_master_add to add the serial numbers.

The w1_master_timeout and w1_master_timeout_us determine the interval between searches for devices. Each time a search occurs w1_master_search is decremented and w1_master_attempts is incremented.

You can use the w1_master_slave_count and w1_master_slaves as an alternative way of discovering what devices are installed:

def getDevices():
    fdr = io.open("/sys/bus/w1/drivers/w1_master_driver/
                 w1_bus_master1/w1_master_slaves", "r")
    buffer=fdr.read()
    fdr.close()
    return buffer.split()

Notice that the names are separated by newline characters and this is where the split function splits the string.

A complete program that reads and displays the data of the first device connected to the 1-Wire bus is:

import subprocess
import io
def load1w(pin):
        indicator = "w1-gpio"
        command =["sudo", "dtoverlay", "w1-gpio",
"gpiopin="+str(pin)] temp = subprocess.Popen(["sudo", "dtparam",
"-l"], stdout = subprocess.PIPE) output = str(temp.communicate()) print(output,flush=True) if output.find(indicator)==-1: temp = subprocess.Popen(command,
stdout = subprocess.PIPE) output = str(temp.communicate()) print(output,flush=True) def getDevices(): fdr = io.open("/sys/bus/w1/drivers/w1_master_driver/
w1_bus_master1/w1_master_slaves", "r") buffer=fdr.read() fdr.close() return buffer.split() def getData(dev,name): fdr = io.open(
"/sys/bus/w1/devices/"+dev+"/"+name, "r") data=fdr.read() fdr.close() return data load1w(4) devs=getDevices() name=getData(devs[0], "name") print("Name ",name) resolution=getData(devs[0], "resolution") print("Resolution ",resolution) w1_slave=getData(devs[0], "w1_slave") print("w1_slave ",w1_slave) temperature=getData(devs[0], "temperature") print("temperature ",temperature) temperature = int(temperature) / 1000 print("temperature ",temperature,"C") alarms=getData(devs[0], "alarms") print("Alarms ",alarms)

In Chapter But Not In This Extract

  • Netlink
  • Reading The DS18B20 Using Netlink
  • The Complete Netlink Program
  • Active Pull-Up
  • One Wire File System (OWFS)

 

Summary

  • The 1-Wire bus is easy to use and has good Linux support.

  • The w1-gpio driver will use any GPIO pin to implement a 1-Wire bus in software.

  • All 1-wire devices have a unique serial number, which also codes for the type of the device.

  • You can list devices using directory operations or you can use the driver to interrogate the master.

  • The DS18B20 Temperature Sensor is a good example of a 1-wire device.

  • The 1-Wire driver is one of the few Linux drivers that supports Netlink, a socket-based protocol that is designed to replace ioctl.

  • You can power a 1-wire device over the line that is used for data. This only works if you use a strong pull-up in the form of a transistor.

  • If you want to make extensive use of 1-wire devices, it might be worth looking into OWFS – the One Wire File System.

 

Raspberry Pi IoT In PythonUsing Linux Drivers
Second Edition

By Harry Fairhead & Mike James

DriverPython2e360

Buy from Amazon.

Contents

  1.  Choosing A Pi For IoT
  2.  Getting Started With Python
  3.   Drivers: A First Program
  4.  The GPIO Character Driver 
  5.  GPIO Using Ioct ***NEW!!
  6.  GPIO Events
  7.  The Device Tree
       Extract: The DHT22
  8.  Some Electronics
  9.  Pulse Width Modulation
       Extract: PWM *
  10. SPI Devices
  11. I2C Basics
       Extract: I2C *
  12. The I2C Linux Driver
  13. Advanced I2C
  14. Sensor Drivers
  15. 1-Wire Bus
       Extract 1-Wire And The DS18B20 *
  16. Going Further With Drivers
  17. Appendix I

*From the first edition waiting for update.

 <ASIN:B0CT46R6LF>

To be informed about new articles on I Programmer, sign up for our weekly newsletter, subscribe to the RSS feed and follow us on Twitter, Facebook or Linkedin.

Banner


Paul Allen's Living Computers Sold For Record Prices
04/10/2024

Auction house Christie's of New York broke existing records for sales of rare and iconic computers when it sold the collection that the late Paul Allen, co-founder of Microsoft, had assembled to  [ ... ]



Java Version 23 Released
30/09/2024

It was in April 2024 that we had Java 22. Now after just 6 months there's version 23, which is a STS release with lots of features in preview status.


More News

kotlin book

 

Comments




or email your comment to: comments@i-programmer.info

<ASIN:1871962587>

<ASIN:B07S1K8KLW>

<ASIN:1871962455>

<ASIN:1871962463>

 



Last Updated ( Monday, 12 July 2021 )