在此将介绍我在硬件层面遇到的大坑
这是个无数人踩过的坑。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实现的方法. 回头有时间我就再试试,成功了就再写一篇.当然,大家也可以留言来讨论下.