2

I have this temperature sensor (DS18B20). I've followed the tutorial on Adafruit (here). First I had to setup some modules by doing:

sudo modprobe w1-gpio
sudo modprobe w1-therm

Then I check the serial number of the sensor (28-000005b89af). When I used the command cat w1_slave in the correct directory, it printed correctly the temperature (checked it which other thermometer):

a2 01 4b 46 7f ff 0e 10 d8 : crc=d8 YES
a2 01 4b 46 7f ff 0e 10 d8 t=26125 (<--- this is the temperature factor 1000)

But then Adafruit provides me with an python script that isn't running as it should.

import os
import glob
import time

os.system('modprobe w1-gpio')
os.system('modprobe w1-therm')

base_dir = '/sys/bus/w1/devices/'
device_folder = glob.glob(base_dir + '28-000005b89af')[0] #serial number of my sensor
device_file = device_folder + '/w1_slave'

def read_temp_raw():
    f = open(device_file, 'r')
    lines = f.readlines()
    f.close()
    return lines

def read_temp():
    lines = read_temp_raw()
    while lines[0].strip()[-3:] != 'YES':
        time.sleep(0.2)
        lines = read_temp_raw()
    equals_pos = lines[1].find('t=')
    if equals_pos != -1:
        temp_string = lines[1][equals_pos+2:]
        temp_c = float(temp_string) / 1000.0
        temp_f = temp_c * 9.0 / 5.0 + 32.0
        return temp_c, temp_f

while True:
    print(read_temp())  
    time.sleep(1)

When I run it as root I get an error (line 9) device_folder = glob.glob(base_dir + '28-000005b89af')[0] IndexError: list index out of range.

What causes this error? And how can I fix it?

3 Answers 3

2

That seems overly complicated for the simple task it is performing.

#!/usr/bin/env python

import time

DS18B20="/sys/bus/w1/devices/28-000005d34cd2/w1_slave"

r = 0

while True:

   r += 1

   f = open(DS18B20, "r")
   data = f.read()
   f.close()

   (discard, sep, reading) = data.partition(' t=')

   t = float(reading) / 1000.0

   print("{} {:.1f}".format(r, t))

   time.sleep(3.0)

You could just replace DS18B20 with your devices identifier.

0

I fixed this issue. I believe when you call

os.system('modprobe w1-gpio')
os.system('modprobe w1-therm')

in the python code, the glob tries to access the directory prior to it being created.

I added a time.sleep(5) and I have not had an issue since. Also I'm not over clocking.

0

This number is the serial number of HIS sensor

28-000005b89af

change to

28*

and it works for me.

device_folder = glob.glob(base_dir + '28*')[0]

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.