Ctrl + ↑ Позднее

Raspberry Pi и датчики влажности DHT

8 ноября 2015, 18:19

В этой статье рассмотрим как подключить датчик влажности DHT к Raspberry Pi и получить с него значение влажности и температуры с помощью скрипта написанного на Python. Компания Aosong выпускает несколько датчиков влажности DHT11, DHT22, AM2301 и AM2302.
Все эти датчики содержат сенсор для измерения влажности и температуры для коррекции влажности. Отличия между датчиками заключаются в том, что в DHT11 используется датчик температуры для измерения в диапазоне 0 — 40 °C, в DHT22 и остальных в диапазоне -40 — 80 °C. В датчиках AM2301 и AM2302 не требуется дополнительной обвязки в виде сопротивления на 4.7 кОм между пином питания и пином DATA. При подключении питания 3.3 В длина кабеля может составлять до 20 метров, при подключении к 5 В длина уже составит до 100 м. Все эти данные можете посмотреть в даташитах, которые представлены по ссылкам выше.

Подключение датчика

Перейдем непосредственно к подключению, для этого нам потребуется Raspberry Pi, датчик влажности и сопротивление на 4.7 кОм для DHT11/22.
Подключаем датчик по одной из приведенной ниже схем, в зависимости от типа датчика:

Схема подключения датчика DHT11 к Raspberry Pi

Схема подключения датчика DHT22 к Raspberry Pi

Схема подключения датчика AM2302 к Raspberry Pi

Установка

Для установки библиотеки для работы с датчиками необходимо получить несколько пакетов:

sudo apt-get update
sudo apt-get install build-essential python-dev python-openssl

Следующим шагом необходимо загрузить библиотеку Adafruit Python DHT с Github:

git clone https://github.com/adafruit/Adafruit_Python_DHT.git
cd Adafruit_Python_DHT

И следующей командой устанавливаем:

sudo python setup.py install

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

В папке examples находится пример AdafruitDHT.py

#!/usr/bin/python

# Copyright (c) 2014 Adafruit Industries
# Author: Tony DiCola

# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:

# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.

# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.

import sys
import Adafruit_DHT

# Parse command line parameters.
sensor_args = { '11': Adafruit_DHT.DHT11,
        '22': Adafruit_DHT.DHT22,
        '2302': Adafruit_DHT.AM2302 }
if len(sys.argv) == 3 and sys.argv[1] in sensor_args:
    sensor = sensor_args[sys.argv[1]]
    pin = sys.argv[2]
else:
    print 'usage: sudo ./Adafruit_DHT.py [11|22|2302] GPIOpin#'
    print 'example: sudo ./Adafruit_DHT.py 2302 4 - Read from an AM2302 connected to GPIO #4'
    sys.exit(1)

# Try to grab a sensor reading.  Use the read_retry method which will retry up
# to 15 times to get a sensor reading (waiting 2 seconds between each retry).
humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)

# Un-comment the line below to convert the temperature to Fahrenheit.
# temperature = temperature * 9/5.0 + 32

# Note that sometimes you won't get a reading and
# the results will be null (because Linux can't
# guarantee the timing of calls to read the sensor).  
# If this happens try again!
if humidity is not None and temperature is not None:
    print 'Temp={0:0.1f}*  Humidity={1:0.1f}%'.format(temperature, humidity)
else:
    print 'Failed to get reading. Try again!'
    sys.exit(1)

Использование скрипта со следующими аргументами:

usage: sudo ./Adafruit_DHT.py [11|22|2302] GPIOpin#

У меня подключен датчик AM2302 к 4 пину, поэтому команда для запуска будет следующая:

$ sudo ./AdafruitDHT.py 2302 4
Temp=21.2*  Humidity=51.6%

И соответствующий результат: температура 21.2 °C и влажность 51.6%.
Вот и все. Как видите ничего сложного нет, можно придумать сохранять значение в базу данных для накопления данных и построения трендов, но об этом в другой раз. А в следующей статье будем подключать датчик атмосферного давления. Подписывайтесь, чтобы не пропустить.

