【问题标题】:Arduino ESP32 TwoWire "method" doesn't workArduino ESP32 TwoWire“方法”不起作用
【发布时间】:2021-02-03 15:57:53
【问题描述】:

我无法在两个 I2C 接口上使用两个传感器。

问题是,当我尝试用以下内容替换 Wire.begin() 时:I2C.begin(21, 22),我的传感器 QMC5883L 返回 x、y 和 z 0。我手动包含了 Wire 库并创建了一个 TwoWire 对象:

#include <Wire.h>   
TwoWire I2C = TwoWire(0);

当我尝试这个时,我在库中评论了_wire-&gt;begin(),它与草图中的Wire.begin() 的评论行一起工作,但是当我尝试将Wire.begin()替换为I2C.begin(21, 22) 已经不行了。

这应该起作用的原因是我想创建 2 个这样的接口,然后将它们提供给 compass.begin(&amp;I2C) 方法。在图书馆里我有这个:

void QMC5883LCompass::init(TwoWire *theWire){
  _wire = theWire;
  _wire->begin(); // this is the line I commented, when getting the zeros...
  _writeReg(0x0B,0x01);
  setMode(0x01,0x0C,0x10,0X00); 
}

我是不是忘记了什么?

【问题讨论】:

    标签: arduino esp32


    【解决方案1】:

    问题是当调用_wire-&gt;begin()实际上是调用默认定义(来自Wire.h):

    bool begin(int sda=-1, int scl=-1, uint32_t frequency=0);
    

    SDA/SCL 的默认参数 -1 表示默认引脚,它会覆盖您在第一个 begin(...) 中添加的引脚

    假设您使用的是 https://github.com/mprograms/QMC5883LCompass,解决方案是继承 QMC5883LCompass 并覆盖 void QMC5883LCompass::init() 或根据您的特定需求创建一个新的 init(...)。

    【讨论】:

    • 好的,但是该库最初只有一个 Wire.begin() 方法(我重写了这部分,使用 _wire-&gt;begin() ,因为我认为使用 _wire = theWire,_wire 不是默认值,而是新的 TwoWire对象。(我有来自 GitHub 的 BME280 库的那个想法)。你在那里做同样的事情,我假设它在那里工作(我没有 BME280,但我看到了一个例子)。
    • 嗯。好像我误解了您更改的内容以及原始内容是什么。什么有效,什么无效? _wire.begin() 有效,但 _wire.begin(21, 22) 无效?问题可能是库使用默认的 Wire.xxx 但您正在初始化一个单独的对象?
    • 好的,我现在知道了,出了什么问题(愚蠢的错误)。库中的默认值是 Wire.begin()、Wire.write()、Wire.read() 等,我只将 Wire.begin() 更改为 _wire->begin()。我现在已经为所有这些行做了。现在可以了
    • 很高兴您找到了解决方案!
    猜你喜欢
    • 2020-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    相关资源
    最近更新 更多