树莓派3使用java控制gpio接口上的lcd1602显示屏

LCD1602是一个常见的LCD模块,可以显示2*16共32个字符。
pi4j是一个java的gpio控制库,基于WiringPi。pi4j内置了很多组件的驱动,其中就有LCD。然而官网上的javadoc中api的版本跟最新版pi4j不匹配,导致我在使用时踩了不少坑。

树莓派3代B型的GPIO接口在pi4j中的定义如下:

如图,所有标有GPIO的接口都可以直接在java程序里使用。值得注意的是,树莓派上没有模拟IO口,如果需要模拟输入输出就必须添加ADC和DAC模块。
LCD1602的针脚定义可以在网上找到,比如某百科
这里使用4位输出控制,所以只需要把RS、E、D4-D7连接到任意GPIO接口上,D0-D3悬空,其他接口按照一般接线方式连接即可。
下面就可以开始搭建环境并运行程序了。

安装jdk

1
sudo apt-get install oracle-java8-jdk

安装java ide

树莓派3的性能足够强大,直接在上面跑java ide没有任何困难,这样可以大大方便程序调试。这里安装raspbian源里的Eclipse Platform:

1
sudo apt-get install eclipse

下载并安装pi4j

http://pi4j.com/download.html复制deb安装包路径,在树莓派终端里运行:

1
2
3
wget http://get.pi4j.com/download/pi4j-x.deb(x由具体复制到的链接决定)
sudo dpkg -i pi4j-x.deb
pi4j

如果出现
1
2
3
4
5
6
------------------------------
Pi4J Utility Script
------------------------------

No arguments supplied!
Use 'pi4j --help' to display command options.

说明安装成功

创建项目并添加pi4j库

pi4j要求root权限,所以直接运行eclipse会导致调用pi4j的程序无法正常运行。
打开终端,运行

1
sudo eclipse

创建项目,在Build Path的Libraries里面添加pi4j的jar文件,位于/opt/pi4j/lib/下。然后创建相关的package和class。
这里贴上一个在LCD1602上显示Load average的例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package com.imxieyi.rpi.lcd1602;
import java.io.IOException;
import java.io.InputStream;
import com.pi4j.component.lcd.impl.GpioLcdDisplay;
import com.pi4j.io.gpio.Pin;
import com.pi4j.io.gpio.RaspiPin;
public class LCDTest {
static final GpioLcdDisplay lcd =
new GpioLcdDisplay(2, //行数
16, //列数
RaspiPin.GPIO_00, //RS
RaspiPin.GPIO_02, //E
new Pin[] { //数据接口数组
RaspiPin.GPIO_22,//DB4
RaspiPin.GPIO_23,//DB5
RaspiPin.GPIO_24,//DB6
RaspiPin.GPIO_25 //DB7
});
public static void main(String[] args) throws InterruptedException,
IOException {
Process uptime; //uptime进程
InputStream is; //用于读取进程输出信息
String s;
byte[] b;
lcd.writeln(0, "Load average:"); //打印字符,0为第一行,1为第二行,长度超过极限会自动转到下一行,第二行会转到第一行
while (true) {
uptime = Runtime.getRuntime().exec("uptime"); //执行命令
is = uptime.getInputStream(); //获取输入流
s = "";
while (uptime.isAlive()) {
if (is.available() > 0) {
b = new byte[is.available()];
is.read(b);
s += new String(b);
}
}
System.out.println(s);
if(s.indexOf("average:")<=0)continue;
lcd.writeln(
1, s.substring(s.indexOf("average:") + 9,
s.indexOf("average:") + 25)); //uptime输出的字符串会带一个换行符,而换行符正好是第17个字符,会在LCD第一行第一个字符处输出一个谜之符号,所以需要通过限定输出范围避免这个问题。
Thread.sleep(5000); //uptime命令的load average更新间隔为5秒,延时低于5秒无意义
}
}
}

运行效果:

文章目录
  1. 1. 安装jdk
  2. 2. 安装java ide
  3. 3. 下载并安装pi4j
  4. 4. 创建项目并添加pi4j库
|