让 RGB LED 灯更亮?

时间:2021-04-07 15:20:06

标签: c++ arduino rgb arduino-uno

我一直在尝试制作一个交通灯模拟器,但是在让一个 RGB 灯亮起来时遇到了麻烦(在代码中它用(颜色)Pin2 表示)。第一个灯工作正常,但左侧的 RGB 工作不正常。当光线为白色时,我成功地使其变亮,但是当我尝试将其设为黄色时,光线太暗了,我几乎看不到它。它接线正确,所以我认为代码中可能有错误。如果有人需要,这里是该项目的链接https://www.tinkercad.com/things/g0UkhvSKylW-copy-of-traffic-light-with-pedestrian-crossing

(也很抱歉代码凌乱,我还不太习惯 arduino,所以我知道代码不是很好)

int redLight = 13;
int yellowLight = 12;
int greenLight = 11;
int redLight2 = 10;
int yellowLight2 = 9;
int greenLight2 = 8;
int redPin = 7;
int bluePin = 6;
int greenPin = 5;
int redPin2 = 4;
int bluePin2 = 3;
int greenPin2 = 2;

void setup() {
  pinMode(redLight, OUTPUT);
  pinMode(yellowLight, OUTPUT);
  pinMode(greenLight, OUTPUT);
  pinMode(redLight2, OUTPUT);
  pinMode(yellowLight2, OUTPUT);
  pinMode(greenLight2, OUTPUT);
  pinMode(redPin, OUTPUT);
  pinMode(bluePin, OUTPUT);
  pinMode(greenPin, OUTPUT);
}

void loop() {
  //Note: leftmost traffic light is used for refrence
  //all other lights are based on each others timing
  while(digitalRead(redLight) ==HIGH){
    redLightOn();
    break;
  }
  while(digitalRead(greenLight) == HIGH){
   //pedestrian light is white
    digitalWrite(redPin, 255);
    digitalWrite(greenPin, 255);
    digitalWrite(bluePin, 255);
    //pedestrian light is off
    digitalWrite(redLight2, HIGH);
    delay(6000);
    digitalWrite(bluePin, 0);//make sure to turn blue pin off!
    digitalWrite(redPin, 255);
    digitalWrite(greenPin, 40);
    delay(1000);
    digitalWrite(redPin, 0);
    digitalWrite(greenPin, 0);
    delay(500);
    digitalWrite(redPin, 255);
    digitalWrite(greenPin, 40);
    delay(1000);
    digitalWrite(redPin, 0);
    digitalWrite(greenPin, 0);
    delay(500);
    digitalWrite(redPin, 255);
    digitalWrite(greenPin, 40);
    delay(1000);
    digitalWrite(greenLight, LOW);
    digitalWrite(redPin, 0);
    digitalWrite(greenPin, 0);
    digitalWrite(bluePin, 0);
    digitalWrite(yellowLight, HIGH);
    //pedestrial light flashing
    digitalWrite(redPin, 255);
    digitalWrite(greenPin, 40);

  delay(5000);
    //yellow light changes to red
    digitalWrite(yellowLight, LOW);
    digitalWrite(redLight, HIGH);
  }

//Initial starting light: starts off red
  digitalWrite(redLight, HIGH);
}
//create an initial red light function
void redLightOn(){
    digitalWrite(redLight2, LOW);
    digitalWrite(greenLight2, HIGH);
    digitalWrite(redPin2, 255);
    digitalWrite(greenPin2, 255);
    digitalWrite(bluePin2, 255);
    //pedestrian light on white
    digitalWrite(redPin, 255);
    digitalWrite(greenPin, 40);
    //pedestrian light is off
    delay(6000);
    digitalWrite(bluePin2, 0);//make sure to turn blue pin off!
    digitalWrite(redPin2, 255);
    digitalWrite(greenPin2, 255);
    delay(1000);
    digitalWrite(redPin2, 0);
    digitalWrite(greenPin2, 0);
    delay(500);
    pYellow();
    delay(1000);
    digitalWrite(redPin2, 0);
    digitalWrite(greenPin2, 0);
    delay(500);
    pYellow();
    delay(1000);
    digitalWrite(greenLight, LOW);
    //digitalWrite(redPin, 0);
    //digitalWrite(greenPin, 0);
    //digitalWrite(bluePin, 0);
    digitalWrite(greenLight, LOW);

    //pedestrial light off
  
    digitalWrite(greenLight2, LOW);
    digitalWrite(yellowLight2, HIGH);
    delay(5000);
    digitalWrite(yellowLight2, LOW);
    digitalWrite(redLight, LOW);
    digitalWrite(greenLight, HIGH);
}

void pYellow(){
    digitalWrite(redPin2, 255);
    digitalWrite(greenPin2, 40);
}

2 个答案:

答案 0 :(得分:1)

您似乎对 digitalWrite 和 analogWrite 感到困惑。 digitalWrite 函数采用引脚编号和高电平或低电平。在 undefined 中传递整数值。我猜零整数将关闭,而任何其他值将打开。

看起来您想将引脚设置为模拟引脚,然后使用analogWrite 更新它们。使用此命令,您可以使用值 0 - 255 设置 0 - 5v 之间的任何电压电平。

另外一种检查代码或硬件的好方法是将 LED 的黄色引脚连接到 5V 电源线,然后查看它的亮度。最后,您是否有用于 LED 的单个公共下拉电阻器,或者您是否为每种颜色都有单独的电阻器?如果是这样,其中之一可能是错误的值,或者您在黄线上的某处有一个不可靠的连接。

答案 1 :(得分:0)

我看不出你的代码有什么问题。实际上,这不是软件问题,而是物理问题。如果您测量 LED 支脚之间的电压,您可能会看到电压根据您的代码发生变化。问题是亮度是你用眼睛测量的东西。有些情况下,您从同一供应商处购买了不同颜色的 LED,但亮度似乎不同。

如果您想获得所有颜色的均匀亮度,您可以尝试从代码中使较浅的颜色变暗,或者尝试在腿上使用不同阻值的电阻器。

相关问题