Цифровой датчик температуры DS18B20+ One Wire и Raspberry Pi

Цифровой датчик температуры DS18B20+ One Wire и Raspberry Pi

ПРИМЕЧАНИЕ: Если вы используете последнее программное обеспечение для вашего Pi (а вы должны это делать), то вам необходимо отредактировать текстовый файл конфигурации загрузки:

Добавьте следующую строку в /boot/config.txt

dtoverlay=w1-gpio

В предыдущих руководствах мы описывали интеграцию простых датчиков и переключателей с Raspberry Pi. Эти компоненты имели простой выход вкл/выкл или высокий/низкий, который считывался Raspberry Pi. Наше руководство по датчику движения PIR, например, просто говорит «да, я обнаружил движение».

Итак, что происходит, когда мы подключаем более продвинутый датчик и хотим считывать более сложные данные? В этом руководстве мы подключим цифровой термометр 1-Wire и запрограммируем наш Raspberry Pi считывать и выводить температуру, которую он измеряет!

В датчиках 1-Wire все данные передаются по одному проводу, что делает их отличным решением для микроконтроллеров, таких как Raspberry Pi, поскольку для считывания требуется только один вывод GPIO. В дополнение к этому, большинство датчиков 1-Wire поставляются с уникальным серийным кодом (подробнее об этом позже), что означает, что вы можете подключить несколько устройств к одному микроконтроллеру без взаимных помех.

Датчик, который мы собираемся использовать в этом руководстве — это Maxim DS18B20+ Programmable Resolution 1-Wire Digital Thermometer (программируемый цифровой термометр 1-Wire с настраиваемым разрешением). DS18B20+ имеет компоновку, аналогичную транзисторам, называемую корпусом TO-92, с тремя выводами: GND, Data (DQ) и линия питания 3.3V (VDD). Вам также понадобятся несколько соединительных проводов, макетная плата и резистор 4.7 кОм (или 10 кОм).

Распиновка DS18B20+

Резистор в этой схеме используется как «подтягивающий» (pull-up) для линии данных и должен быть подключён между линиями DQ и VDD. Он обеспечивает определённый логический уровень на линии данных 1-Wire и ограничивает влияние электрических помех, если бы наш вывод оставался «плавающим». Мы также будем использовать GPIO 4 [Pin 7] в качестве управляющего вывода для считывания показаний термометра. Это выделенный вывод для работы с 1-Wire GPIO.

Подключение

  1. Подключите GPIO GND [Pin 6] на Pi к отрицательной шине на макетной плате и подключите GPIO 3.3V [Pin 1] на Pi к положительной шине на макетной плате.

  2. Вставьте DS18B20+ в вашу макетную плату, убедившись, что все три вывода находятся в разных рядах. Ознакомьтесь с расположением выводов, так как его довольно легко подключить наоборот!

  3. Подключите DS18B20+ GND [Pin 1] к отрицательной шине макетной платы.

  4. Подключите DS18B20+ VDD [Pin 3] к положительной шине макетной платы.

Подключение DS18B20+ к Raspberry Pi — шаг 1

  1. Разместите ваш резистор 4.7 кОм между DS18B20+ DQ [Pin 2] и свободным рядом на макетной плате.

  2. Подключите свободный конец резистора 4.7 кОм к положительной шине макетной платы.

Подключение DS18B20+ к Raspberry Pi — шаг 2

  1. Наконец, подключите DS18B20+ DQ [Pin 2] к GPIO 4 [Pin 7] с помощью соединительного провода.

Подключение DS18B20+ к Raspberry Pi — шаг 3

Вот и всё; теперь мы готовы к программированию!

Программирование

С небольшой настройкой DS18B20+ можно считывать напрямую из командной строки без необходимости каких-либо программ на Python. Однако для этого нам нужно вводить команду каждый раз, когда мы хотим узнать показания температуры. Чтобы познакомить вас с некоторыми концепциями взаимодействия с 1-Wire, мы сначала обратимся к нему через терминал, а затем напишем программу на Python, которая будет автоматически считывать температуру через заданные интервалы времени.

Raspberry Pi поставляется с набором драйверов для взаимодействия с устройствами. Однако загружать все драйверы при загрузке системы нецелесообразно, так как это значительно увеличит время загрузки и будет использовать значительное количество системных ресурсов для избыточных процессов. Поэтому эти драйверы хранятся как загружаемые модули, и команда modprobe используется для загрузки их в ядро Linux, когда они необходимы. Следующие две команды загружают драйверы 1-Wire и термометра на GPIO 4.

