
Схема подключения датчика показана на рисунке. Запитайте DS18B20 от шины +5В. При питании от +5 Вольт датчик надежнее измеряет высокие и низкие температуры.

Сопротивление резистора 4,7 - 10 кОм. Откройте терминал и подключите модули командами
sudo modprobe w1-gpio
sudo modprobe w1-therm
Добавьте строку dtoverlay=w1-gpio в файл /boot/config.txt командой sudo nano /boot/config.txt, если ее там нет:

Перезагрузите - sudo reboot.
Проверьте датчик. Дайте команды
ls /sys/bus/w1/devices
Вы должны увидеть каталог с названием идентификатора датчика. Перейдите в каталог датчика:
cd /sys/bus/w1/devices/<ID_датчика>
Распечатайте файл w1_slave
cat w1_slave
В конце второй строки вы увидите что-то наподобие t=-20562. Если это так, значит датчик DS18B20 работает.
У меня датчик измеряет температуру наружного воздуха.

Для вывода показаний на веб-страницу используется Web сервер на Python'е [2, p. 172]. Установите его командой
sudo apt-get install python-bottle
Считывание показаний и вывод значений в браузер реализованы в одном скрипте bottle-test1.py
#!/usr/bin/python
import glob
import time
from bottle import route, run, template
from datetime import datetime
from time import strftime
base_dir = '/sys/bus/w1/devices/'
device_folder = glob.glob(base_dir + '28-041654f0dcff')[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
return temp_c
@route('/')
def index(name='temp'):
t1=read_temp()
data_entry = "{0},{1}\n".format(strftime("%d-%m-%Y %H:%M:%S"),"%.3f" % t1)
return template('Opros DS18B20<br><b> {{tmp}}*C the outdoor temperature</b>', tmp=data_entry)
run(host='0.0.0.0', port=80)
Если не работает, то в последней строке вместо нулей попробуйте текущий IP адрес Raspberry Pi.
Фрагмент скрипта для чтения показаний взят из [1]. Форматирование вывода - из [3]. Остальная часть - из [2, p. 172].
Выделите мышкой текст скрипта, щелкните правой кнопкой мыши (ПКМ) и в меню выберите Копировать. Откройте редактор командой nano bottle-test1.py, щелкните ПКМ в поле редактора и в меню выберите Вставить. Текст будет вставлен в поле редактора, начиная с позиции курсора [2, p. 65]. Если в последней строке появился ненужный комментарий, то удалите его.
Не забудьте заменить идентификатор датчика и IP адрес Raspberry Pi на свои (в скрипте подчеркнуты). В тексте скрипта строго соблюдайте отступы, в Python'е это важно.
Чтобы узнать IP адрес Raspberry Pi, дайте в терминале команду hostname -I (заглавная i):

Чтобы скрипт запустился, ему надо дать права на исполнение командой
chmod +x bottle-test1.py
Находясь в каталоге скрипта, запустите его командой
sudo ./bottle-test1.py
Можно запускать из любого места, но при этом надо указать полный (абсолютный) путь к скрипту, например, так: sudo /home/pi/bottle-test1.py
Не закрывайте программу! Web сервер работает только тогда, когда программа открыта. Теперь на другом компьютере локальной сети откройте браузер и в адресной строке введите IP адрес Raspberry Pi. Вы увидите примерно следующее:

Если ваш браузер вместо открытия страницы начинает поиск по этому адресу и выводит кучу сообщений о невозможности найти такой текст, значит вам надо изменить настройки браузера. В настройках браузера отмените поиск по адресной строке. В Mozilla Firefox в разделе Поиск снимите галку "Использовать адресную строку для поиска и навигации". Теперь браузер должен открывать адрес, а не начинать поиск.
Python не приемлет русский язык, поэтому текст на английском. При необходимости используйте транслитерацию.
Для обновления показаний перезагрузите (обновите) веб-страницу. Для выхода из программы нажмите Ctrl+C.
Если время показывает неправильно, то настройте временнУю зону (часовой пояс). Запустите sudo raspi-config и пройдите Localisation Options ► Change Timezone. Я выбираю Asia ► Yakutsk.
Чтобы можно было продолжать работу в терминале, запустите скрипт в фоновом режиме, используя команду nohup:
nohup sudo ./bottle-test1.py &

Нажмите Ctrl+C, чтобы появилось приглашение командной строки.
Для завершения введите sudo kill <ID процесса>. Если вы вдруг забыли идентификатор процесса, то можно узнать его с помощью утилиты htop. Установите ее командой
sudo apt-get install htop
Запустите утилиту htop. В верхней части окна время от времени будут появляться строки с названиями запущенных программ. Дождитесь, когда появится строка с названием скрипта, и в первой колонке PID посмотрите идентификатор процесса (на скриншоте подчеркнут). Закройте программу, нажав клавишу q.


На данный момент вы можете смотреть показания по локальной сети. Чтобы смотреть показания датчика по интернету, нужно сделать дополнительные настройки. Об этом читайте в статье Как получить доступ по интернету к датчикам в квартире. В настройках port forwarding укажите порт 80. Если планируете подключаться по SSH, то пробросьте еще порт 22.
Для справки: система Raspbian Jessie (образ 2017-07-05-raspbian-jessie.img) после update и upgrade.
В Raspbian Stretch тоже работает.

P.S. Аналогичный скрипт для двух датчиков DS18B20, измеряющих температуру наружного воздуха и температуру батареи отопления:
#!/usr/bin/python
import glob
import time
from bottle import route, run, template
from datetime import datetime
from time import strftime
base_dir = '/sys/bus/w1/devices/'
device_folder = glob.glob(base_dir + '28-041654f0dcff')[0]
device_folder1 = glob.glob(base_dir + '28-0416508db4ff')[0]
device_file = device_folder + '/w1_slave'
device_file1 = device_folder1 + '/w1_slave'
def read_temp_raw():
f = open(device_file, 'r')
lines = f.readlines()
f.close()
return lines
def read_temp_raw1():
f = open(device_file1, '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
return temp_c
def read_temp1():
lines = read_temp_raw1()
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_c1 = float(temp_string) / 1000.0
return temp_c1
@route('/')
def index(name='temp'):
t1=read_temp()
data_entry = "{0},{1}\n".format(strftime("%d-%m-%Y %H:%M:%S"),"%.3f" % t1)
t2=read_temp1()
data_entry1 = "{0},{1}\n".format(strftime("%d-%m-%Y %H:%M:%S"),"%.3f" % t2)
return template('Onpoc DS18B20<br><b> {{tmp}}*C T Bo3dyxa<br>{{tmp2}}*C T 6amapeu</b>', tmp=data_entry, tmp2=data_entry1)
run(host='192.168.0.101', port=80)

Простой скрипт работает быстро и не грузит процессор, рекомендуется при медленном и нестабильном интернете (по технологии ADSL) и слабом компьютере (Raspberry Pi с 512 Мб памяти). Сложные скрипты да еще с графикой очень нагружают процессор, время загрузки веб-страницы увеличится, что может привести к ошибкам браузера.
Использованные ресурсы
1. Simon Monk Raspberry Pi Cookbook O’Reilly Media 2014 p. 319
2. Simon Monk Raspberry Pi Cookbook O’Reilly Media 2nd Edition 2016
русский перевод Саймон Монк: Raspberry Pi. Сборник рецептов. Решение программных и аппаратных задач Диалектика, 2017
3. http://lock.3dn.ru/news/raspberry_pi_dlja_domashnej_avtomatizacii_grafiki_parametrov/2015-09-18-136
4. Монитор атмосферного давления и температуры на Raspberry Pi 3
|