Raspberry Pi: считывание температуры с датчика DS18B20 (Python)

Узнайте, как подключить Raspberry Pi к датчику температуры DS18B20 и получить показания температуры с помощью программы на Python.

Raspberry Pi считывание температуры с датчика DS18B20 Python

В этом руководстве мы рассмотрим следующие основные темы:

Предварительные требования

Прежде чем продолжить работу с этим руководством, проверьте следующие предварительные требования.

  1. Ознакомьтесь с платой Raspberry Pi — если вы не знакомы с Raspberry Pi, вы можете прочитать наше :doc:`руководство по началу работы с Raspberry Pi </raspberry/rnt/getting-started-with-raspberry-pi/index>`_.

  2. Вы должны знать, как запускать и создавать Python-файлы на вашем Raspberry Pi. Мы предпочитаем программировать наш Raspberry Pi через SSH, используя расширение в VS Code. У нас есть подробное руководство по этой теме: :doc:`Программирование Raspberry Pi удаленно с помощью VS Code (Remote-SSH) </raspberry/rnt/raspberry-pi-remote-ssh-vs-code/index>`_.

  3. Знайте, как использовать GPIO Raspberry Pi, чтобы правильно собрать схему. Прочитайте следующее руководство: :doc:`Распиновка Raspberry Pi: как использовать GPIO Raspberry Pi? </raspberry/rnt/raspberry-pi-pinout-gpios/index>`_

Знакомство с датчиком температуры DS18B20

Датчик температуры DS18B20 — это цифровой датчик температуры с интерфейсом one-wire. Это означает, что для связи с вашим ESP32 ему требуется только одна линия данных (и GND).

Он может питаться от внешнего источника питания или может получать питание от линии данных (так называемый «паразитный режим»), что устраняет необходимость во внешнем источнике питания.

Распиновка датчика температуры DS18B20

Каждый датчик температуры DS18B20 имеет уникальный 64-битный серийный код. Это позволяет подключить несколько датчиков к одной шине данных. Таким образом, вы можете получать температуру от нескольких датчиков, используя всего один GPIO.

Датчик температуры DS18B20 также доступен в водонепроницаемом исполнении.

Датчик температуры DS18B20 водонепроницаемая версия

Вот краткое описание наиболее важных характеристик датчика температуры DS18B20:

  • Обмен данными по протоколу one-wire

  • Диапазон напряжения питания: от 3,0 В до 5,5 В

  • Рабочий диапазон температур: от -55 °C до +125 °C

  • Точность ±0,5 °C (в диапазоне от -10 °C до 85 °C)

Для получения дополнительной информации обратитесь к даташиту DS18B20.

Необходимые компоненты

Для выполнения этого руководства вам понадобятся следующие компоненты:

Вы можете использовать приведенные выше ссылки или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!

Подключение датчика температуры DS18B20 к Raspberry Pi

Датчик температуры DS18B20 имеет три вывода: GND, данные и VCC. Датчик температуры DS18B20 может питаться через вывод VDD (нормальный режим) или может получать питание от линии данных (паразитный режим). Вы можете выбрать любой режим. Мы предпочитаем использовать нормальный режим.

Распиновка датчика температуры DS18B20

Если вы используете водонепроницаемую версию, вы можете определить каждый вывод по его цвету:

  • черный: GND

  • красный: VDD

  • желтый: линия данных

Датчик температуры DS18B20 обменивается данными по протоколу one-wire. Raspberry Pi поддерживает one-wire на любом выводе GPIO, но по умолчанию используется GPIO 4. Поэтому мы подключим вывод данных датчика к GPIO 4. Если вам нужно использовать другой GPIO, смотрите один из следующих разделов, чтобы узнать, как включить шину one-wire на другом выводе.

Raspberry Pi с датчиком температуры DS18B20 схема подключения

DS18B20

Raspberry Pi

GND

GND

Data (DQ)

One-wire вывод по умолчанию — GPIO 4. Также необходимо подключить резистор 4,7 кОм между линией данных и VCC

VDD

3V3(OUT)

Включение интерфейса One-Wire на Raspberry Pi

