PHP无法直接控制RGB灯,需通过串口通信(如Arduino)、调用Python脚本(树莓派GPIO)或HTTP请求(ESP设备)三种中间层方式实现。
PHP 本身不能直接控制硬件 RGB 灯(比如 WS2812、SK6812 或普通三路 PWM LED),它没有 GPIO 访问能力,也不能发 PWM 信号。要让 PHP “控制 RGB 灯”,必须借助中间层:要么通过串口(/dev/ttyUSB0)发指令给 Arduino/ESP32,要么调用系统命令触发 Python/C 二进制程序,或者走 HTTP 接口转发到本地嵌入式服务。
这是最常见且可控的方式:Arduino 运行固件监听串口,PHP 用 php_serial.class.php 或原生 fopen('php://dev/ttyUSB0') 发送三个字节(R、G、B)。注意权限和波特率必须严格匹配。
Serial.begin(115200),并用 Serial.readBytes(buf, 3) 读取连续 3 字节uucp 或 dialout 用户组权限(sudo usermod -a -G dialout www-data)/dev/ttyACM0(Arduino Uno)、/dev/ttyUSB0(CH340 模块),需 ls /dev/tty* 确认usleep(10000) 防止缓冲区溢出;写完要 fflush()
$serial = fopen('/dev/ttyUSB0', 'wb');
if ($serial) {
$rgb = pack('CCC', 255, 0, 128); // R=255, G=0, B=128
fwrite($serial, $rgb);
fflush($serial);
fclose($serial);
}树莓派上 PHP 可以用 exec() 调用 Python 脚本操作 BCM 引脚。关键点是:Python 脚本必须用 sudo 权限运行(或配置 www-data 免密 sudo),且 RGB 灯需接在支持硬件 PWM 的引脚(如 BCM12、BCM13、BCM18)
。
RPi.GPIO 设置 GPIO.PWM(),不能用软件模拟 PWM(抖动严重)exec(),防止命令注入;用 escapeshellarg() 包裹参数255 - value 反转exec('sudo /usr/bin/python3 /var/www/light.py ' . escapeshellarg('255,0,128'), $output, $return_code);把 ESP 设为 AP 或 STA 模式,运行 Web 服务(如 ESPAsyncWebServer),监听 POST /set?r=255&g=0&b=128。PHP 用 file_get_contents() 或 cURL 发请求——这种方式解耦强、跨平台、无需权限配置。
r/g/b 是否为 0–255 整数,否则可能崩溃或颜色错乱timeout(stream_context_create(['http'=>['timeout'=>3]])),避免灯离线时 PHP 卡死http://192.168.4.1/set?...;若连家庭 Wi-Fi,则用其局域网 IP$url = 'http://192.168.4.1/set?r=' . urlencode(255) . '&g=' . urlencode(0) . '&b=' . urlencode(128); file_get_contents($url, false, stream_context_create(['http'=>['timeout'=>2]]));
真正难的不是发三个数字,而是确保链路每一环都稳:串口不丢帧、Python 不被 SIGTERM 杀掉、ESP 不因 Wi-Fi 重连断开 HTTP 服务。调试时先用 screen /dev/ttyUSB0 115200 或 curl -v 看原始通信,再查 PHP 日志里的 exec 返回码或 fopen 错误提示。