В этой статье будет показан способ, позволяющий включать и выключать лампу из любой точки мира. Однако вы можете управлять таким образом любым устройством, переключая его источник питания, будь то телевизор, фонтан, гирлянда для новогодней елки, проектор и т.д.
Необходимое оборудование:
- Raspberry Pi
- Интернет-связь (Ethernet или WiFi)
- Объект управления (в данном случае лампа)
- Розетка, управляемая с пульта (например, 13569 Indoor Wireless Remote Control)
- 6 транзисторов 2N2222A
- Провода и макетная плата
- Припой
Первоочередной целью является «взлом» пульта ДУ, с помощью которого управляют розеткой, что позволит в дальнейшем «нажимать» на кнопки посредством линий ввода/вывода общего назначения (GPIO) Raspberry Pi.
Реверс инжиниринг пульта ДУ
Для начала нужно вскрыть пульт управления. Избавившись от крышки, можно увидеть плату, показанную на фото ниже.

На картинке видно, что плата имеет два ряда кнопок – кнопки «вкл» и «выкл» для каждой из трех розеток. Наша цель – управлять этими кнопками с помощью Raspberry Pi. Мы можем достичь ее, воспользовавшись таким элементом как транзистор, работающий в режиме ключа.
Транзистор 2N222A
Все транзисторы 2N222A имеют три вывода, два из них (коллектор и эмиттер) нужно «врезать» в схему, а с помощью третьего (базы) управлять транзистором, то есть замыкать и размыкать ключ. Для того, чтобы по цепи К-Э протекал ток на базу нужно подать напряжение, для отключения цепи это напряжение нужно снять. В общем, имеем n-p-n транзистор.

Документация на транзистор 2N222A.
В данном случае транзистор и будет нашей кнопкой. Прикладывая напряжение к базе, мы будем как бы нажимать кнопку.
Время пайки
Первым делом нужно припаять провода к каждому выводу кнопок. В данном случае обойдемся двумя кнопками (вкл и выкл) для розетки 1, но вы можете задействовать все шесть. На картинке ниже показаны точки присоединения проводов.

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

Также нужно соединить с помощью провода землю этой цепи и землю Raspberry Pi. Далее все что нужно, это соединить выводы GPIO с базами транзисторов. В данном случае это выводы 18 и 23.

Программное обеспечение
Следующим шагом является использование микрофреймворка Flask для подключения нашей схемы к интернету. Для упрощения написания кода в данном случае применялась библиотека RobotBrain. Сначала приведем весь код, потом рассмотрим важные моменты. Сам код содержится в двух файлах lamp_control.py и templates/main.html (файл main.html должен быть в папке templates). Код, который приведен ниже, можно найти на гитхабе.
lamp_control.py
import time
from itertools import cycle
from flask import Flask, render_template
from robot_brain.gpio_pin import GPIOPin
app = Flask(__name__)
on_pin = GPIOPin(18)
off_pin = GPIOPin(23)
state_cycle = cycle(['on', 'off'])
@app.route("/")
@app.route("/")
def update_lamp(state=None):
if state == 'on':
on_pin.set(1)
time.sleep(.2)
on_pin.set(0)
if state == 'off':
off_pin.set(1)
time.sleep(.2)
off_pin.set(0)
if state == 'toggle':
state = next(state_cycle)
update_lamp(state)
template_data = {
'title' : state,
}
return render_template('main.html', **template_data)
if __name__ == "__main__":
app.run(host='0.0.0.0', port=80)
Здесь мы используем Flask для ответа на HTTP-запросы. Всякий раз, когда запрашивается корневой URL или поддиректория корня, вызывается функция update_lamp(). При запросе любой поддиректории имя этой поддиректории становится аргументом функции. Например, если запрашивается /foo, то Flask вызовет update_lamp('foo'). Функция update_lamp() проверяет одно из трех состояний (включена, выключена или переключена) и выполняет желаемое действие.
templates/main.html
<!DOCTYPE html>
<head>
<title>{{ title }}</title>
<style type="text/css">
body {
padding: 0;
margin: 0;
}
.large_button {
position: absolute;
width: 100%;
height: 50%;
text-align: center;
text-decoration: none;
font-size: 1000%;
}
#on {
background-color: #fbf09a;
color: rgb(223, 204, 103);
text-shadow: 1px 1px 10px #5C4E17;
}
#off {
background-color: #1e170b;
top: 50%;
color: rgb(83, 71, 48);
text-shadow: 1px 1px 10px #000000;
}
</style>
</head>
<body>
<h1>
<a href="/on" id="on" class="large_button">ON</a>
</h1>
<h1>
<a href="/off" id="off" class="large_button">OFF</a>
</h1>
</body>
</html>
Это шаблон, который визуализирует приведенную выше Flask-функцию. В итоге это выглядит так:

Для запуска сервера просто запустите скрипт с привилегиями суперпользователя:
sudo python lamp_control.py
Теперь просто перейдите на IP-адрес вашего Raspberry Pi и вы сможете управлять лампой!
Перевод © digitrode.ru