ATtiny85适配LPS331AP压力传感器编译报错求助
我来帮你解决这个ATtiny85移植LPS331AP的问题——你遇到的错误核心原因是:ATtiny85没有Arduino Uno(ATmega328P)那种硬件TWI寄存器(比如TWSR、TWPS0这些),而你用的LPS库默认依赖硬件I2C的实现,和TinyWire这类软件模拟I2C库冲突了。下面是具体的修复步骤:
1. 统一I2C库,移除冗余依赖
首先删掉代码里的#include "USI_TWI_Master.h",因为TinyWireM(带M的版本是主设备专用)已经封装了USI的软件I2C功能,重复引入会导致冲突。
2. 修改LPS库适配软件I2C
找到你的LPS库安装目录下的LPS.cpp文件,做两个关键修改:
- 把所有
Wire.开头的函数调用(比如Wire.begin()、Wire.write())替换成TinyWireM. - 如果文件里有直接引用TWI硬件寄存器的代码(比如
TWSR、TWBR、TWPS0),直接注释或删除——ATtiny85根本没有这些寄存器,留着只会报错。
3. 修正代码初始化逻辑
把你的测试代码改成下面这样,确保只使用TinyWireM作为I2C驱动:
#include <TinyWireM.h> #include <LPS.h> LPS ps; void setup() { TinyWireM.begin(); // 初始化ATtiny85的软件I2C主设备 ps.enableDefault(); } void loop() { float pressure = ps.readPressureMillibars(); float altitude = ps.pressureToAltitudeMeters(pressure); float temperature = ps.readTemperatureC(); // 要是需要调试,可以加SoftwareSerial串口输出(ATtiny85只有一个硬件串口,得用软件模拟) delay(100); }
4. 检查硬件引脚与编译环境
- ATtiny85用TinyWireM的默认I2C引脚是:SDA=Pin4(PB2),SCL=Pin5(PB0),确认你的传感器连线和这个对应;如果要改引脚,去
TinyWireM库的USI_TWI_Master.h里修改SDA_PIN和SCL_PIN的定义(比如改成你用的PBx引脚)。 - 建议换用SpenceKonde的ATTinyCore板卡包(比旧版的ATtiny支持库更稳定),在Arduino IDE里选对
ATtiny85、内部8MHz时钟的配置。
为什么之前的方法不行?
你之前混用了多个I2C库(TinyWire、USI_TWI_Master),而且LPS库原本是为带硬件TWI的Arduino板设计的,直接拿过来用会调用ATtiny85没有的硬件寄存器,自然会报“未定义标识符”的错误。通过替换成软件I2C并修改LPS库适配,就能解决这个问题。
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

