我的RGB条带驱动程序代码中出现意外行为

时间:2015-06-11 07:57:39

标签: arduino rgb led

我在引脚9,10和11上输出错误。它们是我的RGB条带驱动器电路的输入。这基本上是一系列NPN晶体管从带状电流中拉出电流。

基本思路是只设置2个控件来设置R,G,B和亮度。我正在使用按钮和电位计。电位计用于设置值,按钮用于跳转到下一个值设置。有一个设置状态,就像默认设置状态。它是设置亮度的那个,我将在大多数时间使用它。其他用于设置颜色,当在其中一个设置中时,条带将仅在我当前设置的颜色和设置三种颜色的结果之间闪烁。整个代码工作得很好,直到我添加了亮度设置,我认为我在自己的代码中丢失了。

我甚至添加了一个序列来读取输出,但我不明白为什么这些数字是这样的:(

  int pinR = 9;
  int pinG = 10;
  int pinB = 11;
  int potPin = A0;
  const int buttonPin = 2;

  int brightR = 0;
  int brightG = 0;
  int brightB = 0;
  int brightness = 50; //

  int R;
  int G;
  int B;

  int potValue = 0;

  int blinky = 0;
  boolean blinking = false;

  int buttonState;
  int lastButtonState = LOW;
  long lastDebounceTime = 0;
  long debounceDelay = 50;

  int setting = 0; //0=R 1=G 2=B 3=Brightness

  void setup() {
    // put your setup code here, to run once:
    pinMode(pinR, OUTPUT);
    pinMode(pinG, OUTPUT);
    pinMode(pinB, OUTPUT);

    Serial.begin(9600);
  }

  void RGBset(int r, int g, int b){
      analogWrite(pinR, r);
      analogWrite(pinG, g);
      analogWrite(pinB, b);
    }

  void loop() {
    // put your main code here, to run repeatedly:
    potValue = analogRead(potPin);
    potValue = map(potValue, 0, 1023, 0, 255); //read pot --> map to values from 0 - 255

    int reading = digitalRead(buttonPin);

    if (reading != lastButtonState) {

      lastDebounceTime = millis();
    }

    if ((millis() - lastDebounceTime) > debounceDelay) {

      if (reading != buttonState) {
        buttonState = reading;

        if (buttonState == HIGH) {
          setting++;
        }
      }
    }

    lastButtonState = reading;

    if(setting > 3){  // 0=R 1=G 2=B 3=Brightness
      setting = 0;    // cant get 4 cause there is no 4
    }

    if(setting == 0){
      brightR = potValue;
      if(blinking){
        RGBset(brightR, brightG, brightB);
      }else{
        RGBset(brightR, 0, 0);
      }
    }

    if(setting == 1){
      brightG = potValue;
      if(blinking){
        RGBset(brightR, brightG, brightB);
      }else{
        RGBset(0, brightG, 0);
      }
    }

    if(setting == 2){
      brightB = potValue;
      if(blinking){
        RGBset(brightR, brightG, brightB);
      }else{
        RGBset(0, 0, brightB);
      }
    }

    if(setting == 3){
      brightness = potValue;
      brightness = map(brightness, 0, 255, 1, 100);  //mapping brightness to values from 1 - 100
      R = brightR * brightness / 100;                //set value * brightness / 100 
      G = brightG * brightness / 100;                //that leads to get % of set value
      B = brightB * brightness / 100;                //255 * 50 / 100 = 127,5 ==> 128
      RGBset(R, G, B);                               //it wont blink in thiss setting
    }

    if(setting != 3){
      blinky++;
      if(blinky > 1000){
        blinking = !blinking;
        blinky = 0;
      }
    }

    String output = (String(brightR) + " " + String(R) + " " + String(brightG) + " " + String(G) + " " + String(brightB) + " " + String(B) + " " + String(brightness) + " " + String(potValue) + " " + String(blinking)); 
    Serial.println(output);

    delay(1);
  }

1 个答案:

答案 0 :(得分:0)

首先,在setup

pinMode(buttonPin , INPUT);

第二,setting==3时您的期望是什么?您没有重新加载/更新brightR brightG brightB的变量。因此,当您更改setting时,您将失去亮度变化