WiringPI是否支持2个以上GPIO引脚?4路LED仅2路工作故障咨询
WiringPI多GPIO引脚支持问题排查
当然支持啊!WiringPI完全能同时控制多个GPIO引脚——别说4个,几十个都没问题。你的问题大概率不是WiringPI本身的限制,而是硬件连接、后端代码或者权限这些环节出了问题,咱们一步步排查:
1. 先确认硬件与引脚编号是否正确
这是最容易踩坑的点:
- WiringPI有三种编号模式(WiringPI编号、BCM编号、物理引脚编号),你要确保代码里用的编号和实际接线的引脚一致。可以用命令
gpio readall打印所有引脚的状态,对照确认你用到的4个引脚编号是否正确。 - 检查那两个不工作的LED:有没有串联220-330Ω的限流电阻?接线是否松动?阳极(长脚)是否接GPIO、阴极(短脚)是否接地(或者反过来,取决于你代码里的高低电平逻辑)?
2. 后端gpio.php代码是核心问题
你的前端表单提交到gpio.php,但如果这个脚本里只处理了17、22两个引脚,那另外两个LED自然没反应。举个正确处理4个引脚的示例:
<?php // 初始化WiringPI(用BCM编号,和你提到的17、22对应) if (!wiringPiSetupGpio()) { die("WiringPI初始化失败"); } // 定义你要控制的4个引脚(替换成你实际用的引脚号) $ledPins = [17, 22, 23, 24]; // 把所有引脚设置为输出模式 foreach ($ledPins as $pin) { pinMode($pin, OUTPUT); } // 处理全亮请求 if (isset($_GET['on'])) { foreach ($ledPins as $pin) { digitalWrite($pin, HIGH); } } // 处理全灭请求 if (isset($_GET['off'])) { foreach ($ledPins as $pin) { digitalWrite($pin, LOW); } } // 如果要实现组合状态控制(比如单独亮某几个LED),需要在前端表单里加对应的参数,比如: // <input type="submit" value="LED1+LED3亮" name="led1_3_on"> // 然后在后端增加对应的处理逻辑: // if (isset($_GET['led1_3_on'])) { // digitalWrite(17, HIGH); // digitalWrite(22, LOW); // digitalWrite(23, HIGH); // digitalWrite(24, LOW); // } ?>
重点:要确保每个引脚都执行了pinMode初始化,并且在处理按钮请求时,对所有需要控制的引脚执行digitalWrite操作。
3. 检查Web服务器的GPIO权限
运行Web服务的用户(比如Apache的www-data)默认没有GPIO操作权限,这也会导致部分引脚无响应。执行以下命令给用户添加权限:
sudo usermod -a -G gpio www-data sudo systemctl restart apache2 # 如果用Nginx就重启nginx服务
4. 排查引脚是否被占用
用gpio readall命令查看那两个不工作的引脚状态:
- 如果
MODE列不是OUT,说明没设置成输出模式; - 如果
VALUE列状态异常,可能有其他程序在占用这个引脚,关闭其他GPIO相关程序再试试。
内容的提问来源于stack exchange,提问作者Kharlo Cariaga
相关产品推荐
相关产品推荐

