2016-09-26 81 views
0

我想爲我的房間rgb led燈帶製作led控制器。 我正在使用arduino uno。我想兩個按鈕:使用兩個按鈕來切換兩個程序

  1. 控制(上再次按相同的開關在time.cycles顏色一種顏色)爲首的靜態色彩
  2. RGB淡入淡出

兩個程序獨立工作。現在我想要在一個草圖中使用這兩個程序,並通過兩個按鈕來切換顏色循環,一個用於交叉淡入淡出 草圖,但只有一個按鈕正在工作。 根據各種指南和教程,我用兩個按鈕連接了2個10k歐姆電阻。我認爲接線是正確的。

這裏是素描:

const int buttonPin1 = 2; // button 1 
const int buttonPin2 = 3; // button 2 
const int redPin = 9;  // red led pin 
const int greenPin = 11; // green led pin 
const int bluePin = 10; // blue led pin 
int pushCounter = 0;  // push counter for changing colors at each press 
int buttonState = 0;  // button state i.e. HIGH or LOW 
int lastButtonState = 0; 

void setup() 
{ 
    pinMode(buttonPin1, INPUT); 
    pinMode(buttonPin2, INPUT); 
    pinMode(redPin, OUTPUT); 
    pinMode(greenPin, OUTPUT); 
    pinMode(bluePin, OUTPUT); 
    setColourRgb(0,0,0); 
} 

void setColor(int red, int green, int blue) // function for setting custom colors 
{ 
    //#ifdef COMMON_ANODE 
    //red = 255 - red; 
    //green = 255 - green; 
    //blue = 255 - blue; 
    //#endif 
    analogWrite(redPin, red); 
    analogWrite(greenPin, green); 
    analogWrite(bluePin, blue); 
} 

void setColourRgb(unsigned int red, unsigned int green, unsigned int blue) { //function for setting crossfade colors 
    analogWrite(redPin, red); 
    analogWrite(greenPin, green); 
    analogWrite(bluePin, blue); 
} 

void loop() 
{ 
    int buttonState1 = 0; 
    int buttonState2 = 0; 
    buttonState1 = digitalRead(buttonPin1);   //reads button states 
    buttonState2 = digitalRead(buttonPin2); 

    if ((buttonState1 == HIGH) && (buttonState2 == LOW)) //compares button states of both switches to enable the correct program 
    { 
     buttonState = digitalRead(buttonPin1);    
     if (buttonState != lastButtonState) 
     { 
      if (buttonState == HIGH)  //increases pushcounter of button1 on every press 
      { 
       pushCounter++; 
      } 
     } 
     //delay(1); 
     lastButtonState = buttonState; 

     if (pushCounter == 1)    //custom led colors 
     { setColor(255, 0, 0);}; //red 
     if (pushCounter == 2) 
     { setColor(0, 255, 0);}; //green 
     if (pushCounter == 3) 
     { setColor(0, 0, 255);}; //blue 
     if (pushCounter == 4) 
     { setColor(255,200,255);}; //white 
     if (pushCounter == 5) 
     { setColor(255,255,0);}; //lime 
     if (pushCounter == 6) 
     { setColor(0,255,255);}; //aqua 
     if (pushCounter == 7) 
     { setColor(255,0,255);}; //violet 
     if (pushCounter == 8) 
     { setColor(128,0,128);}; //dim_violet 
     if (pushCounter == 9) 
     { pushCounter = 0;} 

    } 

    if ((buttonState1 == LOW) && (buttonState2 == HIGH)) //compares button states to load second program 
    { 
     unsigned int rgbColour[3]; 

     // Start off with red. 
     rgbColour[0] = 255;         //sets first color 
     rgbColour[1] = 0; 
     rgbColour[2] = 0; 

     // Choose the colours to increment and decrement. 
     for (int decColour = 0; decColour < 3; decColour += 1) 
     { 
      int incColour = decColour == 2 ? 0 : decColour + 1; 

      // cross-fade the two colours. 
      for(int i = 0; i < 255; i += 1) 
      { 
       rgbColour[decColour] -= 1; 
       rgbColour[incColour] += 1; 
       setColourRgb(rgbColour[0], rgbColour[1], rgbColour[2]); 
       delay(30); 
      } 
     } 
    }; 
} 

