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框架要点:

  1. 上下文管理:使用Pi4J上下文管理所有IO资源
  2. 配置构建器:使用Builder模式配置IO设备
  3. Provider机制:通过Provider支持不同硬件平台
  4. 资源清理:使用shutdown()正确释放资源
  5. 事件监听:支持事件驱动的IO操作

下一章我们将学习DioZero库的使用。

最后更新:2026-03-27