Всем здравствуйте! Прошу помощи в решении допзадания: "Добавьте в схему еще одну кнопку и доработайте код, чтобы светодиод зажигался только при нажатии обеих кнопок". В принципе, уже сделал множество скетчей, проверку проходят, а на железе - тишина. Как пример, один из скетечей: #define FIRST_BUTTON_PIN 3 #define SECOND_BUTTON_PIN 4 #define LED_PIN 13 boolean buttonWasUp_FIRST = true; boolean buttonWasUp_SECOND = true; boolean ledEnabled_FIRST = false; boolean ledEnabled_SECOND = false; boolean ledEnabled = false; void setup() { pinMode(LED_PIN, OUTPUT); pinMode(FIRST_BUTTON_PIN, INPUT_PULLUP); pinMode(SECOND_BUTTON_PIN, INPUT_PULLUP); } void loop() { boolean buttonIsUp_FIRST = digitalRead(FIRST_BUTTON_PIN); if (buttonWasUp_FIRST&&!buttonIsUp_FIRST){ delay(10); buttonIsUp_FIRST=digitalRead(FIRST_BUTTON_PIN); if (!buttonIsUp_FIRST){ ledEnabled_FIRST=!ledEnabled_FIRST;} boolean buttonIsUp_SECOND = digitalRead(SECOND_BUTTON_PIN); if (buttonWasUp_SECOND&&!buttonIsUp_SECOND){ delay(10); buttonIsUp_SECOND=digitalRead(SECOND_BUTTON_PIN); if (!buttonIsUp_SECOND){ ledEnabled_SECOND=!ledEnabled_SECOND;} ledEnabled=!ledEnabled_FIRST+!ledEnabled_SECOND; digitalWrite(LED_PIN, ledEnabled); } buttonWasUp_FIRST=buttonIsUp_FIRST; buttonWasUp_SECOND=buttonIsUp_SECOND; }} Спасибо!
Вы бы правильно оформили для начала код, так глаза сломать можно. Не вчитывался, но задача решается элементарно - считываются обе кнопки и светодиод включается если обе нажаты. Обработку нажатия и дребезга проще вывести в функцию, так будет нагляднее и проще.
Ок! так лучше читается? Код (Text): #define FIRST_BUTTON_PIN 3 #define SECOND_BUTTON_PIN 4 #define LED_PIN 13 boolean buttonWasUp_FIRST = true; boolean buttonWasUp_SECOND = true; boolean ledEnabled_FIRST = false; boolean ledEnabled_SECOND = false; boolean ledEnabled = false; void setup() { pinMode(LED_PIN, OUTPUT); pinMode(FIRST_BUTTON_PIN, INPUT_PULLUP); pinMode(SECOND_BUTTON_PIN, INPUT_PULLUP); } void loop() { boolean buttonIsUp_FIRST = digitalRead(FIRST_BUTTON_PIN); if (buttonWasUp_FIRST&&!buttonIsUp_FIRST){ delay(10); buttonIsUp_FIRST=digitalRead(FIRST_BUTTON_PIN); if (!buttonIsUp_FIRST){ ledEnabled_FIRST=!ledEnabled_FIRST;} boolean buttonIsUp_SECOND = digitalRead(SECOND_BUTTON_PIN); if (buttonWasUp_SECOND&&!buttonIsUp_SECOND){ delay(10); buttonIsUp_SECOND=digitalRead(SECOND_BUTTON_PIN); if (!buttonIsUp_SECOND){ ledEnabled_SECOND=!ledEnabled_SECOND;} ledEnabled=!ledEnabled_FIRST+!ledEnabled_SECOND; digitalWrite(LED_PIN, ledEnabled); } buttonWasUp_FIRST=buttonIsUp_FIRST; buttonWasUp_SECOND=buttonIsUp_SECOND; }}
Я пошел по такому пути: считываем показания с первой клавиши, определяем с нее изменения работы диода, после считываем со второй клавиши и для нее определяем состояние диода, затем. суммируя значения - определяем общее состояние диода.
Решил полностью переписать код не опираясь на пример и вот что вышло: Код (Text): #define FIRST_BUTTON_PIN 3 #define SECOND_BUTTON_PIN 4 #define LED_PIN 13 bool ledEnabled = false; bool keyPress = false; void setup() { pinMode(LED_PIN, OUTPUT); pinMode(FIRST_BUTTON_PIN, INPUT_PULLUP); pinMode(SECOND_BUTTON_PIN, INPUT_PULLUP); digitalWrite(LED_PIN, ledEnabled); } void loop() { if (!digitalRead(FIRST_BUTTON_PIN) && !digitalRead(SECOND_BUTTON_PIN)) { delay(10); if (!digitalRead(FIRST_BUTTON_PIN) && !digitalRead(SECOND_BUTTON_PIN)) { if (keyPress == false) { ledEnabled = !ledEnabled; digitalWrite(LED_PIN, ledEnabled); keyPress = true; } } } else { keyPress = false; } } Коротко, понятно и без ошибок. Попробуйте в работе и разберитесь в принципе. В идеале бы обойтись без delay, потому что он лишь тормозит программу, сможете переписать без него?
Вроде алгоритм вашего решения осознал. В принципе 2 кнопка является механическим решением дребезга. В итоге без delay: Код (Text): if (!digitalRead(FIRST_BUTTON_PIN) && !digitalRead(SECOND_BUTTON_PIN)) { delay(10); удаляем, подправляем количество скобок и скетч все равно работает. Спасибо!
Теоретически две кнопки нельзя нажать одновременно, хоть на несколько миллисекунд да разница будет, пока вторую жмем первая уже угомонилась. Кроме того кнопки не могут дребезжать полностью синхронно, значит в таком случае дребезгом можно пренебреч. Мой вариант скорее теоретически борется с дребезгом, хотя можно использовать этот способ и для одной кнопки, тогда антидребезг будет практическим.
а просто физически две кнопки последовательно, сигнал пройдет только при одновременном нажатии. Так можно?
А вот так можно было реализовать? В принципе всё работает: если обе кнопки были нажаты, а потом хотя бы одну отпустили, то загорается диод. Код (Text): #define BUTTON_PIN1 2 #define BUTTON_PIN2 5 #define LED_PIN 3 boolean buttonWasUp1 = true; boolean buttonWasUp2 = true; boolean ledEnabled = false; void setup() { pinMode(LED_PIN, OUTPUT); pinMode(BUTTON_PIN1, INPUT_PULLUP); pinMode(BUTTON_PIN2, INPUT_PULLUP); } void loop() { boolean buttonIsUp1 = digitalRead(BUTTON_PIN1); boolean buttonIsUp2 = digitalRead(BUTTON_PIN2); if (!buttonWasUp1 && !buttonWasUp2 && (buttonIsUp1 || buttonIsUp2)) { ledEnabled = !ledEnabled; digitalWrite(LED_PIN, ledEnabled); } buttonWasUp1 = buttonIsUp1; buttonWasUp2 = buttonIsUp2; }