Pebble Time Round

12 октября 2015, 23:48

Компания Pebble представила новую линейку наручных часов Pebble Time Round. Да, да, экран теперь ввиде круга. Изменениям подвергся только экран, теперь он имеет разрешение 180х180 пикселей, против 144х168 в предыдущих версиях, но срезан по углам. В остальном железная начинка ничем не отличается от версии Pebble Time.

Новые часы уже можно приобрести, но большинство приложений без адаптации под новый экран будут выглядеть криво. Ознакомиться с новыми элементами и адаптировать свои приложения уже можно с помощью предварительной версии SDK для разработчиков или в бета версии CloudPebble.

Сегодня покажу на примере watchface Space Time, как адаптировать под Time Round. Напоминаю, Space Time — это часы, где в центре экрана расположено неподвижное солнце, вокруг него вращается Земля и показывает направление часовой стрелки, вокруг Земли вращается луна и показывает относительно Земли направление минутной стрелки и наконец, вокруг луны вращается некий астероид и показывает секунды.

Space Time состоят из одного окна и двух слоев, вся адаптация заключается в изменении размеров элементов на экране. Так как предыдущие модели часов имели прямоугольный экран, планеты двигались по эллиптической орбите, то в Pebble Time Round это будет лишним. Но в круглых часах немного увеличилось разрешение экрана, и чтобы его полностью заполнить, немного увеличим размеры планет.

Начиная с версии SDK 3.6 появились новые условные директивы PBL_ROUND, PBL_RECT и PBL_PLATFORM_CHALK. Кстати, новая платформа получила имя «Chalk», что в переводе означает мел. Также
С помощью новых директив можно быстро адаптировать свое приложение под все платформы.
Например различие классических Pebble от моделей с цветным экраном:

#ifdef PBL_BW
    // Pebble с ч/б экраном
#elif PBL_COLOR
    // С цветным экраном
#endif

Или различие Pebble с квадратным и круглым экраном:

#ifdef PBL_RECT
    // Квадратный экран
#elif PBL_ROUND
    // Круглый экран
#endif

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

Но различия в этом не заканчиваются, на портале разработчика можно прочитать про новые элементы доступные для Pebble Time Round, с помощью которых можно создавать приложения не похожие на приложения для моделей с квадратными экранами. После релиза версии 3.6 появятся много новых и интересных приложений в appstore для Pebble Time Round.

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)

Настройка Lightpack в медиаплеере Slice

9 августа 2015, 23:00

В этой статье расскажу как настроить Lightpack в медиаплеере Slice или на Raspberry Pi с установленным Kodi. Прочитать, что из себя представляет плеер Slice можно в прошлой статье, а о подсветке Lightpack тут. Приступим к настройке.

Заходим в настройки:

Выбираем дополнения:

Менеджер дополнений:

Добавить дополнения:

Выбираем все дополнения:

Ищем в списке службы:

Находим boblightd:

Устанавливаем демон boblightd:

Возвращаемся к списку и ищем XBMC Boblight:

Устанавливаем XBMC Boblight:

Так же можно зайти в настройки для более детальной настройки:

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

Конфигурационный файл соответствует расположению светодиодов как на изображении ниже:

Заходим в директорию, где находится нужный нам файл и открываем его для редактирования:

cd .kodi/userdata/addon_data/service.multimedia.boblightd
nano boblight.conf

Вставляем содержимое ниже в файл и выходим с сохранением.

#################################################################
# boblight.conf
#
# Designed for LightPack with Speedyís boblight daemon
#
# https://code.google.com/p/light-pack/
# https://github.com/timsat/boblight-lightpack/wiki/Configuration
#
# Andrew Pawelski
# 4th October 2013
#
#################################################################

[global]

[device]
name        LP1
channels    30
type        lightpack
interval    20000
#bus        1
#address    6
#debug      true

