PHPАквариумистикаНовостиСайтостроение

ESP-01 + PHP + Raspbery Pi

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

Суть задачи: имеется реле на 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 группы кнопок, соответственно для включения или отключения соответствующего реле.

Внешний вид управляющей страницы:

На данном этапе задача ещё не завершена, реализовано только ручное управление, а в планах сделать его автоматизированным, плюс доступным к управлению через облако, а значит из любой точки мира… 🙂 буду держать в курсе..

Ну и на последок, несколько живых фото и видео: