在 C++ 类中定义 PCF8574 I2C 扩展器设备

问题描述 投票:0回答:1

我正在尝试使用 VScode 和 platforIO 将 ESP32 与 PCF8574 结合使用。 基本上它运行良好 - 我可以在编译后上传代码并控制 LED。

定义I2C扩展器(PCF8574)时,需要物理I2C地址。在本例中它是 0x38,并且从硬件的角度来看它运行良好,只要我直接从 setup() 例程使用它即可。 定义如下:

PCF8574 i2c_ctrl1(0x38); // Option A
当放置在“init()”例程中时(请参见下面的代码,如“选项 A”),init() 运行良好,但当然“i2c_ctrl”变量在 init() 之外无法识别。

我确信选项 B(在类的全局部分中定义 i2c_ctrl 变量会起作用,但在这种情况下,由于“0x38”值,编译失败:“错误:数字常量之前的预期标识符”

我做错了什么?

这是代码:

` #include“PCF8574.h”

I2C_设备类{

public:
    PCF8574 i2c_ctrl(0x38);  // Option B



void I2C_init() {
    //PCF8574 i2c_ctrl(0x38); // Option A
    i2c_ctrl.pinMode(P3,OUTPUT); // LED1
    i2c_ctrl.pinMode(P4,OUTPUT); // LED2
    i2c_ctrl.pinMode(P5,OUTPUT); // LED3
    i2c_ctrl.pinMode(P6,OUTPUT); // LED4
    i2c_ctrl.pinMode(P7,OUTPUT); // LED5
    i2c_ctrl.begin();
} // of I2C_init

void Led1_On() {
    i2c_ctrl.digitalWrite(P3,LOW);
} // of Led1_On()

void Led2_On() {
    i2c_ctrl.digitalWrite(P4,LOW);
} // of Led2_On()

`

我期望全局变量能够工作,特别是因为它需要物理地址,因为可能还有其他这样的扩展器。

esp32 i2c
1个回答
0
投票

这是我在其他地方得到的帮助: 下面的代码风格通过使用构造函数解决了这个问题。

#include "PCF8574.h"

class Extension : public PCF8574 {
  public:
    Extension(const byte addr = 0x38) : PCF8574(addr) {}
    
    void begin() {
      pinMode(P3, OUTPUT); // LED1
      pinMode(P4, OUTPUT); // LED2
      pinMode(P5, OUTPUT); // LED3
      pinMode(P6, OUTPUT); // LED4
      pinMode(P7, OUTPUT); // LED5
    }

    void led1On() { digitalWrite(P3, LOW); }
    void led2On() { digitalWrite(P4, LOW); }
};

// Create an instance of Extension with the default address 0x38
Extension extender;
© www.soinside.com 2019 - 2024. All rights reserved.