关于树莓派使用java点亮pcf8574+lcd1602时踩的坑
- 硬件层面
- 型号
- 接线
- 乱码
- 显示
- 树莓派上的设置
- 软件层面
- 环境
- 代码
- 远程部署
最近入手了一块树莓派4b.作为一个只会用java的小白,肯定要看一下怎么才能用java控制树莓派啊对不对
so我踏上了pi4j这条艰难的路.
今天主要介绍下用pi4j控制pcf8574+lcd1602时踩的坑.
硬件层面
在此将介绍我在硬件层面遇到的大坑
型号
这是个无数人踩过的坑。pcf8574(t) 与 pcf8574a(t) 会有差异!!!(包括但不限于硬件地址等).
接线
接线是个贼坑的问题.
网上某篇文章说树莓派的sda接pcf8574的scl,树莓派scl接 pcf8574的sda.
这尼玛不是坑人么
(正确接法:3.3v →vcc; gnd→gnd; sda→sda; scl→scl)
使用杜邦线连接之后如果出问题的话可以看一眼是不是接触不良.
乱码
我的lcd1602在程序运行之后接触不良会乱码(如下图)
ctrl+c重新运行完事
(其他乱码应该是编码问题)
显示
还有一个就是显示的问题
店家给的资料说长期接5v会损坏,建议接3.3v.看不清可以调pcf8574的可调电位器
但是巨大的问题是 调完了也一样不清楚.
那就不能赖我了对吧.于是接5v+适当的电阻→调电位器 终于能看清楚了.
树莓派上的设置
要先安装i2ctools
sudo apt-get install i2c-tools
然后开启i2c
sudo raspi-config
软件层面
环境
树莓派只能装jdk8或者jdk11.店家预装系统的时候也帮我装了个jdk11.最开始在idea里,我的jdk版本是13.在电脑上编译完拿到树莓派上总是报错.后来一想可能是jdk版本的问题,就都换成了jdk11.
最离谱的事来了
jdk9开始有了一个叫做" 非法反射访问警告 "的东西(别问我,我也没学明白呢)以至于代码运行起来会有如下报错
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.pi4j.io.file.LinuxFile (file:/opt/pi4j /lib/pi4j-core.jar) to field java.nio.Buffer.address
WARNING: Please consider reporting this to the maintainers of com.pi4j.io.file.L inuxFile
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflect ive access operations
WARNING: All illegal access operations will be denied in a future release
Exception in thread "Thread-1" java.lang.NoClassDefFoundError: sun/misc/SharedSe crets
at com.pi4j.io.file.LinuxFile.getFileDescriptor(LinuxFile.java:215)
at com.pi4j.io.file.LinuxFile.ioctl(LinuxFile.java:103)
at com.pi4j.io.i2c.impl.I2CBusImpl.selectBusSlave(I2CBusImpl.java:291)
at com.pi4j.io.i2c.impl.I2CBusImpl.runBusLockedDeviceAction(I2CBusImpl.j ava:258)
at com.pi4j.io.i2c.impl.I2CBusImpl.readBytesDirect(I2CBusImpl.java:149)
at com.pi4j.io.i2c.impl.I2CDeviceImpl.read(I2CDeviceImpl.java:192)
at com.pi4j.gpio.extension.pcf.PCF8574GpioProvider$GpioStateMonitor.run( PCF8574GpioProvider.java:219)
Caused by: java.lang.ClassNotFoundException: sun.misc.SharedSecrets
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinCla ssLoader.java:581)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(C lassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
... 7 more
Exception in thread "main" java.lang.RuntimeException: java.io.IOException: 远程 I/O 错误
at com.pi4j.gpio.extension.pcf.PCF8574GpioProvider.setState(PCF8574GpioP rovider.java:157)
at com.pi4j.io.gpio.GpioProviderBase.export(GpioProviderBase.java:104)
at com.pi4j.io.gpio.impl.GpioPinImpl.export(GpioPinImpl.java:158)
at com.pi4j.io.gpio.impl.GpioControllerImpl.provisionPin(GpioControllerI mpl.java:566)
at com.pi4j.io.gpio.impl.GpioControllerImpl.provisionDigitalOutputPin(Gp ioControllerImpl.java:718)
at com.pi4j.io.gpio.impl.GpioControllerImpl.provisionDigitalOutputPin(Gp ioControllerImpl.java:712)
at PCF8574GpioExample.main(PCF8574GpioExample.java:93)
Caused by: java.io.IOException: 远程 I/O 错误
at java.base/java.io.RandomAccessFile.write0(Native Method)
at java.base/java.io.RandomAccessFile.write(RandomAccessFile.java:523)
at java.base/java.io.RandomAccessFile.writeByte(RandomAccessFile.java:10 25)
at com.pi4j.io.i2c.impl.I2CBusImpl.lambda$writeByteDirect$4(I2CBusImpl.j ava:170)
at com.pi4j.io.i2c.impl.I2CBusImpl.runBusLockedDeviceAction(I2CBusImpl.j ava:260)
at com.pi4j.io.i2c.impl.I2CBusImpl.writeByteDirect(I2CBusImpl.java:169)
at com.pi4j.io.i2c.impl.I2CDeviceImpl.write(I2CDeviceImpl.java:92)
at com.pi4j.gpio.extension.pcf.PCF8574GpioProvider.setState(PCF8574GpioP rovider.java:155)
... 6 more
pi@raspberrypi:/opt/pi4j/examples $
所以我只好把idea和树莓派上都改成jdk8.
注意: 原先树莓派是jdk11的不用卸载 只需执行
sudo update-alternatives --config java
选择你jdk8的编号
就ok
然后还是没法运行就离谱.
忽然间想到忘记重新编译了.
cd /opt/pi4j/examples
./build
再试试哈
./run pi(我的程序名字)
安排上了!!!
代码
记得import!!!
记得import!!!
记得import!!!
还有就是刚开始用pi4j的时候如果代码"一片红",可以试试 添加依赖/用maven.
远程部署
这个我尝试过只用tomcat,没成功过…可能是jdk的问题?
有兴趣的小伙伴可以百度下.百度上有spring boot+tomcat实现的方法.
回头有时间我就再试试,成功了就再写一篇.当然,大家也可以留言来讨论下.