Последовательность нажатия кнопок

Тема в разделе "Arduino & Shields", создана пользователем Blackgeneral, 17 май 2024.

  1. Sergku

    Sergku Нерд

    Дружище, если честно кровь из глаз, я тут реплики кидаю, но содержания нима..
     
  2. Blackgeneral

    Blackgeneral Нерд

    Возможно Вам "режет глаз" мой код, но я все равно пока не нахожу где ошибка в программе.
    Да, правильней логику сделать через массивы.
    Но, сейчас, мне кажется быстрее сделать через if , а потом уже, понимая, что это работает мычать массивы?
     
  3. Sergku

    Sergku Нерд

    должно быть примерно так (для 1 кнопки), count выкидываем, он тут лишний:
    Код (C++):
    if (digitalRead(button1)){ // тут смотрим, была ли нажата кнопка
        if (button1state++ == 1 && massiv[0]==1)){ // тут увеличиваем количество нажатий и сравниваем с элементом массива
            digitalWrite(red1,HIGH);
        }else button1state = 0; // Тут обнуляем счетчик нажатий
    }
    и так для каждой кнопки (у каждой свой счетчик нажатий)
     
  4. Blackgeneral

    Blackgeneral Нерд

    Спасибо! Но я тогда не понимаю зачем для каждой кнопки свои нажатия? Считать нужно же общие нажатия, т.к. кнопки нажимаются подряд.
     
  5. Sergku

    Sergku Нерд

    Я тогда, тоже не понимаю. Речь в заголовке поста была, про последовательность нажатий кнопок?
     
  6. Blackgeneral

    Blackgeneral Нерд

    Вот видео работы кода с первого поста, но там фиксированный код 3,1,2.
    Первый случай это нажатие ошибочной цифы. Второй случай - нажатие первой правильной цифры, а второй не верной, и третий - нажатие правильного кода.
    https://disk.yandex.ru/i/pr-JnZQjtRnCrg
     
  7. Sergku

    Sergku Нерд

    в том коде, обрабатывается сразу состояние всех кнопок, и логика работы прибита гвоздями. с произвольным массивом такое вряд ли прокатит
     
  8. Blackgeneral

    Blackgeneral Нерд

    Это я понимаю. На видео показан смысл. В первом посте я описал логику работы (возможно,. не совсем удачно , если есть вопросы). Именно потому, что "прибита гвоздями", хотелось сделать более гибкой.
     
  9. Sergku

    Sergku Нерд

    оно, меня лично, еще больше запутало :)
     
  10. KindMan

    KindMan Гуру

    Я вам ещё на первой странице обсуждения написал примерно, как добиться гибкости.
    Вот напишите функцию, которая будет в Serial писать номер нажатой кнопки, и всё пока. Но функция должна быть отдельно, т.е. например
    Код (C++):
    void buttonPress(uint8_t number)
    {
       Serial.print("Button - ");
       Serial.print(number);
       Serial.println(" press");
    }
    Этой функции передается управление, когда нажата одна из кнопок и переменная number содержит номер этой кнопки.
    Сможете? Следующим шагом прикрутим массив.
     
  11. Blackgeneral

    Blackgeneral Нерд

    Пересмотрю еще раз. Может пропустил.
    Хорошо.
    Хорошо.
     
  12. Blackgeneral

    Blackgeneral Нерд

    Здравствуйте, вот:
    Код (C++):

    // Code massiv
    int massiv[3]={3,2,1};
    int count = 0;

    //Main RGB LED
    int red = 13;
    int green = 12;

    //Button-LED #1
    int button1state = 0;
    int red1 = 11;
    int button1 = 10;

    //Button-LED #2
    int button2state = 0;
    int red2 = 9;
    int button2 = 8;

    //Button-LED #3
    int button3state = 0;
    int red3 = 7;
    int button3 = 6;

    int number;

    void setup() {
      pinMode(red, OUTPUT);
      pinMode(green, OUTPUT);
      pinMode(red1, OUTPUT);
      pinMode(button1, INPUT);
      pinMode(red2, OUTPUT);
      pinMode(button2, INPUT);
      pinMode(red3, OUTPUT);
      pinMode(button3, INPUT);
      Serial.begin(9600);
    }

    void buttonPress(uint8_t number)
    {
       Serial.print("Button - ");
       Serial.print(number);
       Serial.println(" press");
    }


    void loop() {
    button1state = digitalRead(button1);
    button2state = digitalRead(button2);
    button3state = digitalRead(button3);
      if (button1state==HIGH){
        number=1;
        buttonPress(number);
     
      }
    if (button2state==HIGH){
        number=2;
        buttonPress(number);
     
      }
     
      if (button3state==HIGH){
        number=3;
        buttonPress(number);
     
      }

    }

     
     
  13. KindMan

    KindMan Гуру

    Извините, сейчас проблемы с свободным временем, поэтому ответы с задержкой.

    Это не тот вариант, что нам нужен. Смотрите: Мы же при нажатии кнопки, должны получить однократный вызов функции buttonPress, а в варианте выше, она будет вызываться, пока вы держите кнопку. т.е. нам нужно иметь как-бы Клик на выходе. Иначе, просто нажав на кнопку, программа успеет вызвать функцию много раз, ваш код будет 1,1,1 или 2,2,2

    и вот это
    Код (C++):
    if (button2state==HIGH){
        number=2;
        buttonPress(number);
      }
    меняем на это во всех обработчиках
    Код (C++):
    if (button2state==HIGH){
        buttonPress(2);
      }
    переменная number нам не нужна там
     
  14. Blackgeneral

    Blackgeneral Нерд

    Спасибо! Пока единственный вариант, который приходит в голову для однократного нажатия сделать задержку типа "delay (1000)".
    Подумаю еще. Завтра-послезавтра (тоже имеется небольшой завал по времени) попробую написать, что придумал.
    Т.е. я правильно понимаю, что функция получает любой аргумент, указанный в скобках, и присваивает его "number"?
     
  15. KindMan

    KindMan Гуру

    Да, вы передаёте в функцию то, что в скобках.
     
  16. KindMan

    KindMan Гуру

  17. Blackgeneral

    Blackgeneral Нерд

    Спасибо большое! Обязательно гляну и отпишусь.
    P.S.: пока зашиваюсь на работе...
     
  18. Blackgeneral

    Blackgeneral Нерд

    Здравствуйте!

    Наконец дошли руки «поковыряться в коде». Исходя из этого пару вопросов по Вашему коду и схеме:

    1. Чтобы у меня заработал код мне прошлось исправить свою схему: подтянуть кнопку к плюсу. Это было необходимо, т.к у Вас подтяжка осуществляется внутренними сопротивлениями в строках №32 №34 и №36, правильно?

    2. Как я понял, Ваша функция в строке №47: voidEnableLed(uint8_tnumber) должна «зажигать» светодиод, согласно его номера в коде. Вставив в код строки для отображения этой величины в мониторе порта и поменяв правильный код я это увидел (скриншот прилагаю), но по итогу она почему-то выдает порядок нажатия правильных цифра кода? Пока не смог разобраться где и что не так.
    2-2.jpg

    3. Не смог понять, что делает 111 строка. Подскажите где почитать?

    4. Я правильно понимаю: использование, например, «uint8_t» вместо «byte» обусловлено возможной дальнейшей совместимостью кода?



    Заранее спасибо!
     
  19. parovoZZ

    parovoZZ Гуру

    это коротка запись if then else

    нет. Это одно и тоже.
    В языке Си для "совместимости" кода используется явное приведение типов.
     
  20. KindMan

    KindMan Гуру

    Приветствую!
    Я сделал как пример, на симуляторе, и не хотелось рисовать лишние резисторы. Я всегда притягиваю к плюсу, мне так удобнее.

    Она по очереди зажигает светодиоды, если комбинация верная. Всегда будет 1,2,3
    В massive лежит порядок нажатия кнопок - правильная комбинация. Если нужно зажигать именно тот светодиод, который над кнопкой, то нужно брать значения так-же из массива.

    Я не всегда пишу с использованием Arduino фрэймворка, поэтому применяю стандартные типы данных. В контексте вашего вопроса - да.
     
    Последнее редактирование: 9 авг 2024