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

    科技2022-07-15  149

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

    Processed: 0.012, SQL: 8