ARDUINO - 按钮

ARDUINO - button

我有一个带有 arduino UNO 和颜色传感器的程序, 显示了 RGB 值。 我也有一个按钮, 可能会开始读取一个对象(彩色纸),但是当我按下它时,程序会读取 5 次,而不是我想要的一次。 在每种情况下(对于每种颜色),我想向变量添加一个值 我想在串行监视器中显示,但是在读取(或 5 个读数:))之后,串行监视器仅显示我想添加到我的变量中的值(例如 c=c+2;连续运动:每次按下按钮时 2)。

这是我的代码:

// Define pins
const int ledpin = 13;
const int GSR1 = 12;
const int GSR0 = 11;
const int GSG1 = 10;
const int GSG0 = 9;
const int GSB1 = 8;
const int GSB0 = 7;

int redpin = A0;
int greenpin = A1;
int bluepin = A2;


const int buttonPin = 6;

// Sensor read values
int red = 0;
int green = 0;
int blue = 0;

void setup() 
{
  Serial.begin(9600);

  pinMode(buttonPin, INPUT);

  pinMode(ledpin, OUTPUT);
  pinMode(GSR1, OUTPUT);
  pinMode(GSR0, OUTPUT);
  pinMode(GSG1, OUTPUT);
  pinMode(GSG0, OUTPUT);
  pinMode(GSB1, OUTPUT);
  pinMode(GSB0, OUTPUT);

  // Turn on the LED
  digitalWrite(ledpin, HIGH);

  // Set the gain of each sensor
  digitalWrite(GSR1, LOW);
  digitalWrite(GSR0, LOW);
  digitalWrite(GSG1, LOW);
  digitalWrite(GSG0, LOW);
  digitalWrite(GSB1, LOW);
  digitalWrite(GSB0, LOW);
}

void loop()  
{  
   int buttonState;


   buttonState = digitalRead(buttonPin);



   //  Read sensors

   red = analogRead(redpin) * 10;
   green = analogRead(greenpin) * 14;
   blue = analogRead(bluepin) * 17;
   int c=0;
   int br=0;


   if (buttonState == HIGH) 
   {
    if (1200>red && red>1000 && 1950>green && green>1500 && 850>blue && blue>650)
    {
      Serial.print("yellow");
      Serial.print("\n");
      c=2;
    }

    if(c==2)
    {
      br=br+2;
      Serial.print(br);
      Serial.print("\n");
    }
  }
}

我或许可以帮助您想象正在发生的事情。第一次执行循环并按下按钮时,buttonState 设置为 HIGH。因为循环比您的 buttonPress 快,所以当您按下按钮时它会执行多次。听起来您真正想要的是打印数据的代码在每次按下按钮时执行一次。为此,您需要跟踪按钮的更改状态。你可以用一个额外的变量来做到这一点。

例如:

//Define tracker as a variable at the top of the sketch.
int tracker = 0;

然后循环,只有当tracker和buttonState不同时才执行:

buttonState = digitalRead(buttonPin);
if (tracker != buttonState)
{
    if (buttonState == HIGH){
        // put all of your print code here
    }

    //then set tracker equal to buttonState
    tracker = buttonState;
}

逻辑是:

-tracker 和 buttonState 以 0 (LOW) 开始。 - 当按钮被按下时,buttonState = HIGH 和 tracker = LOW。 buttonState 和 tracker 不相等,所以代码进入第一个 if 子句。 buttonState为HIGH,所以代码进入第二个if子句(打印数据) 然后将跟踪器设置为 buttonState,即 HIGH

-当循环再次出现时: 如果按钮仍被按下,则 buttonState 和 tracker 仍然相等,因此代码不会进入第一个子句。因此,不会打印任何内容。 如果不再按下按钮,则 buttonState 为 LOW,tracker 为 HIGH。输入第一个 if 子句。 buttonState 为 LOW,因此打印部分将不会执行。 tracker 设置为 buttonState,因此它们现在都为 LOW。回到我们开始的地方。

希望对您有所帮助。

a) 引脚 6 上是否有下拉电阻?

b) 你在结果中只看到数字 2 是因为每次调用函数 loop() 时你都重置了变量 br。如果你让 br 静态它只会被初始化一次,这就是你想要的。

c) 您应该检查 digitalRead(buttonPin) 返回的值是否有从低到高的转换,而不仅仅是检查高值。你的代码现在的方式,如果你按住按钮足够长的时间,循环将 运行 任何时候,每次它都会看到 digitalRead(buttonPin) returns HIGH - 这解释了你的'5次'问题.如果更改后您仍然看到许多印刷机而不是一个印刷机,那么您的问题可能是去抖动 - 您可以 google 这个词以获得详尽的解释甚至示例代码,但简而言之,您应该放弃从低到高的转换时间太近了。

你的按钮状态错误试试这个:

//Your declared pins

...


//Buttons

int button1 = 7;





//States for obj 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




// 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 debounce1 = 200;   // the debounce time, increase if the output flickers


...


void loop() {

  reading1 = digitalRead(button1);


  // 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 1
  if (reading1 == HIGH && previous1 == LOW && millis() - time1 > debounce1) {
    if (state1 == HIGH)
      state1 = LOW;
    else
      state1 = HIGH;

    time1 = millis();   
  }


//put as many variables as you want here connected to state1
//If you see relay somewhere or I forgot brackets please let me know
//I just adapted an old project with relays that was similar
if(state1 == HIGH){
     //YOUR STUFF

}

  digitalWrite(yourvariable, state1); //In case you want to turn on something

//you can find a way to nest this "if statements for the button" if you want
  previous1 = reading1;

}