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

Arduino水泵控制程序编译报错求助:缺少Adafruit_I2CDevice.h

解决Arduino Uno编译错误:Adafruit_I2CDevice.h缺失问题

你的编译错误根源很明确:代码开头引用了Adafruit_EEPROM_I2C.h和Adafruit_FRAM_I2C.h两个库,但整个程序完全没用到这两个库的任何功能,且这两个库依赖的Adafruit_I2CDevice.h文件未安装,导致编译失败。

方案1:删除多余库引用(最快捷解决)

你的水泵控制逻辑不需要EEPROM或FRAM存储功能,直接删掉代码开头的两行冗余引用即可:

#include <Adafruit_EEPROM_I2C.h>
#include <Adafruit_FRAM_I2C.h>

删除后重新编译程序,错误会直接消失。

方案2:若后续需要使用EEPROM/FRAM功能

如果你之后要扩展存储相关功能,需通过Arduino库管理器安装完整依赖:

  • 打开Arduino IDE,点击「项目」→「加载库」→「管理库」
  • 在搜索框分别搜索并安装:
    • Adafruit I2C Device
    • Adafruit EEPROM I2C
    • Adafruit FRAM I2C
      安装完成后重新编译即可。

额外优化建议

你当前的代码在整点(7点/12点)会重复执行水泵和伺服动作(整小时内每1秒触发一次),可以添加一个标记变量确保每小时只执行一次:

// 在全局变量区域添加
bool hasRunThisHour = false;

void loop() {
  DateTime now = rtc.now();

  if ((now.hour() == 7 || now.hour() == 12) && !hasRunThisHour) {
    // 移动伺服到开启位置
    myservo.write(0); 
    delay(2000);
    // 启动水泵
    digitalWrite(pumpPin, HIGH);
    delay(10000);
    // 关闭水泵
    digitalWrite(pumpPin, LOW);
    // 移动伺服到关闭位置
    myservo.write(180);
    
    hasRunThisHour = true;
  } else if (now.minute() != 0) {
    // 分钟非0时重置标记,确保下一个整点可再次执行
    hasRunThisHour = false;
  }

  delay(1000);
}

内容的提问来源于stack exchange,提问作者copperton

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 15:35:14