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

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

  1. parovoZZ

    parovoZZ Гуру

    это не алгоритм, а описание.
    Алгоритм - это вот:
    1. Проверяем нажатие первой кнопки. Нажата? Переход в обработчик нажатия кнопки.
    Нет? Идём в п.2
    2. Проверяем нажатие второй кнопки. Нажата? .... И так далее.
     
  2. Sergku

    Sergku Нерд

    если я верно понял, то автор хочет проверять порядок нажатия кнопок и сравнивать с массивом... если да, то примерно так:

    Код (C++):

    const byte
        buttonPin[]={13,12,11};
     
    byte
        massiv[] = {3,2,1};
    ...

    void setup(){
        for (byte i = 0; i < 3; i++)
             pinMode(buttonPin[i], INPUT);
    ...
    }

    void loop(){
        for (byte i = 0; i < 3; i++){
            if (digtalRead(buttonPin[i])){
                if (i+1 == massiv[i])
                    ...
            }
        }
    }
     
     
    Последнее редактирование: 20 май 2024
  3. Blackgeneral

    Blackgeneral Нерд

    Добрый день. Не совсем так. Если просто с массивом то это сравнение двух массивов, а здесь проверяется каждая нажатая кнопка на правильность (порядок кода).
     
  4. Sergku

    Sergku Нерд

    верно, тогда надо еще счетчик добавить и массив нажатий:
    Код (C++):

    const byte
        buttonPin[] = {13,12,11},
        massiv[] = {3,2,1};
    byte
        pushed[] = {0,0,0},
        currentButton = 0;
    ...

    void setup(){
        for (byte i = 0; i < 3; i++)
            pinMode(buttonPin[i], INPUT);
    ...
    }

    void loop(){
        for (byte i = 0; i < 3; i++){
            if digitalRead(buttonPin[i]){
                pushed[currentButton++] = i+1;
            }
        }
    }
     
    и сравнивай их потом
    massiv и pushed
    ну и это надо проверять, currentButton понятное дело
     
  5. Blackgeneral

    Blackgeneral Нерд

    Спасибо! Буду разбираться!
     
  6. Sergku

    Sergku Нерд

    Это правильно! Массивы надо знать
     
  7. 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;



    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 buttonReset() {
      count = 0;
      button1state = 0;
      button2state = 0;
      button3state = 0;
    }
    /*void mistake()
    {
      for (int i=0; i < 6; i++) {
        digitalWrite(red, HIGH);
        delay(300);
        digitalWrite(red, LOW);
        delay(300);
      }
    }*/

    void loop() {
    count=count+1;

    //Button 1 Press

    button1state = digitalRead(button1);

    if (button1state == 1 && count==1 && massiv[0]==1) {
      digitalWrite(red1,HIGH);
    }
    else {
      buttonReset();
    }

    if (button1state == 1 && count==2 && massiv[1]==1) {
      digitalWrite(red1,HIGH);
    }
    else {
      buttonReset();
    }

    if (button1state == 1 && count==3 && massiv[2]==1) {
    digitalWrite(red1,HIGH);
    }
    /*else {
      mistake();
    }*/



    //Button 2 Press

    button2state = digitalRead(button2);
    if (button2state == 1 && count==1 && massiv[0]==2) {
      digitalWrite(red2,HIGH);
    }
    else {
      buttonReset();
    }

    if (button2state == 1 && count==2 && massiv[1]==2) {
      digitalWrite(red2,HIGH);
    }
    else {
      buttonReset();
    }

    if (button2state == 1 && count==3 && massiv[2]==2) {
    digitalWrite(red2,HIGH);
    }
    /*else {
      mistake();
    } */




    //Button 3 Press

    button3state = digitalRead(button3);
    if (button3state == 1 && count==1 && massiv[0]==3) {
      digitalWrite(red3,HIGH);
    }
    else {
      buttonReset();
    }

    if (button3state == 1 && count==2 && massiv[1]==3) {
      digitalWrite(red3,HIGH);
    }
    else {
      buttonReset();
    }

    if (button1state == 1 && count==3 && massiv[2]==3) {
    digitalWrite(red3,HIGH);
    }
    /*else {
      mistake();
    } */


    }
     
    При запуске программы выполнялся только функция mistake(). Как только ее закоментил - только функция buttonReset().
    Не пойму что не так .
     
  8. parovoZZ

    parovoZZ Гуру

    чем спрашивать на форуме, лучше дебажить самостоятельно.
     
  9. Blackgeneral

    Blackgeneral Нерд

    1. Разве в ардуино IDE есть отладчик?
    2. Не имею привычки сразу бегать и спрашивать. Раз спросил - значит ответа не нашел ни в голове ни в инете.
    3. А для чего тогда форум нужен? Языком просто так "чесать"?
     
  10. Sergku

    Sergku Нерд

    Под отладчиком понимается Serial.println - штука убойная и гарантированная. По поводу кода, count зачем в каждой итерации инкрементируется?
     
  11. Blackgeneral

    Blackgeneral Нерд

    Это я использую. Именно этим и нашел, что выполняются mistake(). или buttonReset().
    Нужно же для каждой кнопки вести подсчет количества нажатий. Если нажатие неверное, то сброс или ошибка если верное - то загорается светодиод.
    И так по каждой кнопке пока правильная комбинация "не произойдет".
    P.S.: если не понятен сам принцип, то могу снять видео по первой программе с фиксированным кодом.
     
  12. Sergku

    Sergku Нерд

    в общем, проблема тут

    void loop(){ count=count+1; цикл луп крутится на большой скорости, count там явно не будет 1 или 2

    обычно, количество нажатий считается так if (digitalRead(buttonPin) count++
     
    Последнее редактирование: 24 май 2024
  13. Blackgeneral

    Blackgeneral Нерд

    Спасибо, сейчас попробую.
     
  14. Blackgeneral

    Blackgeneral Нерд

    Оно считается, но только если закоментчены функции mistake() и buttonReset().
    Т.е. пока не пойму, почему выполняются только mistake() и buttonReset(), а не остальной код.
     
  15. parovoZZ

    parovoZZ Гуру

    Даже если бы и был, нужен ещё аппаратный. А он для старых авр стоит очень дорого. Поэтому ставим метки в коде и вытаскивает их через UART. Ну или переходи на esp
     
  16. Blackgeneral

    Blackgeneral Нерд

    Понятно.
    Serial.print я конечно использую но вот все равно с функциям пока не могу разобраться: почему только они выполняются.
     
  17. parovoZZ

    parovoZZ Гуру

    вызываются - исполняются
    не вызываются - не исполняются.
     
  18. Blackgeneral

    Blackgeneral Нерд

    Это понятно, но вроде я их вызывал "в последнюю очередь" а они первыми пролезть наровят ))
     
  19. Sergku

    Sergku Нерд

    6 тут как?
     

    Вложения:

  20. Blackgeneral

    Blackgeneral Нерд

    Здесь счет идет постоянно 1,2,3...Вы правы.
    А здесь:
    Код (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;



    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 mistake() {
      for (int i=0; i < 6; i++) {
        digitalWrite(red, HIGH);
        delay(300);
        digitalWrite(red, LOW);
        delay(300);
      }
    }*/

    void buttonReset() {
      //count = 0;
      button1state = 0;
      button2state = 0;
      button3state = 0;
    }
    void loop() {

       if (digitalRead(button1)||digitalRead(button2)||digitalRead(button3)){
        count=count+1;
      }

    //Button 1 Press

    button1state = digitalRead(button1);

    if (button1state == 1 && count==1 && massiv[0]==1) {
      digitalWrite(red1,HIGH);
    }
    else {
      buttonReset();
    }

    if (button1state == 1 && count==2 && massiv[1]==1) {
      digitalWrite(red1,HIGH);
    }
    else {
      buttonReset();
    }

    if (button1state == 1 && count==3 && massiv[2]==1) {
    digitalWrite(red1,HIGH);
    }
    /*else {
      mistake();
    }*/



    //Button 2 Press

    button2state = digitalRead(button2);
    if (button2state == 1 && count==1 && massiv[0]==2) {
      digitalWrite(red2,HIGH);
    }
    else {
      buttonReset();
    }

    if (button2state == 1 && count==2 && massiv[1]==2) {
      digitalWrite(red2,HIGH);
    }
    else {
      buttonReset();
    }

    if (button2state == 1 && count==3 && massiv[2]==2) {
    digitalWrite(red2,HIGH);
    }
    /*else {
      mistake();
    } */




    //Button 3 Press

    button3state = digitalRead(button3);
    if (button3state == 1 && count==1 && massiv[0]==3) {
      digitalWrite(red3,HIGH);
    }
    else {
      buttonReset();
    }

    if (button3state == 1 && count==2 && massiv[1]==3) {
      digitalWrite(red3,HIGH);
    }
    else {
      buttonReset();
    }

    if (button1state == 1 && count==3 && massiv[2]==3) {
    digitalWrite(red3,HIGH);
    }
    /*else {
      mistake();
    } */



    Serial.print("button1state:");
    Serial.println(button1state);
    Serial.print("button2state:");
    Serial.println(button2state);
    Serial.print("button3state:");
    Serial.println(button3state);
    Serial.print("count:");
    Serial.println(count);
    /*Serial.print("massiv[0]:");
    Serial.println(massiv[0]);
    Serial.print("massiv[1]:");
    Serial.println(massiv[1]);
    Serial.print("massiv[2]:");
    Serial.println(massiv[2]);*/

      delay (500);

    }
     
    Как положено - после нажатия кнопки.