Дистрибутив Occidentalis Linux для Raspberry Pi (и с декабря 2012 г. Raspbian) поддерживает DS18B20 1-проводный температурный сенсор. Такие сенсоры 3-пиновые, как транзисторы, и являются точными цифровыми устройствами.
В этом уроке Вы узнаете как использовать DS18B20 с Raspberry Pi, чтобы измерять температуру.
Поскольку Raspberry Pi не имеет аналогово-цифрового преобразователя, использование аналогового температурного сенсора, например TMP3, не возможно. Поэтому DS18B20 — хороший выбор для нашего случая.
Другие библиотеки кода
Если Вы используете Python, то библиотека DS18B20 для Raspberry Pi Вам подойдет https://github.com/timofurrer/ds18b20 (написана Timo!)
Детали
Для этого проекта Вам понадобятся следующие детали:
Аппаратное обеспечение
Схема макетной платы для DS18B20 показана ниже.
Однопроводные сенсоры DS18B20 могут быть подключены параллельно в отличии от большинства сенсоров. У все сенсоры используют одинаковые разъемы. Вам нужен всего один резистор 4.7K на все.
Резистор нужен, чтобы передача данных по шине данных была стабильной.
Будьте внимательны при установке DS18B20. Изогнутый край должен быть слева, как показано на картинке ниже. Если Вы установите чип наоборот, то он нагреется и сломается.
Хотя DS18B20+ и TMP36 — оба температурные сенсоры, они совершенно разные. Вы не сможете использовать TMP36 в этом уроке.
Если Вы используете водонепроницаемую версию DS18B20, то у Вашего устройства 3 провода: красный, черный и желтый. Кроме этого есть еще провод отбраковки из голой меди, который не нужно подключать.
Если Вы используете высокотемпературную версию DS18B20, подключите оранжевую ленту к 3,3В, белые провода к земле, а синюю ленту для данных к разъему #4.
Вам нужен резистор ~4.7-10K от данных до 3.3V
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
Интерфейс немного ненадежный, но к счастью, мы можем узнать есть ли пригодные показатели температуры. Это совсем как файл для чтения.
В конце строки будет 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).
Настройка и тестирование
Программу нужно запустить от имени администратора, поэтому введите следующую команду в терминал:
sudo python thermometer.py
Если все верно, Вы увидите следующее:
Положите палец на сенсор, чтоб его разогреть.
Добавление дополнительных сенсоров
Вы можете параллельно подключить дополнительные сенсоры DS18B20. Присоедините VCC, шины данных и земли всех сенсоров вместе. Используйте резистор 4.7K. Вы увидите множество папок /sys/bus/w1/devices/28-nnnnn, каждая из которых будет иметь уникальные серийный номер и имя папки. Образцы кода python работают только для одного сенсора, поэтому Вам придется его адаптировать, если Вы хотите считывать данные с нескольких сенсоров сразу.