You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派4使用Pi4J v2时GPIO输入状态无变化问题求助

问题排查与解决方案

针对你遇到的Pi4J v2监听GPIO输入无响应的问题,从代码和依赖配置入手,以下是具体排查点和修复方案:

1. 移除不兼容的v1依赖

你的pom.xml中包含了Pi4J v1的pi4j-gpio-extension依赖,这会和v2的核心库及插件产生冲突,必须删除:

<!-- 删掉这行,v2不需要这个依赖 -->
<dependency>
    <groupId>com.pi4j</groupId>
    <artifactId>pi4j-gpio-extension</artifactId>
    <version>1.3</version>
</dependency>

2. 调整引脚地址与防抖配置

Pi4J v2推荐使用官方定义的引脚常量避免地址类型混淆,同时你设置的3000ms防抖时间过长,可能错过信号变化:

// 替换原来的int常量,使用Pi4J提供的引脚常量
private final static Pin inputOne = RaspberryPiPin.GPIO_27; // PIN 13, BCM 27

// 配置部分修改
var isInput = DigitalInput.newConfigBuilder(pi4j)
        .id("0")
        .name("inputOne")
        .address(inputOne) // 使用Pin对象而非int
        .pull(PullResistance.PULL_DOWN)
        .debounce(100L) // 缩短防抖时间至100ms
        .provider("pigpio-digital-input")
        .build();

3. 检查Pigpio服务状态

Pi4J v2的pigpio插件依赖系统的pigpiod服务,确保它正在运行:

sudo systemctl start pigpiod
# 设置开机自启,避免每次重启手动启动
sudo systemctl enable pigpiod

4. 验证权限与主动读取状态

  • 运行Java程序时必须用root权限,否则无法访问GPIO:
sudo java -jar your-jar-file.jar
  • 在代码中主动读取当前输入状态,排除监听器逻辑问题:
// 添加监听器后,主动打印当前状态
console.print("Current input state: " + inputPin.state());

5. 调整拉电阻配置

你检测到输入有2.6V,但设置了PULL_DOWN,如果外部输入驱动能力不足,可能导致电平被下拉拉低。可以尝试关闭拉电阻测试:

.pull(PullResistance.OFF)

修改后的完整代码示例

import com.pi4j.Pi4J;
import com.pi4j.context.Context;
import com.pi4j.io.gpio.digital.DigitalInput;
import com.pi4j.io.gpio.digital.DigitalState;
import com.pi4j.io.gpio.digital.PullResistance;
import com.pi4j.plugin.raspberrypi.pin.RaspberryPiPin;
import com.pi4j.util.Console;

import java.io.IOException;

public class App {

    private final static Pin inputOne = RaspberryPiPin.GPIO_27; // PIN 13, BCM 27
    private final static Context pi4j = Pi4J.newAutoContext();

    public static void main(String[] args) throws InterruptedException, IOException {
        final Console console = new Console();
        console.promptForExit();

        // I/O Config Build
        var isInput = DigitalInput.newConfigBuilder(pi4j)
                .id("0")
                .name("inputOne")
                .address(inputOne)
                .pull(PullResistance.OFF)
                .debounce(100L)
                .provider("pigpio-digital-input")
                .build();

        // I/O Build
        var inputPin = pi4j.din().create(isInput);

        // 主动打印初始状态
        console.print("Initial input state: " + inputPin.state());

        inputPin.addListener(e -> {
            if (e.state() == DigitalState.HIGH) {
                console.print("Input detected HIGH");
            } else {
                console.print("Input detected LOW");
            }
        });

        console.waitForExit();
        pi4j.shutdown();
    }
}

修改后的pom.xml依赖部分

<dependencies>
    <dependency>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>3.2.2</version>
        <type>maven-plugin</type>
    </dependency>
    <dependency>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.3.0</version>
        <type>maven-plugin</type>
    </dependency>
    <dependency>
        <groupId>ca.rmen</groupId>
        <artifactId>lib-sunrise-sunset</artifactId>
        <version>1.1.1</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>io.github.zeroone3010</groupId>
        <artifactId>yetanotherhueapi</artifactId>
        <version>2.6.0</version>
    </dependency>
    <dependency>
        <groupId>com.pi4j</groupId>
        <artifactId>pi4j-core</artifactId>
        <version>2.1.1</version>
    </dependency>
    <dependency>
        <groupId>com.pi4j</groupId>
        <artifactId>pi4j-plugin-raspberrypi</artifactId>
        <version>2.1.1</version>
    </dependency>
    <dependency>
        <groupId>com.pi4j</groupId>
        <artifactId>pi4j-plugin-pigpio</artifactId>
        <version>2.1.1</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.36</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-simple</artifactId>
        <version>1.7.36</version>
    </dependency>
</dependencies>

内容的提问来源于stack exchange,提问作者Dahlin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 18:06:29