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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 07:27:45