Pi4J框架入门 #
一、Pi4J概述 #
1.1 Pi4J简介 #
Pi4J是一个专为树莓派设计的Java库,提供了对GPIO、I2C、SPI、串口等硬件接口的访问能力。
text
┌─────────────────────────────────────────────────────────┐
│ Pi4J架构 │
├─────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ Pi4J Context │ │
│ │ ┌─────────┬─────────┬─────────┬─────────┐ │ │
│ │ │ GPIO │ I2C │ SPI │ Serial │ │ │
│ │ └────┬────┴────┬────┴────┬────┴────┬────┘ │ │
│ │ │ │ │ │ │ │
│ │ ┌────┴────┬────┴────┬────┴────┬────┴────┐ │ │
│ │ │ Digital │ Analog │ PWM │ I2C │ │ │
│ │ │ Input │ Input │ Output │ Device │ │ │
│ │ │ Output │ Output │ │ │ │ │
│ │ └─────────┴─────────┴─────────┴─────────┘ │ │
│ └─────────────────────────────────────────────────┘ │
│ │ │
│ ┌──────┴──────┐ │
│ │ pigpio │ │
│ │ (底层驱动) │ │
│ └─────────────┘ │
│ │
└─────────────────────────────────────────────────────────┘
1.2 Pi4J版本 #
| 版本 | 说明 |
|---|---|
| Pi4J V1 | 传统版本,API较旧 |
| Pi4J V2 | 新版本,模块化设计,推荐使用 |
1.3 添加依赖 #
xml
<dependencies>
<dependency>
<groupId>com.pi4j</groupId>
<artifactId>pi4j-core</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.pi4j</groupId>
<artifactId>pi4j-plugin-raspberrypi</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.pi4j</groupId>
<artifactId>pi4j-plugin-pigpio</artifactId>
<version>2.3.0</version>
</dependency>
</dependencies>
二、Pi4J上下文 #
2.1 创建上下文 #
java
package com.example.pi4j;
import com.pi4j.Pi4J;
import com.pi4j.context.Context;
public class Pi4JContext {
public static void main(String[] args) {
Context pi4j = Pi4J.newAutoContext();
System.out.println("Pi4J版本: " + pi4j.version());
System.out.println("平台: " + pi4j.platform().getName());
pi4j.shutdown();
}
}
2.2 上下文配置 #
java
package com.example.pi4j;
import com.pi4j.Pi4J;
import com.pi4j.context.Context;
import com.pi4j.context.ContextConfig;
public class Pi4JConfig {
public static void main(String[] args) {
ContextConfig config = ContextConfig.newBuilder()
.setAutoDetectPlatforms(true)
.setAutoInjectProviders(true);
Context pi4j = Pi4J.newContext(config);
System.out.println("检测到的平台:");
pi4j.platforms().all().forEach((id, platform) -> {
System.out.println(" - " + platform.getName());
});
pi4j.shutdown();
}
}
三、GPIO操作 #
3.1 数字输出 #
java
package com.example.pi4j.gpio;
import com.pi4j.Pi4J;
import com.pi4j.io.gpio.digital.*;
public class DigitalOutputExample {
public static void main(String[] args) throws InterruptedException {
var pi4j = Pi4J.newAutoContext();
var led = DigitalOutput.newConfigBuilder(pi4j)
.id("led")
.name("LED")
.address(17)
.shutdown(DigitalState.LOW)
.initial(DigitalState.LOW)
.provider("pigpio-digital-output");
DigitalOutput output = pi4j.create(led);
System.out.println("LED闪烁演示");
for (int i = 0; i < 10; i++) {
output.high();
System.out.println("LED ON");
Thread.sleep(500);
output.low();
System.out.println("LED OFF");
Thread.sleep(500);
}
pi4j.shutdown();
}
}
3.2 数字输入 #
java
package com.example.pi4j.gpio;
import com.pi4j.Pi4J;
import com.pi4j.io.gpio.digital.*;
public class DigitalInputExample {
public static void main(String[] args) throws InterruptedException {
var pi4j = Pi4J.newAutoContext();
var button = DigitalInput.newConfigBuilder(pi4j)
.id("button")
.name("Button")
.address(18)
.pull(PullResistance.PULL_UP)
.debounce(3000L)
.provider("pigpio-digital-input");
DigitalInput input = pi4j.create(button);
input.addListener(event -> {
System.out.println("按钮状态变化: " + event.state());
});
System.out.println("按钮监听已启动,按Ctrl+C退出");
Thread.sleep(Long.MAX_VALUE);
}
}
四、I2C通信 #
4.1 I2C设备操作 #
java
package com.example.pi4j.i2c;
import com.pi4j.Pi4J;
import com.pi4j.io.i2c.I2C;
import com.pi4j.io.i2c.I2CConfig;
public class I2CExample {
public static void main(String[] args) {
var pi4j = Pi4J.newAutoContext();
I2CConfig config = I2C.newConfigBuilder(pi4j)
.id("i2c-device")
.name("I2C Device")
.bus(1)
.device(0x48)
.build();
I2C device = pi4j.create(config);
device.writeRegisterByte(0x00, (byte) 0x55);
int value = device.readRegisterByte(0x00);
System.out.printf("读取值: 0x%02X%n", value);
pi4j.shutdown();
}
}
五、SPI通信 #
5.1 SPI设备操作 #
java
package com.example.pi4j.spi;
import com.pi4j.Pi4J;
import com.pi4j.io.spi.Spi;
import com.pi4j.io.spi.SpiConfig;
import com.pi4j.io.spi.SpiMode;
public class SPIExample {
public static void main(String[] args) {
var pi4j = Pi4J.newAutoContext();
SpiConfig config = Spi.newConfigBuilder(pi4j)
.id("spi-device")
.name("SPI Device")
.bus(0)
.chipSelect(0)
.mode(SpiMode.MODE_0)
.baud(1000000)
.build();
Spi spi = pi4j.create(config);
byte[] txData = {0x01, 0x02, 0x03};
byte[] rxData = spi.transfer(txData);
System.out.print("接收数据: ");
for (byte b : rxData) {
System.out.printf("0x%02X ", b);
}
System.out.println();
pi4j.shutdown();
}
}
六、PWM输出 #
6.1 PWM控制 #
java
package com.example.pi4j.pwm;
import com.pi4j.Pi4J;
import com.pi4j.io.pwm.Pwm;
import com.pi4j.io.pwm.PwmConfig;
import com.pi4j.io.pwm.PwmType;
public class PWMExample {
public static void main(String[] args) throws InterruptedException {
var pi4j = Pi4J.newAutoContext();
PwmConfig config = Pwm.newConfigBuilder(pi4j)
.id("pwm-led")
.name("PWM LED")
.address(18)
.pwmType(PwmType.HARDWARE)
.frequency(1000)
.dutyCycle(0)
.build();
Pwm pwm = pi4j.create(config);
System.out.println("PWM呼吸灯效果");
for (int cycle = 0; cycle < 3; cycle++) {
for (int duty = 0; duty <= 100; duty++) {
pwm.on(1000, duty);
Thread.sleep(10);
}
for (int duty = 100; duty >= 0; duty--) {
pwm.on(1000, duty);
Thread.sleep(10);
}
}
pwm.off();
pi4j.shutdown();
}
}
七、总结 #
Pi4J框架要点:
- 上下文管理:使用Pi4J上下文管理所有IO资源
- 配置构建器:使用Builder模式配置IO设备
- Provider机制:通过Provider支持不同硬件平台
- 资源清理:使用shutdown()正确释放资源
- 事件监听:支持事件驱动的IO操作
下一章我们将学习DioZero库的使用。
最后更新:2026-03-27