关于树莓派使用java点亮pcf8574+lcd1602时踩的坑

关于树莓派使用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重新运行完事
(其他乱码应该是编码问题)乱码的lcd1602

显示

还有一个就是显示的问题
店家给的资料说长期接5v会损坏,建议接3.3v.看不清可以调pcf8574的可调电位器
但是巨大的问题是 调完了也一样不清楚.
那就不能赖我了对吧.于是接5v+适当的电阻→调电位器 终于能看清楚了.

树莓派上的设置

要先安装i2ctools

sudo apt-get install i2c-tools

然后开启i2c

sudo raspi-config

raspi-config

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实现的方法.
回头有时间我就再试试,成功了就再写一篇.当然,大家也可以留言来讨论下.

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值