2016-09-26 12 views
0

私は部屋rgb ledストリップのledコントローラを作成しようとしています。 私はarduino unoを使用しています。 2つのプッシュボタンを使用して2つのプログラムを切り替える

両方のプログラムを個別に動作し

  1. 制御するLEDの静的な色(再びその同じスイッチを押すことでtime.cycles色で1色)
  2. RGBのクロスフェード:私は2つのプッシュボタンが欲しいです。ここでは、これらの2つのプログラムを1つのスケッチにして、2つの押しボタン、カラーサイクルとクロスフェードで切り替えます。 スケッチが機能しますが、1つの押しボタンだけが機能しています。 私は様々なガイドとチュートリアルに従って2つのボタンで2つの10kΩ抵抗を接続しました。私は配線が正しいと思います。私は2番目のプログラムの条件場合を逆ならば今... 2番目のプログラムが実行さ

    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

2つのボタンから読み込んでいるので、いくつかのデバウンスを行う必要があります。 何かあなたがやったが、少し良く:) あなたのためにこれを行い、

Arduino webからダウンロードすることができ、ライブラリがあるようにしたら変更Debounce.cpp#include "Arduino.h"から#include "WProgram.h"ダウンロードし、あなたが行ってもいいはずです。

以下は、あなたのコードでの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); 
} 
関連する問題