C++类构造函数传递指针/引用:如何传入PCF8575引脚扩展器
PMotor类优化:构造函数传入PCF8575扩展器的实现
当前方案的问题
- 全局变量
mCW和mCCW属于所有PMotor实例共享,多个电机对象的状态会互相干扰,逻辑完全错误 - 每次调用
on()/off()都要手动传入PCF8575*,代码冗余且容易漏传
最优方案:构造函数传入扩展器
当然可以在构造函数中传入PCF8575扩展器,这是更简洁、健壮的实现方式。核心思路是把扩展器指针作为类的私有成员,在初始化电机对象时一次性传入,后续方法直接使用该成员即可。
修改后的头文件(PMotor.h)
#ifndef PMotor_H #define PMotor_H #include <Arduino.h> #include <PCF8575.h> class PMotor { private: uint8_t _pinA; uint8_t _pinB; bool _isMovingCW; // 改为类成员,每个电机独立维护状态 bool _isMovingCCW; PCF8575* _expander; // 存储扩展器指针 public: // 构造函数新增扩展器指针参数 PMotor(uint8_t pinA, uint8_t pinB, PCF8575* expander); // 移除方法中的扩展器参数,简化调用 void on(uint8_t direction); void on(uint8_t direction, int millisec); void off(); bool movingCW(); bool movingCCW(); }; #endif
修改后的实现文件(PMotor.cpp)
#include "PMotor.h" #include <PCF8575.h> // 用初始化列表初始化所有成员,代码更规范 PMotor::PMotor(uint8_t pinA, uint8_t pinB, PCF8575* expander) : _pinA(pinA), _pinB(pinB), _expander(expander), _isMovingCW(false), _isMovingCCW(false) { } void PMotor::on(uint8_t direction) { if (direction == 0) { _expander->write(_pinA, HIGH); _expander->write(_pinB, LOW); _isMovingCW = true; _isMovingCCW = false; } else { _expander->write(_pinA, LOW); _expander->write(_pinB, HIGH); _isMovingCW = false; _isMovingCCW = true; } } void PMotor::on(uint8_t direction, int millisec) { on(direction); delay(millisec); off(); } void PMotor::off() { _expander->write(_pinA, LOW); _expander->write(_pinB, LOW); _isMovingCW = false; _isMovingCCW = false; } bool PMotor::movingCW() { return _isMovingCW; } bool PMotor::movingCCW() { return _isMovingCCW; }
使用示例
#include <PCF8575.h> #include "PMotor.h" PCF8575 expander(0x20); // 先初始化扩展器 PMotor motor(0, 1, &expander); // 创建电机时传入扩展器指针 void setup() { expander.begin(); } void loop() { motor.on(0); // 正转,无需再传扩展器 delay(1000); motor.off(); delay(500); motor.on(1, 1000); // 反转1秒,自动停止 }
关键说明
- 使用指针而非引用:Arduino中PCF8575对象通常是全局创建的,指针可以避免对象拷贝(PCF8575包含不可拷贝的硬件资源),同时保证电机类操作的是同一个扩展器实例
- 类成员状态:把原来的全局变量改为类私有成员,每个电机对象独立维护自己的运行状态,彻底解决多电机干扰问题
内容的提问来源于stack exchange,提问作者WouldRatherBuildAMotor
相关产品推荐
相关产品推荐

