2015-11-21 4 views
0

Я работаю над простым рулевым управлением автомобиля, поэтому я сделал 2 кнопки для перемотки вперед/назад и 2 кнопки для управления влево/вправо. У меня есть 2 светодиода, чтобы просто увидеть, как он работает, но он не работает, как мне нравится. Я могу использовать только одну кнопку i один раз, поэтому, двигаясь вперед, я не смогу двигаться влево/вправо и т.д. Как это сделать? Вот мой код в IDE:Arduino: Использование нескольких входов в одно и то же время

int LED = 12; 
    int LED2 = 2; 
    int ButtonUP = 9; 
    int ButtonDOWN = 7; 
    int ButtonLEFT = 4; 
    int ButtonRIGHT = 8; 

    int sygnalUP = 0; 
    int sygnalDOWN = 0; 
    int sygnalLEFT = 0; 
    int sygnalRIGHT = 0; 

void setup() { 
pinMode (LED, OUTPUT); 
pinMode (ButtonUP, INPUT_PULLUP); 
pinMode (ButtonDOWN, INPUT_PULLUP); 
pinMode (ButtonLEFT, INPUT_PULLUP); 
pinMode (ButtonRIGHT, INPUT_PULLUP); 
Serial.begin(9600); 
Serial.println("  |GORA|DOL|LEW|PRA"); 
} 

void loop() { 
int buttonUPst = digitalRead(ButtonUP); 
int buttonDOWNst = digitalRead(ButtonDOWN); 
int buttonLEFTst = digitalRead(ButtonLEFT); 
int buttonRIGHTst = digitalRead(ButtonRIGHT); 


if (buttonUPst == LOW) { 
digitalWrite(12, HIGH); 
sygnalUP = 1; 
Serial.print("Sygnal: "); 
Serial.print(sygnalUP); 
Serial.print(" | "); 
Serial.print(sygnalDOWN); 
Serial.print(" | "); 
Serial.print(sygnalLEFT); 
Serial.print(" | "); 
Serial.println(sygnalRIGHT); 
delay(300); 
digitalWrite(12, LOW); 
sygnalUP = 0; 
} 

if (buttonDOWNst == LOW) { 
digitalWrite(12, HIGH); 
sygnalDOWN = 1; 
Serial.print("Sygnal: "); 
Serial.print(sygnalUP); 
Serial.print(" | "); 
Serial.print(sygnalDOWN); 
Serial.print(" | "); 
Serial.print(sygnalLEFT); 
Serial.print(" | "); 
Serial.println(sygnalRIGHT); 
delay(300); 
digitalWrite(12, LOW); 
sygnalDOWN = 0; 
} 

if (buttonLEFTst == LOW) { 
digitalWrite(LED2, HIGH); 
sygnalLEFT = 1; 
Serial.print("Sygnal: "); 
Serial.print(sygnalUP); 
Serial.print(" | "); 
Serial.print(sygnalDOWN); 
Serial.print(" | "); 
Serial.print(sygnalLEFT); 
Serial.print(" | "); 
Serial.println(sygnalRIGHT); 
delay(300); 
digitalWrite(LED2, LOW); 
sygnalLEFT = 0; 
} 

if (buttonRIGHTst == LOW) { 
digitalWrite(LED2, HIGH); 
sygnalRIGHT = 1; 
Serial.print("Sygnal: "); 
Serial.print(sygnalUP); 
Serial.print(" | "); 
Serial.print(sygnalDOWN); 
Serial.print(" | "); 
Serial.print(sygnalLEFT); 
Serial.print(" | "); 
Serial.println(sygnalRIGHT); 
delay(300); 
digitalWrite(LED2, LOW); 
sygnalRIGHT = 0; 
} 
} 

Как вы можете видеть, я сделал код, чтобы увидеть, как входы работают в сериале, это выглядит следующим образом:

 |GORA|DOL|LEW|PRA 
Sygnal: 1 | 0 | 0 | 0 
Sygnal: 1 | 0 | 0 | 0 
Sygnal: 1 | 0 | 0 | 0 
Sygnal: 1 | 0 | 0 | 0 
Sygnal: 0 | 1 | 0 | 0 
Sygnal: 0 | 1 | 0 | 0 
Sygnal: 0 | 1 | 0 | 0 
Sygnal: 0 | 1 | 0 | 0 
Sygnal: 0 | 0 | 1 | 0 

И здесь вы можете см. также, что я не могу сделать два «1» в ряд. Я знаю, что делаю здесь основную ошибку, но мои знания довольно бедны. Спасибо за любую помощь.

+0

Это не C. И формат/отступ вашего кода должным образом. – Olaf

ответ

0

Вы почти у цели!

Вы печатаете значения Sygnal в таблице, но отдельные блоки if гарантируют, что только один из них является истинным одновременно. Но значения button, которые вы читаете в начале каждого цикла, могут быть одновременно LOW. Таким образом, вы могли бы сделать что-то вроде следующего:.

  • Просто обновите Sygnal значения один раз в loop() по button значений (а также соответствующие digitalWrite() S
  • Используйте только один delay() при отстаивании несколько digitalWrite() сек .
  • Если вы все еще хотите, чтобы напечатать Sygnal значения, просто напечатать их один раз в конце loop().

Редактирование: здесь приведено изменение loop() по вышеприведенным строкам. Надеюсь это поможет.

void printStates() { 
    Serial.print("Sygnal: "); 
    Serial.print(sygnalUP); 
    Serial.print(" | "); 
    Serial.print(sygnalDOWN); 
    Serial.print(" | "); 
    Serial.print(sygnalLEFT); 
    Serial.print(" | "); 
    Serial.println(sygnalRIGHT); 
    Serial.flush(); // block execution for as long as needed to print row 
} 

void loop() { 
    int buttonUPst = digitalRead(ButtonUP); 
    int buttonDOWNst = digitalRead(ButtonDOWN); 
    int buttonLEFTst = digitalRead(ButtonLEFT); 
    int buttonRIGHTst = digitalRead(ButtonRIGHT); 

    if (buttonUPst == LOW) { 
    digitalWrite(LED, HIGH); 
    sygnalUP = 1; 
    } else { 
    digitalWrite(LED, LOW); 
    sygnalUP = 0; 
    } 

    // ...Repeat above if-else for other three button directions here... 

    printStates(); 
} 
Смежные вопросы