Эксперимент 10, 2 задание для самостоятельного решения.

Тема в разделе "Флудилка", создана пользователем BalDive, 6 июл 2015.

  1. BalDive

    BalDive Нуб

    Всем здравствуйте! Прошу помощи в решении допзадания: "Добавьте в схему еще одну кнопку и доработайте код, чтобы светодиод зажигался только при нажатии обеих кнопок".
    В принципе, уже сделал множество скетчей, проверку проходят, а на железе - тишина.
    Как пример, один из скетечей:
    #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;
    }}
    Спасибо!
     
  2. DrProg

    DrProg Вечный нерд

    Вы бы правильно оформили для начала код, так глаза сломать можно. Не вчитывался, но задача решается элементарно - считываются обе кнопки и светодиод включается если обе нажаты. Обработку нажатия и дребезга проще вывести в функцию, так будет нагляднее и проще.
     
  3. BalDive

    BalDive Нуб

    Ок! так лучше читается?
    Код (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;
    }}
     
  4. BalDive

    BalDive Нуб

    Я пошел по такому пути: считываем показания с первой клавиши, определяем с нее изменения работы диода, после считываем со второй клавиши и для нее определяем состояние диода, затем. суммируя значения - определяем общее состояние диода.
     
  5. DrProg

    DrProg Вечный нерд

    Решил полностью переписать код не опираясь на пример и вот что вышло:
    Код (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, потому что он лишь тормозит программу, сможете переписать без него?
     
    Последнее редактирование: 7 июл 2015
  6. BalDive

    BalDive Нуб

    Вроде алгоритм вашего решения осознал. В принципе 2 кнопка является механическим решением дребезга.
    В итоге без delay:
    Код (Text):
    if (!digitalRead(FIRST_BUTTON_PIN) && !digitalRead(SECOND_BUTTON_PIN)) {
        delay(10);
    удаляем, подправляем количество скобок и скетч все равно работает. Спасибо!
     
  7. DrProg

    DrProg Вечный нерд

    Теоретически две кнопки нельзя нажать одновременно, хоть на несколько миллисекунд да разница будет, пока вторую жмем первая уже угомонилась. Кроме того кнопки не могут дребезжать полностью синхронно, значит в таком случае дребезгом можно пренебреч. Мой вариант скорее теоретически борется с дребезгом, хотя можно использовать этот способ и для одной кнопки, тогда антидребезг будет практическим.
     
  8. а просто физически две кнопки последовательно, сигнал пройдет только при одновременном нажатии. Так можно?
     
  9. Alex Chiga

    Alex Chiga Нуб

    А вот так можно было реализовать? В принципе всё работает: если обе кнопки были нажаты, а потом хотя бы одну отпустили, то загорается диод.
    Код (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;
    }