[color]
name        red
rgb         FF0000
gamma       1.6
adjust      1.0
blacklevel  0.0

[color]
name        blu
rgb     0000FF
gamma       1.6
adjust      1.0
blacklevel      0.0

[color]
name        grn
rgb     00FF00
gamma       1.6
adjust          1.0
blacklevel      0.0

[light]
name            L01
color           red     LP1 1
color           blu     LP1 2
color           grn     LP1 3
hscan       0 33
vscan       0 20

[light]
name            L02
color           red     LP1 4
color           blu     LP1 5
color           grn     LP1 6
hscan       33 66
vscan       0 20

[light]
name            L03
color           red     LP1 7
color           blu     LP1 8
color           grn     LP1 9
hscan           66 100
vscan       0 20

[light]
name            L04
color           red     LP1 10
color           blu     LP1 11
color           grn     LP1 12
hscan           80 100
vscan       0 50

[light]
name            L05
color           red     LP1 13
color           blu     LP1 14
color           grn     LP1 15
hscan           80 100
vscan           50 100

[light]
name            L06
color           red     LP1 16
color           blu     LP1 17
color           grn     LP1 18
hscan           66 100
vscan           80 100

[light]
name            L07
color           red     LP1 19
color           blu     LP1 20
color           grn     LP1 21
hscan       33 66
vscan           80 100

[light]
name            L08
color           red     LP1 22
color           blu     LP1 23
color           grn     LP1 24
hscan       0 33
vscan           80 100

[light]
name            L09
color           red     LP1 25
color           blu     LP1 26
color           grn     LP1 27
hscan       0 20
vscan           50 100

[light]
name            L10
color           red     LP1 28
color           blu     LP1 29
color           grn     LP1 30
hscan       0 20
vscan           0 50

Перезагружаем Slice и убеждаемся, что все работает.
Приятного просмотра и до новых статей.

Intel Galileo 2: настройка Wi-Fi

29 июня 2015, 19:22

Сегодня покажу как просто настроить беспроводное подключение на Intel Galileo.
В образе ОС от Intel уже включены драйверы для некоторых Mini PCI-E Wi-Fi адаптеров, и вот их список. Чтобы не усложнять себе задачу, был приобретен адаптер Intel® Centrino® Wireless-N 135, но к нему еще необходима железка удлиняющая адаптер для полного размера. А так же еще потребуются кабели U.FL — RP-SMA и 2 антенны, как от домашнего роутера.
Как установить образ, я уже писал в прошлой статье, поэтому сразу перейдем к настройке беспроводной сети.

Настройка беспроводной сети

Подключаемся к Galileo пользователем root.
Настраивать будем с помощью connmanctl. Запускаем командой:

# connmanctl

Включаем беспроводной интерфейс командой:

connmanctl> enable wifi
Enabled wifi

Просканируем сети командой:

connmanctl> scan wifi
Scan completed for wifi

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

connmanctl> services
*AO Wired                ethernet_984fee017ff1_cable
    MyWiFi               wifi_00150096fd2f_4b65656e657469632d33343430_managed_psk
                         wifi_00150096fd2f_hidden_managed_none
    RT-WiFi_fc70         wifi_00150096fd2f_52542d576946695f66633730_managed_psk
    ROSTELECOM_2CB9      wifi_00150096fd2f_524f5354454c45434f4d5f32434239_managed_psk
    dlink 7              wifi_00150096fd2f_646c696e6bc2a037_managed_psk
    Rostelecom53         wifi_00150096fd2f_526f7374656c65636f6d3533_managed_psk
    lolita_Network       wifi_00150096fd2f_6c6f6c6974615f4e6574776f726b_managed_psk
    RT-WiFi_d1e8         wifi_00150096fd2f_52542d576946695f64316538_managed_psk
    Dom.ru(35)           wifi_00150096fd2f_446f6d2e727528333529_managed_psk

В появившемся списке сетей, необходима найти свою и запомнить сервисное имя.
После чего выходим из connman:

