PHP в мире железа: как писать Embedded код без микроконтроллеров

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

PHP и Embedded: неожиданный коктейль из железа и скриптов

Когда слышишь «Embedded-разработка», обычно представляешь C, C++ или свежий Rust. PHP же ассоциируется с веб-сайтами, CMS и липкими формами. Но что, если я скажу, что PHP может управлять светодиодами, опрашивать датчики температуры или даже работать с I2C-шиной? Да, это не шутка. На стыке веба и встраиваемых систем есть целая ниша — Embedded разработка на PHP.

Конечно, никто не предлагает писать драйвера для Linux на PHP. Речь о другом: когда нужно быстро поднять веб-интерфейс для умного дома, прототипа IoT-устройства или автоматизировать сбор данных с промышленного оборудования — PHP оказывается идеальным клеем. Он работает на Linux, легко читает/пишет в файлы устройств, а его библиотеки позволяют общаться с COM-портами, GPIO и даже Arduino. Давайте разберем реальные сценарии использования PHP в Embedded-системах, с кодом и практическими советами.

Почему PHP для Embedded? Мифы и реальность

Главный аргумент противников: «PHP медленный и не подходит для real-time». И это правда, если вы пытаетесь управлять шаговым двигателем с точностью до микросекунды. Но в реальной жизни 90% Embedded-задач не требуют жесткого real-time. Сбор данных с датчика раз в секунду, логирование температуры, отправка команды по UART — всё это PHP делает легко.

Плюсы Embedded разработки с PHP:

  • Быстрый старт — не нужно учить указатели и память в C. Просто открываешь файл и пишешь.
  • Веб-интерфейс «из коробки» — любой PHP-скрипт можно сразу обернуть в HTML+CSS+JS.
  • Огромное сообщество — для работы с железом есть готовые библиотеки (php-serial, php-gpio, php-i2c).
  • Кроссплатформенность — скрипт работает на Raspberry Pi, Orange Pi, обычном ПК с Linux.

Минусы тоже есть: PHP не подходит для высоконагруженных систем с частыми прерываниями. Но для прототипирования, умного дома или промышленного мониторинга — это отличный выбор.

Работа с GPIO через PHP: зажигаем светодиоды

Самый простой способ «пощупать» железо — управлять выводами GPIO на Raspberry Pi или Orange Pi. В Linux GPIO представлены как файлы в /sys/class/gpio/. PHP может открыть их как обычные текстовые файлы. Вот пример мигания светодиодом на PHP:

<?php
// Определяем номер пина GPIO (например, GPIO17 — физический пин 11 на RPi)
$gpio_pin = 17;

// Экспортируем пин (если ещё не экспортирован)
if (!file_exists("/sys/class/gpio/gpio$gpio_pin")) {
    file_put_contents("/sys/class/gpio/export", $gpio_pin);
}

// Устанавливаем направление — выход
file_put_contents("/sys/class/gpio/gpio$gpio_pin/direction", "out");

// Мигаем 5 раз
for ($i = 0; $i < 5; $i++) {
    // Включаем (1)
    file_put_contents("/sys/class/gpio/gpio$gpio_pin/value", "1");
    sleep(1);
    // Выключаем (0)
    file_put_contents("/sys/class/gpio/gpio$gpio_pin/value", "0");
    sleep(1);
}

// Освобождаем пин
file_put_contents("/sys/class/gpio/unexport", $gpio_pin);
echo "LED blinking finished!";
?>

Этот код — основа для любого управления устройствами через PHP. Вы можете легко добавить чтение кнопки (просто сменить direction на "in" и прочитать value). Таким образом, PHP превращается в полноценный инструмент для работы с дискретными сигналами.

Использование библиотеки php-gpio

Чтобы не писать каждый раз экспорт/неэкспорт, используйте готовую библиотеку. Установите через Composer:

composer require piwik/gpio

Пример с той же библиотекой:

<?php
require 'vendor/autoload.php';

use Piwik\Gpio\Gpio;

$gpio = new Gpio();
$pin = $gpio->getPin(17);

// Настраиваем как выход
$pin->setDirection(Gpio::DIRECTION_OUT);

// Включаем
$pin->setValue(Gpio::VALUE_ON);
sleep(1);
$pin->setValue(Gpio::VALUE_OFF);
?>

Код стал чище, а главное — он сам обрабатывает экспорт и освобождение ресурсов. Это пример того, как PHP для IoT становится удобным и безопасным.

Общение с Arduino через COM-порт (UART)

Часто микроконтроллер (Arduino, ESP32) выполняет низкоуровневые задачи, а PHP на Raspberry Pi служит мозгом, который отправляет команды и получает данные. Для работы с последовательным портом в PHP есть расширение dio (Direct I/O) или библиотека php-serial.

Установка библиотеки через Composer:

composer require sergeytsalkov/php-serial

Пример отправки команды "ON" на Arduino и чтения ответа:

<?php
require 'vendor/autoload.php';

use PhpSerial\Serial;

$serial = new Serial();

// Настройка порта (на Raspberry Pi это /dev/ttyACM0 или /dev/ttyUSB0)
$serial->deviceSet("/dev/ttyACM0");
$serial->confBaudRate(9600);
$serial->confParity("none");
$serial->confCharacterLength(8);
$serial->confStopBits(1);
$serial->deviceOpen();

// Отправляем команду
$serial->sendMessage("ON\n");

// Читаем ответ (ждем до 1 секунды)
$read = $serial->readPort();
echo "Arduino says: " . $read;

$serial->deviceClose();
?>

На стороне Arduino достаточно принимать строку по Serial и выполнять действие (включить реле, изменить ШИМ). Такой тандем — классика Embedded разработки на PHP: микроконтроллер берет на себя аппаратную часть, PHP — логику и веб-интерфейс.

I2C и датчики: читаем температуру без C

Шина I2C — стандарт для подключения датчиков (температуры, влажности, давления). На Linux устройства I2C представлены как /dev/i2c-N. Для работы с ними в PHP используйте расширение php-i2c или библиотеку devices/i2c.

Пример чтения температуры с датчика BMP280 (адрес 0x76):

<?php
require 'vendor/autoload.php';

use Devices\I2C\I2C;

$i2c = new I2C('/dev                

Блоги

Рекомендаций по книгам