我正在尝试使用 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()
`
我期望全局变量能够工作,特别是因为它需要物理地址,因为可能还有其他这样的扩展器。
这是我在其他地方得到的帮助: 下面的代码风格通过使用构造函数解决了这个问题。
#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;