connmanctl> exit

Создадим файл конфигурации в /var/lib/connman/ и заполним необходимые параметры:

# cat << EOF > /var/lib/connman/wifi.config
> [service_wifi_00150096fd2f_4b65656e657469632d33343430_managed_psk]
> Type = wifi
> Securuty = psk
> Name = MyWiFi
> Passphrase = MyPassword
> EOF

В заголовок необходимо добавить сервисное имя своей сети, далее необходимо указать тип шифрования, имя и пароль сети.
После чего перезагружаем плату для принятия в силу всех изменений.
Проверим подключение:

# ifconfig
enp0s20f6 Link encap:Ethernet  HWaddr 98:4F:EE:01:7F:F1  
          inet6 addr: fe80::9a4f:eeff:fe01:7ff1/64 Scope:Link
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:280 (280.0 B)
          Interrupt:51 Base address:0x4000 

enp0s20f6:avahi Link encap:Ethernet  HWaddr 98:4F:EE:01:7F:F1  
          inet addr:169.254.9.224  Bcast:169.254.255.255  Mask:255.255.0.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          Interrupt:51 Base address:0x4000 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:2 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:140 (140.0 B)  TX bytes:140 (140.0 B)

wlp1s0    Link encap:Ethernet  HWaddr 00:15:00:96:FD:2F  
          inet addr:192.168.1.10  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::215:ff:fe96:fd2f/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:139 errors:0 dropped:0 overruns:0 frame:0
          TX packets:129 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:26643 (26.0 KiB)  TX bytes:23252 (22.7 KiB)

Появившийся интерфейс wlp1s0 это и есть наше беспроводное подключение.

Используя беспроводной адаптер за $10 и немного своего времени, можно добавить немного универсальности Galileo. Теперь необязательно располагать плату рядом с роутером, а можно закинуть в дальний угол и заставить выполнять свои функции, а вот о них я и напишу в следующих статьях.

Lightpack: распаковка

22 июня 2015, 0:05

На неделе получил посылку с Lightpack. Lightpack — это система подсветки монитора, когда на ПК устанавливается управляющий софт, который рассчитывает средний цвет выводимой на монитор картинки для каждой области и передает эти данные на плату. Микроконтроллер на плате обрабатывает полученные данные и заставляет светодиоды прикрепленные на обратной стороне монитора/телевизора светиться определенным цветом, тем самым увеличивая диагональ экрана.
Разработали Lightpack наши соотечественники из Ижевска, а собрали необходимую сумму для начала производства на kickstarter в 2013 году.

Перейдем непосредственно к распаковке.

Lightpack упакован в небольшой коробке, размером А4, которая интересно открывается. Нужно из центра потянуть 4 лепестка к краям.

Внутри лежит гарантия и простая, но красочная инструкция, как прикрепить устройство к обратной стороне монитора/телевизора.

Если диагональ телевизора очень большая, то можно подключить 2, 3 или даже 5 устройств сразу.

Под инструкцией мы видим содержимое коробки.

В комплект входит устройство с микроконтроллером внутри, usb — micro-usb провод для подключения к ПК, блок питания со сменными вилками для всех, наверно, стран, 10 светодиодных лент, по 3 светодиода на каждой и дополнительные 10 полосок двухстороннего скотча и жгутики для зажима проводов.
В комплекте есть все необходимое для установки, главное правильно приклеить светодиодные ленты и подключить их затем в устройство. На выбор 3 схемы подключения, они описаны в инструкции.

Чтобы это все заработало, необходимо установить софт на ПК под названием Prismatik. Софт доступен на все популярные операционные системы и доступен для загрузки на официальном сайте.

Пробовал запускал Prismatik на MacOS, но светодиоды были расположены на столе, на динамических сценах цвет менялся эффектно. Планирую прикрепить Lightpack к телевизору и подключить к медиаплееру Slice. О полученных результатах, напишу в следующей статье.

Ctrl + ↓ Ранее