Чтобы включить интерфейс one-wire, откройте окно терминала на вашем Raspberry Pi (например, через SSH), введите следующую команду и нажмите Enter.

sudo raspi-config

Откроется следующее меню. Выберите Interface Options:

Включение интерфейса One-Wire на Raspberry Pi

Выберите 1-wire.

Включение интерфейса one-wire

И включите его.

Интерфейс one-wire включен

Наконец, выберите Finish, а затем перезагрузите Raspberry Pi.

One-wire включен на Raspberry Pi

Включение One-Wire на другом GPIO (не по умолчанию)

GPIO по умолчанию для one-wire на Raspberry Pi — это GPIO 4. Если вы хотите включить шину one-wire на другом выводе, вам нужно выполнить следующие команды.

Откройте и отредактируйте файл config.txt с помощью:

sudo nano /boot/config.txt

Добавьте следующую строку в конец файла, где x — это GPIO, который вы хотите использовать для one-wire:

dtoverlay=w1-gpio,gpiopin=x

Например, если вы хотите включить one-wire на GPIO22, это будет выглядеть следующим образом:

dtoverlay=w1-gpio,gpiopin=22

Нажмите CTRL-X, затем нажмите Y и Enter, чтобы сохранить изменения.

Перезагрузите Raspberry Pi с помощью:

sudo reboot

Тестирование датчика температуры

После подключения датчика к Raspberry Pi давайте просто проверим, что он может найти датчик и сообщить показания, прежде чем писать код на Python.

Датчик температуры DS18B20 с Raspberry Pi

Выполните следующие команды в окне терминала:

Эта команда загружает модуль ядра w1-gpio, который отвечает за включение вывода GPIO для обмена данными по протоколу one-wire:

sudo modprobe w1-gpio

Затем следующая строка загружает модуль ядра w1-therm, который добавляет поддержку специфических функций DS18B20, таких как чтение данных температуры с датчика.

sudo modprobe w1-therm

Затем измените текущий рабочий каталог на /sys/bus/w1/devices/. В этом каталоге отображается информация о подключенных устройствах one-wire, включая датчик DS18B20 (если он найден).

cd /sys/bus/w1/devices/

Наконец, выведите содержимое папки devices, которая должна показать один или несколько каталогов, каждый из которых представляет устройство one-wire.

ls

В случае датчика температуры DS18B20 вы увидите папку вида 28-xxxxxxxxxxxx, где xxxxxxxxxxxx — уникальный адрес вашего датчика DS18B20.

Обнаружение устройства one-wire для DS18B20

Перейдите в каталог, представляющий датчик DS18B20. Например, в моем случае это выглядит следующим образом (используйте каталог вашего датчика):

cd 28-03173311a0ff

После перехода в каталог, представляющий датчик DS18B20, вы можете использовать команду cat для чтения содержимого файла w1_slave. Этот файл содержит необработанные данные температуры в определенном формате.

cat w1_slave

