Raspberry Pi и OneWire датчики

Рассмотрим пример подключения OneWire датчиков к Raspberry Pi на примере датчика температуры DS18B20. Применение этого датчика будет использоваться в следующих статьях.
Для подключения нам понадобиться: плата Raspberry Pi, датчик температуры DS18B20, сопротивление от 4.7 кОм до 10 кОм, макетная плата и немного проводов.
Необходимо собрать схему, как показано на изображении выше, после чего можно включать питание.
Настройка
Подключаемся к плате по SSH, и первым делом необходимо добавить поддержку OneWire в config.txt.
Открываем файл в текстовом редакторе nano:
sudo nano /boot/config.txt
И добавляем в конец файла следующую строчку:
dtoverlay=w1-gpio
Сохраняем изменения в файле и перезагружаем плату sudo reboot.
После перезагрузки приступим к проверке работоспособности датчика, для этого добавим модули w1-gpio и w1-therm в ядро следующими командами:
sudo modprobe w1-gpio
sudo modprobe w1-therm
Перейдем в каталог с устройствами OneWire и посмотрим доступные устройства
cd /sys/bus/w1/devices
ls
Должны увидеть следующие каталоги
pi@raspberrypi /sys/bus/w1/devices $ ls
10-0008019c26d2 w1_bus_master1
Каталог 10-0008019c26d2 и есть уникальный номер датчика DS18B20.
Перейдем в этот каталог
cd 10-0008019c26d2
И выведем содержимое файла w1_slave на экран
cat w1_slave
На экране должны появиться следующие 2 строчки:
pi@raspberrypi /sys/bus/w1/devices/10-0008019c26d2 $ cat w1_slave
2b 00 4b 46 ff ff 02 10 8a : crc=8a YES
2b 00 4b 46 ff ff 02 10 8a t=21625
Если в конце первой строчки будет YES, то в конце второй строчки будет температура в градусах Цельсия умноженная на 1000. В моем случае это 21.652 ℃.
Использование
Для удобства просмотра и дальнейшей обработки температуры удобно использовать скрипт на Python.
Создадим файл temperature.py:
nano temperature.py
И добавим в него следующее содержимое:
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 + '10*')[0]
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)
Сохраним перед выходом и запусти командой:
sudo python temperature.py
На экране каждую секунду будет обновляться значение температуры, в первом столбце в градусах Цельсия, во втором в градусах Фаренгейта.
pi@raspberrypi ~ $ sudo python temperature.py
(21.5, 70.7)
(21.562, 70.8116)
(21.625, 70.925)
(22.687, 72.8366)
(23.937, 75.0866)
выдает ошибку
pi@raspberrypi:~ $ sudo python temperature.py
Traceback (most recent call last):
File «temperature.py», line 9, in <module>
device_folder = glob.glob(base_dir + '10*')[0]
IndexError: list index out of range
все разобрался