2016-05-10 4 views
1

У меня есть программа с arduino UNO и цветным датчиком, ведьма показывает мне значения RGB. У меня есть кнопка тоже, ведьма может начать чтение объекта (цветной папер), но когда я его нажимаю, программа читает 5 раз, а не один раз, как я хочу. В каждом случае (для каждого цвета), я хочу добавить значение к переменной, которую хочу показать в Серийном мониторе, но после чтения (или 5 показаний :)), серийный монитор показывает только значение, которое я хочу добавить к моей переменной (например, c = c + 2, serial motior: 2 для каждого нажатия кнопки).ARDUINO - кнопка

Вот мой код:

// 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"); 
    } 
    } 
} 
+2

Убедитесь, что вы дребезга кнопку. – JimmyB

+2

В вашем коде у вас есть 'int br = 0;' * inside * функция 'loop()'. Следовательно, 'br' сбрасывается на 0 на каждой итерации. Объявите 'br' вне функции и посмотрите, поможет ли это. – JimmyB

ответ

1

я мог бы быть в состоянии помочь вам представить себе, что происходит. При первом запуске цикла и нажатии кнопки кнопкаState устанавливается на HIGH. Поскольку цикл работает быстрее, чем ваш buttonPress, он выполняется несколько раз, пока вы нажали кнопку. Похоже на то, что вы действительно хотите, это код, который печатает данные для выполнения один раз для каждой кнопки. Для этого вам необходимо отслеживать состояние изменения кнопки. Вы можете сделать это с помощью дополнительной переменной.

Например:

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

Затем в цикле, только выполнить, когда трекер и 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 (НИЗКИЙ). -При нажатии кнопки кнопкаState = HIGH и трекер = LOW. buttonState и tracker не равны, поэтому код входит в первый оператор if. buttonState ВЫСОКОЕ, поэтому код поступает в второй, если условие (печатает данные) трекер затем устанавливается на buttonState, т.е. ВЫСОКИЙ

-когда петля вокруг снова приходит: если кнопка все еще нажата, buttonState и трекер все равно равны, поэтому код не вводит первое предложение. Поэтому ничего не печатается. Если кнопка больше не нажата, то кнопкаState LOW и трекер HIGH. Введен первый параметр if. buttonState LOW, поэтому раздел печати не будет выполнен. трекер установлен на buttonState, поэтому они теперь и LOW. Вернемся туда, где мы начали.

Надеюсь, это поможет.

1

a) У вас есть выпадающий резистор на контакте 6?

b) факт, что вы видите только число 2 в результате, связано с тем, что вы каждый раз вызываете переменную br каждый раз, когда вызывается функция loop(). Если вы ставите br static, он будет инициализирован только один раз, и это то, что вы хотите.

c) Вы должны проверить переход LOW на HIGH в значение, возвращаемое функцией digitalRead (buttonPin), вместо того, чтобы просто проверять значение HIGH. То, как ваш код теперь, если вы удерживаете кнопку достаточно долго, цикл будет выполняться в любое время, и каждый раз, когда он увидит, что digitalRead (buttonPin) возвращает HIGH, это объясняет вашу проблему «5 раз». Если после изменения вы все равно видите много прессов вместо одного, тогда ваша проблема, вероятно, будет debouncing - вы можете использовать слово Google для подробного объяснения и даже пример кода, но вкратце вы должны отказаться от LOW to HIGH переходов, которые слишком близко друг к другу во время.

0

Ваше состояние кнопки производится неправильно, попробуйте следующее:

//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; 

}