【问题标题】:Arduino class to control a RGB led控制 RGB LED 的 Arduino 类
【发布时间】:2020-09-15 23:40:17
【问题描述】:

我是一个新的arduino用户,所以我现在正在学习......

我想创建一个新类来控制我的 RGB LED...

我已经在我的代码中使用了这个 led 和一个方法......但是我想概括代码以在没有 ctrl+c ctrl+v 我的代码的情况下放置更多 led。

我创建了类:

/*
   STATUSLED CLASS DEFINITION
*/
class StatusLED {
  int pinVermelho;
  int pinVerde;
  int pinAzul;

  public:
    StatusLED(int pinRed, int pinGreen, int pinBlue) {
      this->pinVermelho = pinRed;
      this->pinVerde = pinGreen;
      this->pinAzul = pinBlue;
    }

    void RGB(int red, int green, int blue) {
      Serial.print("StatusLED.RGB(");
      Serial.print(red);
      Serial.print(", ");
      Serial.print(green);
      Serial.print(", ");
      Serial.print(blue);
      Serial.println(");");
      digitalWrite(pinVermelho, 255 - red);
      digitalWrite(pinVerde, 255 - green);
      digitalWrite(pinAzul, 255 - blue);
    }

};

我用我的 RBG led 的引脚对其进行初始化:

#define pinoAzul 9
#define pinoVerde 10
#define pinoVermelho 11

StatusLED led(pinoVermelho, pinoVerde, pinoAzul);

为了测试它我使用:

void setup() {
  pinMode(pinoAzul, OUTPUT);
  digitalWrite(pinoAzul, LOW);
  pinMode(pinoVerde, OUTPUT);
  digitalWrite(pinoVerde, LOW);
  pinMode(pinoVermelho, OUTPUT);
  digitalWrite(pinoVermelho, LOW);
}

void loop() {
  led.RGB(255, 0, 0);
  delay(1000);
  led.RGB(0, 255, 0);
  delay(1000);
  led.RGB(0, 0, 255);
  delay(1000);
}

调用了RGB方法,但是我的led不亮。

如果我将 RGB 方法移到我的班级之外,这可以正常工作。

谁能告诉我我在做什么?

【问题讨论】:

  • digitalWrite 采用 HIGH 或 LOW。我想你可能想看看analogWrite。
  • 为什么对 0-255 范围内的值使用整数?为什么255- red?你的接线呢?你检查它是否正确?使用analogWrite,您是否将引脚配置为输出?
  • 我使用 0 到 255 的值,因为我使用 PWD 端口。 255 - 红色是因为我使用的是阳极 comum RGB。我在 setup() 上将引脚配置为输出;
  • 你能提供更多你的代码吗?例如设置方法等

标签: arduino arduino-uno arduino-c++


【解决方案1】:

您正在尝试使用 PWM(脉冲宽度调制)控制 RGB LED。要设置特定 PWM 引脚上的脉冲开/关比,您应该使用analogWrite(PWM_out_pin, PWM_out_level); 您的代码错误地使用了digitalWrite,这不会影响 PWM 波形。它也只需要一个HIGHLOW 值参数,除了引脚号。

【讨论】:

    【解决方案2】:

    我将引脚配置作为 OUTPUT 移动到我的类的构造函数中:

    StatusLED::StatusLED(int pinRed, int pinGreen, int pinBlue) {
      this->pinRed = pinRed;
      pinMode(pinRed, OUTPUT);
      this->pinGreen = pinGreen;
      pinMode(pinGreen, OUTPUT);
      this->pinBlue = pinBlue;
      pinMode(pinBlue, OUTPUT);
      RGB(0, 0, 0);
    }
    

    这样就解决了问题。

    我还将方法 RGB 更改为使用 analogWrite,正如您所说,现在淡化效果也很好。

    void StatusLED::RGB(int redValue, int greenValue, int blueValue) {
      if (redValue > 255) {
        redValue = 255;
      }
      if (greenValue > 255) {
        greenValue = 255;
      }
      if (blueValue > 255) {
        blueValue = 255;
      }
      if (redValue < 0) {
        redValue = 0;
      }
      if (greenValue < 0) {
        greenValue = 0;
      }
      if (blueValue < 0) {
        blueValue = 0;
      }
      analogWrite(pinRed, 255 - redValue);
      analogWrite(pinGreen, 255 - greenValue);
      analogWrite(pinBlue, 255 - blueValue);
    }
    

    谢谢大家!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多