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;
}
我有一个带有 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;
}