You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:16:15