sudo modprobe w1-gpio
sudo modprobe w1-therm

Затем нам нужно сменить каталог с помощью команды cd на папку нашего устройства 1-Wire и вывести список ls устройств, чтобы убедиться, что наш термометр загрузился корректно.

cd /sys/bus/w1/devices/
ls

В драйверах устройств ваш датчик должен отображаться как серия цифр и букв. В данном случае устройство зарегистрировано как 28-000005e2fdc3. Затем вам нужно перейти к датчику с помощью команды cd, заменив наш серийный номер на ваш собственный.

cd 28-000005e2fdc3

Датчик периодически записывает данные в файл w1_slave, поэтому мы просто используем команду cat для его чтения.

cat w1_slave

Это выводит следующие две строки текста, где значение t= показывает температуру в градусах Цельсия. Десятичная точка должна быть поставлена после первых двух цифр, например, полученное нами показание температуры составляет 23.125 градусов Цельсия.

72 01 4b 46 7f ff 0e 10 57 : crc=57 YES
72 01 4b 46 7f ff 0e 10 57 t=23125
Вывод терминала с показаниями температуры DS18B20+

С точки зрения чтения данных с модуля, это всё, что требуется из терминала. Попробуйте подержать термометр в руке и снять ещё одно показание! Имея эти команды в виду, мы можем написать программу на Python для автоматического вывода данных о температуре.

Программа на Python

Наш первый шаг — импортировать необходимые модули: os позволяет нам включить наши драйверы 1-Wire и взаимодействовать с датчиком, а time позволяет нашему Raspberry Pi определять время и использовать временные интервалы в нашем коде.

import os
import time

Затем нам нужно загрузить наши драйверы:

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

Следующий шаг — определить выходной файл нашего датчика (файл w1_slave), как описано выше. Не забудьте использовать серийный код вашего собственного датчика температуры!

temp_sensor = 'sys/bus/w1/devices/28-000005e2fdc3/w1_slave'

Затем нам нужно определить переменную для необработанного значения температуры (temp_raw); две строки, выводимые датчиком, как было показано в нашем примере с терминалом. Мы могли бы просто вывести это значение сейчас. Однако мы собираемся обработать его во что-то более удобное для использования. Итак, мы открываем, читаем, записываем и затем закрываем наш файл с температурой. Здесь мы используем функцию return, чтобы вызвать эти данные на более поздней стадии нашего кода.

def temp_raw():
    f = open(temp_sensor, 'r')
    lines = f.readlines()
    f.close()
    return lines

Сначала мы проверяем нашу переменную из предыдущей функции на наличие ошибок. Если вы изучите наш исходный вывод, определённый в примере с терминалом, мы получаем две строки кода (Строка 0 = 72 01 4b 46 7f ff 0e 10 57 : crc=57 YES); мы обрезаем (strip) эту строку, оставляя только последние три символа, и проверяем наличие сигнала «YES», указывающего на успешное считывание температуры с датчика. В Python «не равно» определяется как «!=», поэтому здесь мы говорим: пока считывание не равно YES, ждём 0.2 секунды и повторяем.

def read_temp():
    lines = temp_raw()
    while lines[0].strip()[-3:] != 'YES':
        time.sleep(0.2)
        lines = temp_raw()

Как только программа убедится, что сигнал YES получен, мы переходим ко второй строке выходного кода (Строка 1 = 72 01 4b 46 7f ff 0e 10 57 t=23125). Мы находим (find) наш вывод температуры «t=», проверяем его на ошибки, обрезаем (strip) вывод от фразы «t=», оставляя только числа температуры, и выполняем два вычисления для получения значений в градусах Цельсия и Фаренгейта.

temp_output = lines[1].find('t=')
if temp_output != -1:
    temp_string = lines[1].strip()[temp_output+2:]
    temp_c = float(temp_string) / 1000.0
    temp_f = temp_c * 9.0 / 5.0 + 32.0
    return temp_c, temp_f

Наконец, мы зацикливаем наш процесс и указываем ему выводить данные о температуре каждую 1 секунду.

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

Вот и весь наш код!

Программа на Python для чтения DS18B20+

Сохраните вашу программу (я сохранил как temp_2.py) и запустите её с помощью Python для вывода показаний температуры:

sudo python temp_2.py
Вывод программы Python с показаниями температуры DS18B20+

Датчики DS18B20+ могут работать параллельно и доступны через свои уникальные серийные каталоги. Пример на Python, приведённый выше, можно отредактировать для доступа и чтения данных с нескольких датчиков!