Take the 2-minute tour ×
Raspberry Pi Stack Exchange is a question and answer site for users and developers of hardware and software for Raspberry Pi. It's 100% free, no registration required.

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?

share|improve this question

2 Answers 2

up vote 1 down vote accepted

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.

share|improve this answer

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.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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