умный дом система
Героем статьи будет простой датчик с Али стоимостью не более 100 рублей. Датчик состоит из основной платы и пластины, которая помещается в необходимое место контроля. У датчика есть контакты для пластины, входные/выходные контакты для питания и общения с контроллером. На пластине находится тонкое токопроводящее покрытие, состоящее из 2 независимых полосок. Если на покрытие попадает капля, полоски соединяются каплей, электрическая цепь замыкается и сигнал приходит на контроллер. Что делать с этим сигналом, решать вам. На данное событие можно сделать просто уведомление или же это будет сигнал к действию вашего управляемого реле на 220v, через которое подключен насос, например. Еще необходимо упомянуть, что у датчика есть как цифровой выход, с которого подается сигнал (если влага обнаружена), так и аналоговый (если вы хотите подключить это дело на АЦП и смотреть, насколько у вас влажно на пластине). Чувствительность срабатывания на цифровом выходе можно отрегулировать с помощью потенциометра на датчике. Вот, в общем, и весь принцип. А теперь займемся делом.
Схема подключения датчика воды (капель) YL-83
На датчике еще присутствует аналоговый выход AO. Желающие могут им воспользоваться, но в Raspberry нет встроенного АЦП, поэтому понадобится внешний. Но это уже выходит за рамки темы данной статьи.
Скрипты взаимодействия
Как программно понять, сухой датчик или на нем присутствует вода.
Опишем сценарий простого запроса состояния датчика. Для этого нам потребуется библиотека gpio:
1
|
$ sudo apt-get install python-dev python-rpi.gpio
|
Наш датчик цифровой и отдает уровень логической единицы или логического нуля для нашего raspberry в зависимости от своего состояния. Создадим небольшой скрипт для считывания:
1
|
$ vim /home/pi/water_read.py
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import RPi.GPIO as io
import ConfigParser
config = ConfigParser.RawConfigParser() #воспользуемся конфигом
config.read(«/home/pi/global_config.conf») #считаем конфиг
pin = config.getint(«water_pins», «water_pin1») #пина из конфига присвоем переменной pin
io.setmode(io.BCM)
io.setup(pin, io.IN) #устанавливаем пин на вход
signal = io.input(pin) #считываем сигнал
if signal == 1:
print «датчик сухой»
elif signal == 0:
print «на датчике обнаружена вода!»
else:
print «ошибка!»
|
Как видно из скрипта, сценарий считывает из конфига номер пина. Это необязательный пункт (вы можете указать номер пина прямо в сценарии: pin=17), но в дальнейшем он вам очень пригодится. Рекомендую использовать общий конфиг пинов для всех ваших программ.
Минимальное содержание конфигурационного файла для данного сценария:
1
|
$ vim /home/pi/global_config.conf
|
1
2
3
4
|
#попытаемся вести тут все необходимые дефолтные конфигурации
#номера пинов с соответсвием им переменных, стандартные таймауты, часто встречающиеся пути и тд.
[water_pins]
water_pin1 = 17
|
Конфиг удобен тем, что вам не нужно переписывать 10 программ, если вы в будущем решите сменить номера пинов для ваших новых датчиков.
Делаем наш сценарий исполняемым:
1
|
$ sudo chmod +x /home/pi/water_read.py
|
Проверяем:
1
|
$ /home/pi/water_read.py
|
Радуемся!
P.S. Естественно, данный скрипт минимален с точки зрения алгоритма. Вы можете написать автоматическую сигнализацию с уведомлениями или подключить реле и исполнить блокировку трубы шаровым вентилем, если датчик намок и т.д. и т.п. Все зависит от ваших нужд и желаний.
алиса умный дом