Понедельник, 16.06.2025
Завод горного оборудования
Меню сайта
Google_Translate
Категории раздела
Мои статьи [126]
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Форма входа
Рейтинг@Mail.ru

Яндекс.Метрика
Главная » Статьи » Мои статьи

Как подключить DS18B20 и вывести показания на веб-страницу

Схема подключения датчика показана на рисунке. Запитайте 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

Категория: Мои статьи | Добавил: zgo (31.12.2017)
Просмотров: 2938 | Комментарии: 2 | Теги: reading, survey, вывод, display, показание, DS18B20, python bottle, measuring, чтение, опрос | Рейтинг: 0.0/0
Всего комментариев: 2
2 fghjkdfghasdfcvbnm https://bbc.com Caw  
0
fghjkdfghasdfcvbnm https://bbc.com

1 Mister misery 1901 https://www.google.com/ 4390747  
0
Mister misery 1901 https://www.google.com/

Имя *:
Email *:
Код *:
Поиск
Друзья сайта
  • Создать сайт
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Все проекты компании
  • Сайт завода zgo.ucoz.ru
  • Забайкальский край
    Дарасун
    Яндекс.Погода


    Хостинг Ucoz опять навязал видеорекламу, но обещает - "мы настроили систему так, чтобы в сутки на уникального посетителя приходилось не более двух показов."
    Совет, как не смотреть видеорекламу.

    Или используйте Uran - браузер от Ucoz без рекламы Скачать

    или подключите к браузеру блокировщик рекламы, например, Adblock Plus или uBlock Origin

    Универсальный декодер кириллицы



    Защита, контроль, управление.



    DONATE (поддержи автора)
    Все статьи авторские, при использовании прошу ссылаться на сайт
    Copyright Дарасунский завод горного оборудования © 2004 - 2025
    Бесплатный конструктор сайтовuCoz