2017-02-25 100 views
-2

我的Arduino控制着我的RGB-LED條,這有一個很大的問題。我可以控制藍色和綠色通道沒有任何問題(所有值從0-255都在工作),但我的紅色通道真的不想工作...我可以控制它,但它只會打開和關閉(0和255)但所有其他PWM頻率不起作用。它只會關閉LED。真奇怪的是,我可以消除這可能是因爲硬件故障而發生的,因爲當我開始一個新的草圖並命令Arduino(Nano)控制設置方法時,每個通道的每個值都像一個魅力...我是盲目的還是我的代碼有什麼問題。無法控制RGB條的顏色

我真的希望你們任何人都能幫助我。

#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) 
     } 
    } 
    } 

} 
+0

如果您切換紅色和藍色電纜會發生什麼?如果你打印'rVal',會發生什麼? –

+0

如果我在藍色和紅色之間切換電纜,藍色通道停止按預期工作,當打印出rVal時,打印正確的值 – spipsi1

+0

您是否嘗試使用不同的pwm引腳,而不是11? –

回答

0

好的問題剛剛解決。看起來像IRremote Libary使用與引腳11的PWM定時器相關的定時器。爲了解決這個問題,我只是將紅色的引腳連接到Nano上的另一個PWM引腳(引腳5),現在它的工作原理類似於魅力。

感謝您的幫助:)