2012-05-22 460 views
0

我試圖找到一種方法來使用一個按鈕來啓用/禁用命令。 (實際上,它是一個多色LED,我試圖啓動/停止改變顏色)Arduino的一個按鈕開/關控制

我的代碼在這裏,但它不起作用,如果有人能告訴我什麼是錯的,我看不到它..

int red = 0; 
int redPin = 9; 
int blue = 0; 
int bluePin = 11; 
int green = 0; 
int greenPin = 10; 
int state = 0; 
int stateModulo = 0; 
void setup() { 
    pinMode(10, OUTPUT); 
    pinMode(11, OUTPUT); 
    pinMode(9, OUTPUT); 
    pinMode(2, INPUT); 
} 


void checkButton(int var, int result) { 
    if (digitalRead(2) == HIGH) { 
     var++; 
     result = var%2; 
    } 
} 

void changecolor(int startColor,int endColor,int startPin,int endPin,int delayTime) 
{ 
    for (endColor = 0; endColor <= 255; endColor++) 
    { 
    checkButton(state,stateModulo); 
    if (stateModulo == 0) { 
     startColor = 255 - endColor; 
     analogWrite(endPin, endColor); 
     analogWrite(startPin, startColor); 
     delay(delayTime); 
    } 
    } 
} 

void loop() { 
    changecolor(red,green,redPin,greenPin,10); 
    changecolor(green,blue,greenPin,bluePin,10); 
    changecolor(blue,red,bluePin,redPin,10); 
} 
+0

你不改變'stateModulo'任何地方。 – geoffspear

回答

0

在下面的代碼中,result不是通過引用傳遞,也不返回。 這同樣適用於var,在您修改它之後,您會丟棄所做的任何編輯。

void checkButton(int var, int result) { 
    if (digitalRead(2) == HIGH) { 
     var++; 
     result = var%2; 
    } 
} 

我可以推薦你一個很好的C++書籍在哪裏學習一些語言的基礎知識。 我的建議:用C++思考,Bruce Eckel。

0

考慮一下:

//Buttons 

int button1 = 7; 
int button2 = 6; 
int button3 = 4; 
int button4 = 2; 


//Relays 
int rl1 = 13; 
int rl2 = 12; 
int rl3 = 11; 
int rl4 = 8; 


//States for Relay and Button (1) 

int state1 = HIGH;  // the current state of the output pin 
int reading1;   // the current reading from the input pin 
int previous1 = LOW; // the previous reading from the input pin 

//States for Relay and Button (2) 

int state2 = HIGH;  // the current state of the output pin 
int reading2;   // the current reading from the input pin 
int previous2 = LOW; // the previous reading from the input pin 

//States for Relay and Button (3) 

int state3 = HIGH;  // the current state of the output pin 
int reading3;   // the current reading from the input pin 
int previous3 = LOW; // the previous reading from the input pin 

//States for Relay and Button (4) 

int state4 = HIGH;  // the current state of the output pin 
int reading4;   // the current reading from the input pin 
int previous4 = LOW; // the previous reading from the input pin 




// the follow variables are long's because the time, measured in miliseconds, 
// will quickly become a bigger number than can be stored in an int. 
long time1 = 0;   // the last time the output pin was toggled 
long time2 = 0; 
long time3 = 0; 
long time4 = 0; 

long debounce1 = 200; // the debounce time, increase if the output flickers 
long debounce2 = 200; 
long debounce3 = 200; 
long debounce4 = 200; 


void setup() 
{ 
    pinMode(button1, INPUT); 
    pinMode(button2, INPUT); 
    pinMode(button3, INPUT); 
    pinMode(button4, INPUT); 

    pinMode(rl1, OUTPUT); 
    pinMode(rl2, OUTPUT); 
    pinMode(rl3, OUTPUT); 
    pinMode(rl4, OUTPUT); 

} 

void loop() { 

    reading1 = digitalRead(button1); 
    reading2 = digitalRead(button2); 
    reading3 = digitalRead(button3); 
    reading4 = digitalRead(button4); 


    // if the input just went from LOW and HIGH and we've waited long enough 
    // to ignore any noise on the circuit, toggle the output pin and remember 
    // the time 
    //Condition Relay 1 
    if (reading1 == HIGH && previous1 == LOW && millis() - time1 > debounce1) { 
    if (state1 == HIGH) 
     state1 = LOW; 
    else 
     state1 = HIGH; 

    time1 = millis();  
    } 

    //Condition Relay 2 
    if (reading2 == HIGH && previous2 == LOW && millis() - time2 > debounce2) { 
    if (state2 == HIGH) 
     state2 = LOW; 
    else 
     state2 = HIGH; 

    time2 = millis();  
    } 

    //Condition Relay 3 
    if (reading3 == HIGH && previous3 == LOW && millis() - time3 > debounce3) { 
    if (state3 == HIGH) 
     state3 = LOW; 
    else 
     state3 = HIGH; 

    time3 = millis();  
    } 

    //Condition Relay 4 
    if (reading4 == HIGH && previous4 == LOW && millis() - time4 > debounce4) { 
    if (state4 == HIGH) 
     state4 = LOW; 
    else 
     state4 = HIGH; 

    time4 = millis();  
    } 




    digitalWrite(rl1, state1); 
    digitalWrite(rl2, state2); 
    digitalWrite(rl3, state3); 
    digitalWrite(rl4, state4); 


    previous1 = reading1; 
    previous2 = reading2; 
    previous3 = reading3; 
    previous4 = reading4; 
}