2 заметки с тегом

OneWire

Adafruit IO: что это такое?

17 сентября 2015, 22:39

«Adafruit IO — это система, которая делает данные полезными.» Другими словами, система сбора, хранения и отображения большого количества данных с минимальным знанием языков программирования. Все подробности работы с системой можно прочитать в описании. В прошлой статье мы подключали OneWire датчик DS18b20 к Raspberry Pi. Сегодня рассмотрим пример передачи значений температуры в Adafruit IO и отображение накопленных данных в виде графика.

Настройка Raspberry Pi

Для облегчения обмена данных существует библиотека для Arduino и для таких языков программирования, как: Ruby, Python, Node.js. Так как Python мне ближе, опишу реализацию на этом языке.
Клонируем репозиторий с библиотекой:

git clone https://github.com/adafruit/io-client-python.git
cd io-client-python

Устанавливаем библиотеку:

sudo python setup.py install

Теперь, когда мы установили библиотеку, рассмотрим простой пример передачи и приема данных в Adafruit IO.

# Импортируем библиотеку и создаем инстанс REST клиента
from Adafruit_IO import Client
aio = Client('YOUR ADAFRUIT IO KEY')

# Отправляем значение 100 в канал с названием 'Foo'
aio.send('Foo', 100)

# Получаем последнее значение из канал 'Foo'
data = aio.receive('Foo')
print('Received value: {0}'.format(data.value))

С помощью пары строк можно отправлять с определенным интервалом данные для хранения, например, температуру, влажность, давление, а получать обратно по запросу массив данных и строить графики. Выглядит очень интересно, попробуем отправлять температуру с датчика DS18b20 с интервалом раз в минуту.

Панель управления Adafruit IO

Подготовим канал для хранения значений температуры, для этого в личном кабинете на странице Your Feeds.

В имени канала необходимо указать название Temperatura.
Теперь создадим панель для отображения значений температуры, пройдем на страницу Your Dashboards.

Добавим 2 блока на панель, это график и прогресс бар с текущим отображением значения.

Теперь перейдем в настройки и посмотрим свой ADAFRUIT IO KEY, он потребуется чуть позже.
Перейдем к написанию программы для отправки данных.
Создадим новый файл:

nano temperatura.py

И вставим в него следующее содержимое:

import os
import glob
import time

from Adafruit_IO import Client

aio = Client('YOUR ADAFRUIT IO KEY')

os.system('modprobe w1-gpio')
os.system('modprobe w1-therm')

base_dir = '/sys/bus/w1/devices/'
device_folder = glob.glob(base_dir + '10*')[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

while True:
        aio.send('Temperatura', read_temp())
        time.sleep(60)

Не забываем вставить свой ключ вместо YOUR ADAFRUIT IO KEY.
Когда все готово, пробуем запустить:

sudo python temperatura.py &

Если все сделали правильно, то на сайте в панели которую мы до этого создали, каждую минуту будет обновляться график и текущее значение температуры.
Так же просто можно добавить множество других параметров для отслеживания, но об этом в следующих статьях.

Raspberry Pi и OneWire датчики

6 сентября 2015, 14:44

Рассмотрим пример подключения OneWire датчиков к Raspberry Pi на примере датчика температуры DS18B20. Применение этого датчика будет использоваться в следующих статьях.
Для подключения нам понадобиться: плата Raspberry Pi, датчик температуры DS18B20, сопротивление от 4.7 кОм до 10 кОм, макетная плата и немного проводов.
Необходимо собрать схему, как показано на изображении выше, после чего можно включать питание.

Настройка

Подключаемся к плате по SSH, и первым делом необходимо добавить поддержку OneWire в config.txt.
Открываем файл в текстовом редакторе nano:

sudo nano /boot/config.txt

И добавляем в конец файла следующую строчку:

dtoverlay=w1-gpio

Сохраняем изменения в файле и перезагружаем плату sudo reboot.
После перезагрузки приступим к проверке работоспособности датчика, для этого добавим модули w1-gpio и w1-therm в ядро следующими командами:

sudo modprobe w1-gpio
sudo modprobe w1-therm

Перейдем в каталог с устройствами OneWire и посмотрим доступные устройства

cd /sys/bus/w1/devices
ls

Должны увидеть следующие каталоги

pi@raspberrypi /sys/bus/w1/devices $ ls
10-0008019c26d2  w1_bus_master1

Каталог 10-0008019c26d2 и есть уникальный номер датчика DS18B20.
Перейдем в этот каталог

cd 10-0008019c26d2

И выведем содержимое файла w1_slave на экран

cat w1_slave

На экране должны появиться следующие 2 строчки:

pi@raspberrypi /sys/bus/w1/devices/10-0008019c26d2 $ cat w1_slave
2b 00 4b 46 ff ff 02 10 8a : crc=8a YES
2b 00 4b 46 ff ff 02 10 8a t=21625

Если в конце первой строчки будет YES, то в конце второй строчки будет температура в градусах Цельсия умноженная на 1000. В моем случае это 21.652 ℃.

Использование

Для удобства просмотра и дальнейшей обработки температуры удобно использовать скрипт на Python.
Создадим файл temperature.py:

nano temperature.py

И добавим в него следующее содержимое:

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 + '10*')[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)

Сохраним перед выходом и запусти командой:

sudo python temperature.py

На экране каждую секунду будет обновляться значение температуры, в первом столбце в градусах Цельсия, во втором в градусах Фаренгейта.

pi@raspberrypi ~ $ sudo python temperature.py
(21.5, 70.7)
(21.562, 70.8116)
(21.625, 70.925)
(22.687, 72.8366)
(23.937, 75.0866)
development   OneWire   raspberry pi