Содержимое файла w1_slave будет выглядеть примерно так, как показано на следующем скриншоте (первая строка содержит статус чтения: YES означает допустимое чтение, а вторая строка показывает температуру (нужно разделить на 1000, чтобы получить значение в градусах Цельсия).

Чтение данных one-wire slave

Если до этого момента все прошло гладко, вы готовы написать программу на Python для получения показаний.

Raspberry Pi с DS18B20 – получение показаний температуры (Python-скрипт)

Следующий скрипт выводит показания температуры от датчика температуры DS18B20 в оболочку Python. Показания выводятся как в градусах Цельсия, так и в градусах Фаренгейта.

Создайте новый Python-файл с именем temp-ds18b20.py и скопируйте следующий код.

# Complete Project Details: https://RandomNerdTutorials.com/raspberry-pi-ds18b20-python/

# Based on the Adafruit example: https://github.com/adafruit/Adafruit_Learning_System_Guides/blob/main/Raspberry_Pi_DS18B20_Temperature_Sensing/code.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 + '28*')[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)

Исходный код

Как работает код

В этом коде мы, по сути, воспроизведем предыдущие шаги в Python-скрипте для получения показаний и отобразим их в оболочке Python.

Начните с импорта необходимых библиотек:

import os
import glob
import time

Библиотека os позволяет взаимодействовать с операционной системой, и в этом коде она используется для выполнения системных команд (os.system) для загрузки необходимых модулей ядра для обмена данными по протоколу one-wire с датчиком DS18B20 (аналогично тому, что мы делали ранее в терминале).

Библиотека glob помогает находить файлы или каталоги, соответствующие определенному шаблону, и здесь она используется для поиска каталога, представляющего датчик DS18B20, на основе его уникального префикса адреса.

Библиотека time используется для введения задержек в коде, чтобы дать датчику достаточно времени для получения допустимых показаний.

Далее загрузите следующие модули ядра (w1-gpio и w1-therm) для взаимодействия с датчиком DS18B20 по протоколу обмена данными one-wire. Эти команды используют функцию os.system для выполнения shell-команд внутри Python.

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

Следующие строки настраивают пути и имена файлов для чтения данных температуры:

base_dir = '/sys/bus/w1/devices/'
device_folder = glob.glob(base_dir + '28*')[0]
device_file = device_folder + '/w1_slave'
  • base_dir представляет каталог, где расположены устройства one-wire в файловой системе /sys.

  • device_folder получается с помощью функции glob.glob, которая ищет каталоги, соответствующие шаблону „28*“. Датчики DS18B20 обычно имеют уникальный адрес, начинающийся с 28. Это гарантирует, что код найдет правильную папку, представляющую датчик DS18B20, подключенный к Raspberry Pi.

  • device_file представляет путь к файлу w1_slave, который содержит необработанные данные температуры.

Функция read_temp_raw() получает показания температуры из файла w1_slave (именно там они хранятся). Эта функция открывает файл w1_slave, построчно считывает его содержимое, а затем возвращает список, содержащий строки.

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

Наконец, функция read_temp() считывает данные температуры.

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

Сначала она проверяет, можно ли найти «YES» в первой строке, как мы видели ранее. Если данные недопустимы, она ждет 0,2 секунды и повторяет попытку, пока не будет получено допустимое чтение.

while lines[0].strip()[-3:] != 'YES':
    time.sleep(0.2)
    lines = read_temp_raw()
    equals_pos = lines[1].find('t=')

Затем функция извлекает значение температуры из второй строки после t= и преобразует его в градусы Цельсия (temp_c) и Фаренгейта (temp_f). Она возвращает оба значения температуры. Как мы видели ранее, нам нужно разделить на 1000, чтобы получить температуру в градусах Цельсия. Затем нам просто нужно преобразовать это значение в градусы Фаренгейта.

temp_c = float(temp_string) / 1000.0
temp_f = temp_c * 9.0 / 5.0 + 32.0
return temp_c, temp_f

Наконец, у нас есть цикл (while True), который вызывает функцию read_temp() для получения температуры в градусах Цельсия и Фаренгейта, а затем выводит значения с двумя десятичными знаками. Цикл работает бесконечно с задержкой в одну секунду между каждым чтением температуры.

while True:
    temperature_celsius, temperature_fahrenheit = read_temp()
    print(f'Temperature: {temperature_celsius:.2f} °C')
    print(f'Temperature: {temperature_fahrenheit:.2f} °F')
    print('')
    time.sleep(1)

Демонстрация

Сохраните ваш Python-файл. Затем запустите его на вашем Raspberry Pi. Выполните следующую команду в каталоге вашего файла проекта (используйте имя вашего файла):

python temp_ds18b20.py

После запуска скрипта новые показания температуры будут публиковаться в оболочке Python каждую секунду. Прикоснитесь к датчику, чтобы увидеть, как температура увеличивается. Он будет отображать показания как в градусах Цельсия, так и в градусах Фаренгейта.

Демонстрация показаний температуры DS18B20 Raspberry Pi

Заключение

В этом руководстве вы узнали, как получать показания температуры от DS18B20 и выводить результаты в оболочке Python.

Надеемся, вы нашли это руководство полезным. У нас есть руководства для других популярных датчиков:

Вы можете ознакомиться со всеми нашими проектами для Raspberry Pi по следующей ссылке:

Спасибо за чтение.