Raspberry Pi и OneWire датчики

6 сентября 2015, 14:44

Рассмотрим пример подключения 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)
Поделиться
Запинить
2 комментария
Никита Шелестов

выдает ошибку
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

Никита Шелестов

все разобрался

Популярное