現在,如果我扭轉,如果條件第二個程序......第二個程序運行,但先不運行。這裏有什麼問題?

回答

0

由於您正在閱讀兩個按鈕,您需要做一些反彈。 喜歡的東西,你已經做了,但是好一點:) 有,這是否給你,可以從Arduino web

下載庫下載完成後更改#include "WProgram.h"#include "Arduino.h"Debounce.cpp,你應該是好去。

下面是lib與你的代碼的執行情況。

從描述的邏輯是正確的。

#include <Debounce.h> 

#define buttonPin1 2  // button 1 
#define buttonPin2 3  // button 2 
#define redPin 9   // red led pin 
#define greenPin 11   // green led pin 
#define bluePin 10   // blue led pin 
#define debounceTime 20  // debounce time 

int pushCounter = 0;  // push counter for changing colors at each press 
int buttonState = 0;  // button state i.e. HIGH or LOW 
int lastButtonState = 0; 

// Instantiate a Debounce object 
Debounce button1 = Debounce(debounceTime, buttonPin1); //for button 1 
Debounce button2 = Debounce(debounceTime, buttonPin2); //for button 2 

void setup() 
{ 
    pinMode(buttonPin1, INPUT); 
    pinMode(buttonPin2, INPUT); 
    pinMode(redPin, OUTPUT); 
    pinMode(greenPin, OUTPUT); 
    pinMode(bluePin, OUTPUT); 
    setColourRgb(0,0,0); 
} 



void loop() 
{ 
    //update debounce stat for both buttons 
    button1.update(); 
    button2.update(); 

    int button1State = button1.read();   //reads button states 
    int button2State = button2.read(); 

    if ((button1State == 1) && (button2State == 0)) //compares button states of both switches to enable the correct program 
    { 

     //Since we are checking for the first button being HIGH or 1 we can increament the counter 
     pushCounter++; 
     /* 
     buttonState = button1State;    
     if (buttonState != lastButtonState) 
     { 
      if (buttonState == HIGH)  //increases pushcounter of button1 on every press 
      { 
       pushCounter++; 
       lastButtonState = buttonState; 
      } 
     } 
     */ 
     //delay(1); 
     switch (pushCounter) 
     { 
      case 1: 
       setColor(255, 0, 0); //red 
       break; 
      case 2: 
       setColor(0, 255, 0); //green 
       break; 
      case 3: 
       setColor(0, 0, 255); //blue 
       break; 
      case 4: 
       setColor(255,200,255); //white 
       break; 
      case 5: 
       setColor(255,255,0); //lime 
       break; 
      case 6: 
       setColor(0,255,255); //aqua 
       break; 
      case 7: 
       setColor(255, 0, 0); //violet 
       break; 
      case 8: 
       setColor(128,0,128); //dim_violet 
       break; 
      case 9: 
       pushCounter = 0; // reset the counter 
       break; 
     } 

    } 

    else if ((button1State == 0) && (button2State == 1)) //compares button states to load second program 
    { 
     unsigned int rgbColour[3]; 

     // Start off with red. 
     rgbColour[0] = 255;         //sets first color 
     rgbColour[1] = 0; 
     rgbColour[2] = 0; 

     // Choose the colours to increment and decrement. 
     for (int decColour = 0; decColour < 3; decColour++) 
     { 
      int incColour = decColour == 2 ? 0 : decColour + 1; 

      // cross-fade the two colours. 
      for(int i = 0; i < 255; i += 1) 
      { 
       rgbColour[decColour] -= 1; 
       rgbColour[incColour] += 1; 
       setColourRgb(rgbColour[0], rgbColour[1], rgbColour[2]); 
       delay(30); 
      } 
     } 
    } 
} 


void setColor(int red, int green, int blue) // function for setting custom colors 
{ 
    //#ifdef COMMON_ANODE 
    //red = 255 - red; 
    //green = 255 - green; 
    //blue = 255 - blue; 
    //#endif 
    analogWrite(redPin, red); 
    analogWrite(greenPin, green); 
    analogWrite(bluePin, blue); 
} 

void setColourRgb(unsigned int red, unsigned int green, unsigned int blue) { //function for setting crossfade colors 
    analogWrite(redPin, red); 
    analogWrite(greenPin, green); 
    analogWrite(bluePin, blue); 
}