树莓派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
相关产品推荐
相关产品推荐

