Raspberry Pi і давач температури ds18b20

Dallas Semiconductors, тепер частина Maxim Integrated, має деякі дуже хороші чіпи-термометри у їх серії DS1820. Унікальна властивість цих термометрів полягає в тому, що вони можуть бути сполучені єдиним цифровим інтерфейсом по одній провідній шині даних (1-Wire). Ви навіть можете розмістити кілька давачів (не тільки термометри) на одному і тому ж дроті, якщо забажаєте.

Підключення одного або кількох цифрових давачів температури ds18b20 до Raspberry Pi здійснюється через резистор 4.7 кОм (рисунок 1).

raspberry_pi+ds18b20
Рисунок 1 – Схема підключення давачів ds18b20 до Raspberry Pi

Використання 1-Wire термометрів реалізовано на Paspbery Pi дуже просто. Все, що вам потрібно це завантажити два спеціальні модулі ядра і все, можна читати температуру. Модулі завантажуються набором у командній стрічці таких команд:
sudo modprobe w1-gpio
sudo modprobe w1-therm

Перша стрічка активує протокол модуля 1-wire на GPIO4. Друга стрічка завантажує модуль, який,власне, читає температуру з 1-wire шини. Для того, щоб модулі автоматично завантажувалися після завантаження чи вимкнення Raspberry Pi, дві вищенаведені стрічки треба додати у файл /etc/modules. Робиться це так:
sudo nano /etc/modules

І додаємо у кінець файлу (якщо їх там немає) дві стрічки:
w1-gpio
w1-therm

Таким чином питання читання поточної температури зводиться до читання спеціального файлу. Цей файл розташований у каталозі /sys/bus/w1/devices. Цей каталог містить один або кілька підкаталогів. Один, який завжди присутній, називається w1_bus_master1. Але нас він не цікавить. Нас цікавлять каталоги виду 28-000800575c8b. Для кожного підключеного по 1-wire давача температури створюється свій такий каталог. Може знадобитися кілька секунд для їх появи. Назва кожного каталогу – це унікальний серійний номер давача ds18b20.
Якщо ви підключили більше одного давача по шині, вам доведеться з’ясувати який каталог із серійним номером якому давачу належить. Зробити це можна шляхом прогрівання одного давача, зчитування температури з усіх давачів і перевірки температура якого саме змінюється. Або можна підключати давачі по черзі і записувати, який каталог якому давачу відповідає.

Зчитати температурні покази давача можна так (замініть серійний номер на номер вашого давача):
cat 28-000800575c8b/w1_slave

В результаті ви побачите щось на зразок цього:
30 00 4b 46 ff ff 0f 10 b8 : crc=b8 YES
30 00 4b 46 ff ff 0f 10 b8 t=23812

Шістнадцяткові числа відтворюють байтову інформацію, яку давач повернув вашому Raspberry Pi. Перша стрічка перевіряє, чи коректна контрольна сума CRC (останній байт відповіді має бути таким самим як обчислена CRC). Якщо все правильно виводиться “YES”, якщо ні – виводиться “NO”. Якщо відповідь “NO”, необхідно знову зчитати дані з давача, бо дана температура не коректна. Друга стрічка містить зчитану температуру у градусах Цельсія, помножену на 1000, тому необхідно поділити її на 1000, аби зробити читабельною для людини.
Нижче наведено приклад скрипта для зчитування і відтворення всіх давачів на шині.



#! /bin/bash

# This script reads the temperature from all connected 1-wire temperature
# sensors of the DS1820 family.
# The script will answer nothing if it can't find any sensors.
#
# Author: San Bergmans
# www.sbprojects.com

W1DIR="/sys/bus/w1/devices"

# Exit if 1-wire directory does not exist
if [ ! -d $W1DIR ]
then
echo "Can't find 1-wire device directory"
exit 1
fi

# Get a list of all devices
DEVICES=$(ls $W1DIR)

# Loop through all devices
for DEVICE in $DEVICES
do
# Ignore the bus master device
if [ $DEVICE != "w1_bus_master1" ]
then
# Get an answer from this device
ANSWER=$(cat $W1DIR/$DEVICE/w1_slave)

# See if device really answered
# When a previously existing device is removed it will
# read 00 00 00 00 00 00 00 00 00, which results in a
# valid CRC. That's why we need this extra test.
echo -e "$ANSWER" | grep -q "00 00 00 00 00 00 00 00 00"

if [ $? -ne 0 ]
then
# The temperature is only valid if the CRC matches
echo -e "$ANSWER" | grep -q "YES"
if [ $? -eq 0 ]
then
# Isolate the temprature from the second line
TEMPERATURE=$(echo -e "$ANSWER" | grep "t=" | cut -f 2 -d "=")
# Isolate integer and fraction parts so we know where
# the decimal point should go
INTEGER=${TEMPERATURE:0:(-3)}
FRACTION=${TEMPERATURE:(-3)}

# Restore the leading 0 for positive and negative numbers
if [ -z $INTEGER ]
then
INTEGER="0"
fi
if [ "$INTEGER" == "-" ]
then
INTEGER="-0"
fi

# Write result of this sensor
echo "$DEVICE=$INTEGER.$FRACTION"
else
# A CRC was found, show error message instead
echo "$DEVICE=CRC error"
fi
fi
fi
done

Оставить ответ

Обязательные поля помечены*

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.