RGB-strip的颜色无法控制

时间:2017-02-25 21:27:44

标签: c++ arduino rgb infrared

我的Arduino控制RGB-LED灯带时遇到了很大问题。我可以控制蓝色和绿色通道而没有任何问题(0-255的所有值都在工作)但我的红色通道真的不想工作......我可以控制它但它只是打开和关闭(0和255)但所有其他PWM频率都不起作用。它只会关闭LED。真正奇怪的是,我可以消除由于硬件故障而可能发生这种情况,因为当我开始一个新的草图并且只是命令Arduino(Nano)来控制设置方法时,每个值的每个通道就像一个魅力......我是盲目的还是我的代码存在的问题。

我真的希望你们中的任何人能帮助我。

#include <IRremote.h>
#include <EEPROM.h>
//Pins for RGB LEDs
#define rotPin 11   //redLED
#define gruenPin 6 // green LED
#define blauPin 9 // blue LED

//EEPROM 0=red, 1=green, 2=blue 
int rVal, gVal, bVal;
boolean ersterStart = true;



//IR-recevier Stuff
const int RECV_PIN = A0;            // Pin of the IR-Receiver
IRrecv irrecv(RECV_PIN);        // defining of a receiver object
decode_results results;         // variable for saving the IR-results

//IR-Codes for the IR transmitter
#define on 16236607
#define off 16203967
#define dunkler 16220287
#define heller 16187647
#define rot 16195807
#define gruen 16228447
#define blau 16212127
#define weiss 16244767
#define hellrot 16191727
#define orange 16199887
#define orangebraun 16189687
#define gelb 16197847
#define dunkelgrün 16224367
#define hellesdunkelgrün 16232527
#define hellgrün 16222327
#define tuerkis 16230487
#define dunkelblau 16208047
#define ultramarine 16216207
#define dunkelviolett 16206007
#define violett 16214167
#define flash 16240687
#define strobe 16248847
#define fadebtn 16238647
#define smooth 16246807

//Variables for Fading (fade())
byte r, g, b;
char farbe = 'b';             // letter for current color (Blue)
int fadePause = 8;            // time for fading steps; smaller = faster, bigger = slower
int halteZeit = 500;          // pause time between colors
unsigned long fadeZeit = 0;   // variable for saving the current millis()
boolean ersterLauf = true;    // needed to check if it's the first run of the program
boolean fadeOn = false;       // defines if fademode should be turned on

void setup() 
{
    pinMode(rotPin, OUTPUT);
    pinMode(gruenPin, OUTPUT);
    pinMode(blauPin, OUTPUT);
    ersterLauf=true;
    irrecv.enableIRIn();          // initializes IR-receiver 
    Serial.begin(9600);
    if(EEPROM.read(3)==1){
        fadeOn=true;
    }
    else{
        fadeOn=false;
    }
    if(fadeOn == false){
        analogWrite(rotPin,EEPROM.read(0));
        analogWrite(gruenPin,EEPROM.read(1));
        analogWrite(blauPin,EEPROM.read(2));
    }

}


void loop(){
    if (irrecv.decode(&results)) {
                                        //IR-basecodes
        if(results.value == on){

            analogWrite(rotPin, EEPROM.read(0));
            analogWrite(gruenPin, EEPROM.read(1));  //load RGB values from EEPROM
            analogWrite(blauPin, EEPROM.read(2));

            irrecv.resume();
        }

        if(results.value == off){   //turns all LEDs off

            analogWrite(rotPin,0);
            analogWrite(gruenPin,0);
            analogWrite(blauPin,0);

            irrecv.resume();
        }

        if(results.value == weiss){ // turns on white color

            analogWrite(rotPin,255);
            analogWrite(gruenPin,255);
            analogWrite(blauPin,255);

            EEPROM.write(0,255);
            EEPROM.write(1,255);
            EEPROM.write(2,255);

            irrecv.resume();
        }

        if(results.value == rot){   // turns on red color

            analogWrite(rotPin,255);
            analogWrite(gruenPin,0);
            analogWrite(blauPin,0);

            EEPROM.write(0,255);
            EEPROM.write(1,0);
            EEPROM.write(2,0);

            irrecv.resume();
        }

        if(results.value == gruen){ // turns on green color

            analogWrite(rotPin,0);
            analogWrite(gruenPin,255);
            analogWrite(blauPin,0);

            EEPROM.write(0,0);
            EEPROM.write(1,255);
            EEPROM.write(2,0);

            irrecv.resume();
        }

        if(results.value == blau){  // turns on blue color

            analogWrite(rotPin,0);
            analogWrite(gruenPin,0);
            analogWrite(blauPin,255);

            EEPROM.write(0,0);
            EEPROM.write(1,0);
            EEPROM.write(2,255);

            irrecv.resume();
        }

        irrecv.resume();
    }

    if(Serial.available() > 0){

        delay(500);                     // Serial Input Base-Code

        if(Serial.peek() == 'r'){   //controls red color (not working properly)

            Serial.read();
            rVal = Serial.parseInt();
            analogWrite(rotPin, rVal);
            EEPROM.write(0, rVal);
        }

        if(Serial.peek() == 'g'){   //controls green color

            Serial.read();
            gVal = Serial.parseInt();
            analogWrite(gruenPin, gVal);
            EEPROM.write(1, gVal);
        }

        if(Serial.peek() == 'b'){   //controls blue color

            Serial.read();
            bVal = Serial.parseInt();
            analogWrite(blauPin, bVal);
            EEPROM.update(2, bVal);
        }

        if(Serial.peek() == 'f'){   //controls fading

            Serial.read();
            int fval = Serial.parseInt();
            if(fval==1){
                fadeOn = true;
            }
            if(fval==0){
                fadeOn = false;
                ersterLauf = true;
            }
            EEPROM.update(3,fval);
        }

        while(Serial.available() > 0){
            Serial.read();
        }
  }


    fade();

}




