Мне довелось выполнить одну интересную задачу, которой я хотел бы поделиться на страницах своего сайта.
Суть задачи: имеется реле на 4 канала с контроллером ESP-01. Также имеется аквариум, в котором есть желание автоматизировать управление электроприборами (освещением, компрессором, лампой ультрафиолетового фильтра, подогревом)…
Кроме того, все это должно было управляться веб-страницей, которая в свою очередь крутится на Raspbery Pi Модель 1.
Как поднять Linux + Apach + PHP на Raspbety Pi я описывать не буду, на эту тематику достаточно существует информации в интернете, а вот как заставить веб страницу на php взаимодействовать с реле на ESP-01 я опишу.
Для начала нам необходимо разобраться с тем какие данные ESP-01 ожидает получить от клиента. Перечитав документацию по плате реле было определено, что контроллер ожидает подключение по порту 8080 и существуют байт команды, которые включают или отключают определённый канал реле. В каждой команде 4 байта.
Вот эти команды:
0xA0, 0x01, 0x01, 0xA2 - включить реле 1 0xA0, 0x02, 0x01, 0xA3 - включить реле 2 0xA0, 0x03, 0x01, 0xA4 - включить реле 3 0xA0, 0x04, 0x01, 0xA5 - включить реле 4 0xA0, 0x01, 0x00, 0xA1 - выключить реле 1 0xA0, 0x02, 0x00, 0xA2 - выключить реле 2 0xA0, 0x03, 0x00, 0xA3 - выключить реле 3 0xA0, 0x04, 0x00, 0xA4 - выключить реле 4
Первым делом реализуем класс на php, который умеет подключаться к ESP-01, отправлять команду на включение или отключение канала реле по номеру:
Listning: Rele4x.php
<?php class Rele4X { private $dest = '192.168.1.41'; // IP Rele4X private $port = 8080; // TCP Port private $socket; private $rele; function __construct(){ $this->socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); $this->rele[] = array('a00101a2', 'a00100a1'); // Rele 1 On / Off $this->rele[] = array('a00201a3', 'a00200a2'); // Rele 2 On / Off $this->rele[] = array('a00301a4', 'a00300a3'); // Rele 3 On / Off $this->rele[] = array('a00401a5', 'a00400a4'); // Rele 4 On / Off } function On($number){ // On Rele by number socket_connect($this->socket, $this->dest, $this->port); $msg = hex2bin($this->rele[$number - 1][0]); if (socket_send($this->socket, $msg, strlen($msg), 0) == 4){ socket_close($this->socket); return true; } else { socket_close($this->socket); return false; } } function Off($number){ // Off Rele by number socket_connect($this->socket, $this->dest, $this->port); $msg = hex2bin($this->rele[$number - 1][1]); if (socket_send($this->socket, $msg, strlen($msg), 0) == 4){ socket_close($this->socket); return true; } else { socket_close($this->socket); return false; } } } ?>
Данный класс при инициализации будет автоматически создавать переменную socket, готовую к TCP подключению, а также массив байт кодов для управления реле.
Класс реализует две функции On и Off, которые соответственно включают или отключают реле по номеру переданному в параметрах.
Listning: index.php
<?php require_once('Rele4X.php'); $rele = new Rele4X(); if(isset($_GET['number'])){ if($_GET['status'] == '1'){ $rele->On($_GET['number']); } else { $rele->Off($_GET['number']); } } ?> <html> <head> <meta name="viewport" content="width=device-width, initial-scale=1"> <title> Управление аквариумом </title> </head> <body> <form method=GET> <input type=hidden name=number value=1> <button name=status value=1>Реле 1 - Вкл</button> <button name=status value=0>Реле 1 - Выкл</button> </form> <hr> <form method=GET> <input type=hidden name=number value=2> <button name=status value=1>Реле 2 - Вкл</button> <button name=status value=0>Реле 2 - Выкл</button> </form> <hr> <form method=GET> <input type=hidden name=number value=3> <button name=status value=1>Реле 3 - Вкл</button> <button name=status value=0>Реле 3 - Выкл</button> </form> <hr> <form method=GET> <input type=hidden name=number value=4> <button name=status value=1>Реле 4 - Вкл</button> <button name=status value=0>Реле 4 - Выкл</button> </form> </body> </html>
Страница содержит просто 4 группы кнопок, соответственно для включения или отключения соответствующего реле.
Внешний вид управляющей страницы:
На данном этапе задача ещё не завершена, реализовано только ручное управление, а в планах сделать его автоматизированным, плюс доступным к управлению через облако, а значит из любой точки мира… 🙂 буду держать в курсе..
Ну и на последок, несколько живых фото и видео: