本文目录导读:

我来为您介绍几个Java在树莓派上的经典应用案例,从基础到进阶。
LED闪烁控制(GPIO基础)
硬件准备
- 树莓派(任何型号)
- LED灯 + 330Ω电阻
- 面包板和跳线
完整代码示例
import com.pi4j.io.gpio.*;
public class LEDBlink {
public static void main(String[] args) throws InterruptedException {
// 创建GPIO控制器
final GpioController gpio = GpioFactory.getInstance();
// 配置GPIO 1号引脚(BCM编号)为输出
final GpioPinDigitalOutput led = gpio.provisionDigitalOutputPin(
RaspiPin.GPIO_01, "LED", PinState.LOW);
System.out.println("LED闪烁程序开始...");
// 闪烁10次
for (int i = 0; i < 10; i++) {
led.high(); // 亮
Thread.sleep(500); // 500ms
led.low(); // 灭
Thread.sleep(500);
System.out.println("第" + (i+1) + "次闪烁");
}
// 关闭LED和GPIO
led.low();
gpio.shutdown();
}
}
Maven依赖(pom.xml)
<dependencies>
<dependency>
<groupId>com.pi4j</groupId>
<artifactId>pi4j-core</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
温湿度传感器(DHT11/DHT22)
接线方式
- VCC → 3.3V
- DATA → GPIO 4 (BCM)
- GND → GND
传感器读取代码
import com.pi4j.wiringpi.Gpio;
import com.pi4j.wiringpi.GpioUtil;
public class DHT11Sensor {
private static final int DHT_PIN = 4; // GPIO 4
public static void main(String[] args) {
// 启用引脚
GpioUtil.enableNonPrivilegedAccess();
Gpio.wiringPiSetup();
DHT11Sensor dht = new DHT11Sensor();
// 每2秒读取一次数据
while (true) {
double[] data = dht.readData();
if (data != null) {
System.out.printf("温度: %.1f°C, 湿度: %.1f%%%n",
data[0], data[1]);
}
Thread.sleep(2000);
}
}
private double[] readData() {
// 设置引脚为输出模式发送启动信号
Gpio.pinMode(DHT_PIN, Gpio.OUTPUT);
Gpio.digitalWrite(DHT_PIN, Gpio.LOW);
delay(18);
Gpio.digitalWrite(DHT_PIN, Gpio.HIGH);
delayMicroseconds(40);
// 切换为输入模式
Gpio.pinMode(DHT_PIN, Gpio.INPUT);
// 读取40位数据
int[] data = new int[40];
// ... (具体时序读取代码)
// 解析温度和湿度
int humidity = (data[0] << 8) | data[1];
int temperature = (data[2] << 8) | data[3];
// 转换为实际值
return new double[]{temperature / 10.0, humidity / 10.0};
}
}
摄像头拍照 + 人脸检测
项目结构
raspberry-pi-camera/
├── pom.xml
├── src/main/java/
│ ├── CameraService.java
│ ├── FaceDetector.java
│ └── MainApplication.java
└── src/main/resources/
└── haarcascade_frontalface.xml
摄像头控制服务
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class CameraService {
// 拍照命令封装
public String takePhoto(String filename) throws Exception {
String command = String.format(
"raspistill -o /home/pi/photos/%s.jpg -w 640 -h 480",
filename
);
return executeCommand(command);
}
// 视频录制
public String startRecording(String filename, int duration) throws Exception {
String command = String.format(
"raspivid -o /home/pi/videos/%s.h264 -t %d -w 640 -h 480",
filename, duration * 1000
);
return executeCommand(command);
}
private String executeCommand(String command) throws Exception {
ProcessBuilder pb = new ProcessBuilder("/bin/bash", "-c", command);
Process process = pb.start();
BufferedReader reader = new BufferedReader(
new InputStreamReader(process.getInputStream()));
StringBuilder output = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
output.append(line).append("\n");
}
process.waitFor();
return output.toString();
}
}
人脸检测
import org.opencv.core.*;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.objdetect.CascadeClassifier;
public class FaceDetector {
private static final String CASCADE_PATH =
"/home/pi/opencv/data/haarcascades/haarcascade_frontalface_default.xml";
public void detectFaces(String imagePath) {
// 加载OpenCV库
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
// 读取图片
Mat image = Imgcodecs.imread(imagePath);
// 加载人脸检测器
CascadeClassifier faceDetector = new CascadeClassifier(CASCADE_PATH);
// 检测人脸
MatOfRect faceDetections = new MatOfRect();
faceDetector.detectMultiScale(image, faceDetections);
System.out.println("检测到 " + faceDetections.toArray().length + " 张人脸");
// 绘制框框
Mat imageWithFaces = image.clone();
for (Rect rect : faceDetections.toArray()) {
Imgproc.rectangle(imageWithFaces,
new Point(rect.x, rect.y),
new Point(rect.x + rect.width, rect.y + rect.height),
new Scalar(0, 255, 0), 3);
}
// 保存结果
Imgcodecs.imwrite("detected_faces.jpg", imageWithFaces);
}
}
Web服务器 + 远程控制
Spring Boot 应用程序
@SpringBootApplication
@RestController
public class RaspberryPiWebServer {
@Autowired
private GpioService gpioService;
public static void main(String[] args) {
SpringApplication.run(RaspberryPiWebServer.class, args);
}
@GetMapping("/")
public String home() {
return "树莓派设备状态:" + getSystemInfo();
}
@GetMapping("/gpio/{pin}/on")
public String turnOn(@PathVariable int pin) {
gpioService.turnOn(pin);
return "Pin " + pin + " 已开启";
}
@GetMapping("/gpio/{pin}/off")
public String turnOff(@PathVariable int pin) {
gpioService.turnOff(pin);
return "Pin " + pin + " 已关闭";
}
@GetMapping("/sensor/temperature")
public Map<String, Double> getTemperature() {
Map<String, Double> data = new HashMap<>();
data.put("temperature", sensorService.readTemperature());
data.put("humidity", sensorService.readHumidity());
return data;
}
}
自动化监控系统
系统架构图
graph LR
A[传感器数据] --> B[数据采集服务]
B --> C[消息队列]
C --> D[数据分析]
D --> E[告警系统]
E --> F[Web界面]
数据采集主程序
public class MonitorSystem {
private static final String INFLUXDB_URL = "http://localhost:8086";
private static final String DATABASE = "raspberry_monitor";
public static void main(String[] args) {
// 初始化数据源
DataSourceManager dsm = new DataSourceManager();
dsm.addSensor(new DHT11Sensor(4)); // 温湿度
dsm.addSensor(new GPSSensor("/dev/ttyAMA0")); // GPS
dsm.addSensor(new MotionSensor(17)); // 运动传感器
// 启动数据采集
ScheduledExecutorService scheduler =
Executors.newScheduledThreadPool(4);
scheduler.scheduleAtFixedRate(() -> {
SensorData data = dsm.collectAllData();
saveToDatabase(data);
checkAndAlert(data);
}, 0, 5, TimeUnit.SECONDS);
// 实时显示
new DashboardGUI().start();
}
private static void saveToDatabase(SensorData data) {
InfluxDB influxDB = InfluxDBFactory.connect(INFLUXDB_URL);
Point point = Point.measurement("environment")
.time(System.currentTimeMillis(), TimeUnit.MILLISECONDS)
.addField("temperature", data.getTemperature())
.addField("humidity", data.getHumidity())
.build();
influxDB.write(DATABASE, "autogen", point);
}
private static void checkAndAlert(SensorData data) {
if (data.getTemperature() > 40) {
sendAlert("高温警告!温度达到: " + data.getTemperature());
}
if (data.getMotionDetected()) {
sendAlert("检测到运动!");
takePicture();
}
}
}
部署与运行
编译和打包
# 编译项目 mvn clean package # 运行普通应用 sudo java -jar raspberry-app.jar # 使用systemd服务管理
systemd服务配置
# /etc/systemd/system/raspberry-app.service [Unit] Description=Raspberry Pi Java Application After=network.target [Service] Type=simple User=pi WorkingDirectory=/home/pi ExecStart=/usr/bin/java -jar /home/pi/raspberry-app.jar Restart=on-failure RestartSec=10 [Install] WantedBy=multi-user.target
性能优化建议
JVM参数优化
java -Xmx512M -Xms256M
-XX:+UseG1GC
-XX:+UseCompressedOops
-Djava.awt.headless=true
-jar app.jar
资源管理
- 使用
try-with-resources管理GPIO资源 - Implement AutoCloseable接口
- 使用连接池管理数据库连接
try (GpioController gpio = GpioFactory.getInstance()) {
// 使用GPIO...
} catch (IOException e) {
// 处理异常
}
// 自动关闭和释放资源
故障排查
常见问题解决方案
public class Troubleshooting {
// GPIO权限问题
public void checkPermissions() {
System.out.println("检查GPIO权限...");
// 需要root权限或加入gpio组
// sudo usermod -a -G gpio pi
}
// 网络连接检查
public void checkNetwork() {
// 测试服务器连接
try {
Socket socket = new Socket();
socket.connect(new InetSocketAddress("server.com", 8080), 5000);
System.out.println("网络连接正常");
} catch (IOException e) {
System.err.println("网络连接失败: " + e.getMessage());
}
}
// 日志记录
public static void logError(Exception e) {
Logger logger = Logger.getLogger("RaspberryPi");
logger.log(Level.SEVERE, "系统异常", e);
}
}
这些案例涵盖了树莓派Java开发的主要场景,建议从LED控制开始,逐步增加复杂度,注意安全操作GPIO引脚(3.3V),并在实际部署时做好错误处理和异常监测。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播