Raspberri Pi. Урок 11. Температурная чувствительность с DS18B20

Дистрибутив Occidentalis Linux для Raspberry Pi (и с декабря 2012 г. Raspbian) поддерживает DS18B20 1-проводный температурный сенсор. Такие сенсоры 3-пиновые, как транзисторы, и являются точными цифровыми устройствами.

learn_raspberry_pi_summary.jpg

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

Поскольку Raspberry Pi не имеет аналогово-цифрового преобразователя, использование аналогового температурного сенсора, например TMP3, не возможно. Поэтому DS18B20 — хороший выбор для нашего случая.

Другие библиотеки кода

Если Вы используете Python, то библиотека DS18B20 для Raspberry Pi Вам подойдет https://github.com/timofurrer/ds18b20 (написана Timo!)

Детали

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

learn_raspberry_pi_pi.jpg

Raspberry Pi

learn_raspberry_pi_temp_probe.jpg

Цифровой температурный сенсор DS18B20 + дополнения, либо влагостойкая версия или версия для высоких температур.

Вам также понадобится резистор 4.7-10KОм, который идет в комплекте с сенсором.

learn_raspberry_pi_breadboard_half_web.jpg

Макетная плата половинного размера

 

learn_raspberry_pi_jumpers_web.jpg

Набор джамперов

learn_raspberry_pi_cobbler.jpg

Pi Cobbler

Аппаратное обеспечение

Схема макетной платы для DS18B20 показана ниже.

Однопроводные сенсоры DS18B20 могут быть подключены параллельно в отличии от большинства сенсоров. У все сенсоры используют одинаковые разъемы. Вам нужен всего один резистор 4.7K на все.

Резистор нужен, чтобы передача данных по шине данных была стабильной.

Будьте внимательны при установке DS18B20. Изогнутый край должен быть слева, как показано на картинке ниже. Если Вы установите чип наоборот, то он нагреется и сломается.

Хотя DS18B20+ и TMP36 — оба температурные сенсоры, они совершенно разные. Вы не сможете использовать TMP36 в этом уроке.

learn_raspberry_pi_breadboard-ic.png

Если Вы используете водонепроницаемую версию DS18B20, то у Вашего устройства 3 провода: красный, черный и желтый. Кроме этого есть еще провод отбраковки из голой меди, который не нужно подключать.

Если Вы используете высокотемпературную версию DS18B20, подключите оранжевую ленту к 3,3В, белые провода к земле, а синюю ленту для данных к разъему #4.

Вам нужен резистор ~4.7-10K от данных до 3.3V

learn_raspberry_pi_breadboard-probe.png
learn_raspberry_pi_project_probe.jpg

DS18B20

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

В чипе однопроводный серийный интерфейс, управляющая логическая схема и сам температурный сенсор.

Вывод чипа посылает цифровые сообщения, а интерфейс Raspbian/Occidentalis их считывает. Вы можете поэкспериментировать с устройством через командную строку или SSH, до полного запуска программы.

Добавьте поддержку одного провода

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

Вы можете редактировать файл с помощью nano. Запустите sudo nano /boot/config.txt, прокрутите в самый низ и введите следующее:

dtoverlay=w1-gpio

Затем перезапуститесь (sudo reboot). После этого войдите еще раз и введите команды ниже в окно терминала. В папке ‘devices’, папка с названием на ’28-‘ может иметь другое имя, поэтому используйте cd, чтобы задать нужное имя папки.

sudo modprobe w1-gpio

sudo modprobe w1-therm

cd /sys/bus/w1/devices

ls

cd 28-xxxx (change this to match what serial number pops up)

cat w1_slave

learn_raspberry_pi_modprobe.png

Интерфейс немного ненадежный, но к счастью, мы можем узнать есть ли пригодные показатели температуры. Это совсем как файл для чтения.

В конце строки будет YES или NO. Если написано yes, то температура в конце второй строки в 1/000 градусах цельсия. То есть на примере выше температура сначала 20.687, а потом 26.125 C.

Если у Вас подключено более одного сенсора, Вы увидите несколько файлов 28-xxx. В каждом будет уникальный серийный номер, поэтому лучше подключать сенсоры по одному, увидеть какой файл создался и промаркировать сенсор.

Программное обеспечение

Программа Python отвечает за неудавшиеся сообщения и сообщает о температуре в C и F каждую секунду.

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)

В начале программа подает команды ‘modprobe’ для запуска интерфейса.

Следующие 3 строки нужны для того, чтобы найти файл из которого следует читать сообщения.

Были сообщения о периодических зависаниях при считывании файла температуры на Raspbian. Если у Вас та же проблема, попробуйте заменить  function read_temp_raw нижеприведенным кодом. Вам также нужно будет добавить строку вверху файла ‘import subprocess’.

def read_temp_raw():

catdata = subprocess.Popen([‘cat’,device_file], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

out,err = catdata.communicate()

out_decode = out.decode(‘utf-8′)

lines = out_decode.split(‘\n’)

return lines

Считывание температуры происходит в двух функциях. read_temp_raw вызывает две строки сообщения из интерфейса. read_temp выполняет проверку сообщений до тех пор, пока не получит ‘YES’ в конце первой строки. Функция получает два результата: температуру в градусах C и температуру в градусах F.

Если Вы хотите, Вы можете разделить их надвое таким образом:

deg_c, deg_f = read_temp()

Основной цикл программы считывает и выдает значения температур.

Чтобы загрузить программу на Raspberry Pi, Вы можете использовать SSH, чтобы подключиться к Pi, запустить окно редактора с помощью следующей строки:

nano thermometer.py

Затем скопируйте код выше и сохранитесь (CTRL-x и Y).

learn_raspberry_pi_ssh_edior.png

Настройка и тестирование

Программу нужно запустить от имени администратора, поэтому введите следующую команду в терминал:

sudo python thermometer.py

Если все верно, Вы увидите следующее:

learn_raspberry_pi_readings.png

Положите палец на сенсор, чтоб его разогреть.

Добавление дополнительных сенсоров

Вы можете параллельно подключить дополнительные сенсоры DS18B20. Присоедините VCC, шины данных и земли всех сенсоров вместе. Используйте резистор 4.7K. Вы увидите множество папок /sys/bus/w1/devices/28-nnnnn, каждая из которых будет иметь уникальные серийный номер и имя папки. Образцы кода python работают только для одного сенсора, поэтому Вам придется его адаптировать, если Вы хотите считывать данные с нескольких сенсоров сразу.