void fade(){    //fading function

// Blaue LED beim ersten Durchlauf einblenden

        if (ersterLauf == true && millis()- fadeZeit > fadePause && fadeOn == true)
        {
          // Wenn b kleiner als 255 ist...
          if (b < 255)
          {
            b++;                      // Zählt b um 1 hoch
            analogWrite(blauPin, b);  // Ausganbe von b am LED Pin
            fadeZeit  = millis();     // Aktuelle Zeit speichern
          }

          // Wenn b bei 255 angekommen UND die halteZeit vergangen ist...
          if (b == 255 && (millis()- fadeZeit) > (fadePause + halteZeit))
          {
            ersterLauf = false;     // Erster Lauf ist abgeschlossen
          }
       }

        // Wenn ersterLauf abgeschlossen ist UND fadePause vergangen ist...
        if (ersterLauf == false && millis()- fadeZeit > fadePause && fadeOn == true && fadeOn == true)
        {
          // Wechsel von Blau zu Lila 
          if (farbe == 'b')
          {
            // Wenn r kleiner als 255 ist...
            if (r < 255)
            {
              r++;                      // Zählt r um 1 hoch
              analogWrite(rotPin, r);   // Ausganbe von r am LED Pin
              fadeZeit  = millis();     // Aktuelle Zeit speichern
            }

            // Wenn r bei 255 angekommen UND die halteZeit vergangen ist...
            if (r == 255 && millis()- fadeZeit > fadePause + halteZeit)
            {
              farbe = 'l';    // Ändere Frabe auf "l" (Lila)
            }
          }

            // Wechsel von Lila zu Rot
            if (farbe == 'l')
            {
               // Wenn b größer als 0 ist...
               if (b > 0)
              {
                b--;                      // Zählt b um 1 runter
                analogWrite(blauPin, b);  // Ausganbe von b am LED Pin
                fadeZeit  = millis();     // Aktuelle Zeit speichern
              }

              // Wenn b bei 0 angekommen UND die halteZeit vergangen ist...
              if (b == 0 && millis()- fadeZeit > fadePause + halteZeit && fadeOn == true)
              {
                farbe = 'r';    // Ändere Frabe auf "r" (Rot)
               }
            }

            // Wechsel von Rot zu Gelb
            if (farbe == 'r')
            {
              // Wenn g kleiner als 255 ist...
              if (g < 255)
              {
              g++;                      // Zählt g um 1 hoch
              analogWrite(gruenPin, g);   // Ausganbe von g am LED Pin
              fadeZeit  = millis();     // Aktuelle Zeit speichern
              }

              // Wenn g bei 255 angekommen UND die halteZeit vergangen ist...
              if (g == 255 && millis()- fadeZeit > fadePause + halteZeit && fadeOn == true)
             {
              farbe = 'y';    // Ändere Frabe auf "y" (Gelb)
             }
           }

           // Wechsel von Gelb zu Gruen
           if (farbe == 'y')
           {
              // Wenn r größer als 0 ist...
              if (r > 0)
              {
                r--;                      // Zählt r um 1 runter
                analogWrite(rotPin, r);   // Ausganbe von r am LED Pin
                fadeZeit  = millis();     // Aktuelle Zeit speichern
              }

              // Wenn r bei 0 angekommen UND die halteZeit vergangen ist...
              if (r == 0 && millis()- fadeZeit > fadePause + halteZeit && fadeOn == true)
              {
                farbe = 'g';    // Ändere Frabe auf "g" (Grün)
              }
            }

          // Wechsel von Gruen zu Petrol
          if (farbe == 'g')
          {
            // Wenn b kleiner als 255 ist...
            if (b < 255)
            {
              b++;                      // Zählt b um 1 hoch
              analogWrite(blauPin, b);  // Ausganbe von b am LED Pin
              fadeZeit  = millis();     // Aktuelle Zeit speichern
            }

          // Wenn b bei 255 angekommen UND die halteZeit vergangen ist...
          if (b == 255 && millis()- fadeZeit > fadePause + halteZeit && fadeOn == true)
          {
            farbe = 'p';    // Ändere Frabe auf "p" (Petrol)
          }
        }

        // Wechsel von Petrol zu Blau
        if (farbe == 'p')
        {
          // Wenn g größer als 0 ist...
          if (g > 0)
          {
            g--;                      // Zählt g um 1 runter
            analogWrite(gruenPin, g);   // Ausganbe von g am LED Pin
            fadeZeit  = millis();     // Aktuelle Zeit speichern
          }

       // Wenn g bei 0 angekommen UND die halteZeit vergangen ist...
       if (g == 0 && millis()- fadeZeit > fadePause + halteZeit && fadeOn == true)
       {
         farbe = 'b';    // Ändere Frabe auf "b" (Blau)
       }
    }
  }

}

1 个答案:

答案 0 :(得分:0)

好的问题刚刚解决了。似乎IRremote Libary使用了与引脚11的PWM定时器相关的定时器。为了解决这个问题,我只是将红色的引脚连接到Nano上的另一个PWM引脚(引脚5),现在它的工作方式就像一个魅力。

感谢您的帮助,无论如何:)