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

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

  1. Blackgeneral

    Blackgeneral Нерд

    Всем доброго времени суток!

    Написал алгоритм для угадывания последовательности нажатия кнопок: при неправильном нажатии на кнопку они мигают, при правильном загорается светодиод в ряду, а при правильном нажатии всей последовательности – RGB светодиод.
    1.jpg
    Сейчас код 3,2,1

    Захотелось улучшить программу и сделать возможность выбора кода в самом начале.
    Попробовал сделать это через массив, но ничего не вышло – что-то я затупил.

    Подскажите в каком направлении «копать».
    Спасибо!

    Код (C++):

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

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

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

    //Button-LED Combo #3
    int button3state = 0;
    int button3last = 0;
    int b3Pressed = 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);
      digitalWrite(red,HIGH);
    }

    void loop() {

      //Button 3 Press
        button3state = digitalRead(button3);
        if (button3state == 1) {
        b3Pressed = 1;
        digitalWrite(red3,HIGH);
      }
     
      //Button 1 Press
        button1state = digitalRead(button1);
        if (button1state == 1) {
        b1Pressed = 1;
        if (b3Pressed == 1) {
          digitalWrite(red1,HIGH);
        }
        else {
          buttonReset();
        }
      }
     
     
      //Button 2 Press
        button2state = digitalRead(button2);
        if (button2state == 1) {
        b2Pressed = 1;
        if (b1Pressed == 1 ) {
          digitalWrite(red2,HIGH);
          digitalWrite(red,LOW);
          digitalWrite(green,HIGH);
          digitalWrite(red1,LOW);
          digitalWrite(red2,LOW);
          digitalWrite(red3,LOW);
          }
        else {
          buttonReset();
        }
      }
    }

    void buttonReset() {
     
      b1Pressed = 0;
      b2Pressed = 0;
      b3Pressed = 0;
     
      for (int i=0; i<3; i++) {  
        digitalWrite(red1,HIGH);
        digitalWrite(red2,HIGH);
        digitalWrite(red3,HIGH);
        delay(200);
     
        digitalWrite(red1,LOW);
        digitalWrite(red2,LOW);
        digitalWrite(red3,LOW);
        delay(200);
      }
    }  
     
  2. Asper Daffy

    Asper Daffy Иксперд

    А где в этом коде
    ?
     
  3. Blackgeneral

    Blackgeneral Нерд

    Выше рабочий код.
    С массивом я пробовал: задавал изначальный код, например, mas[3]={3,2,1}, а потом пытался сравнивать с данные счетчика нажатий кнопок с элементами массива, но видно совсем запутался и ничего не вышло. Поэтому даже не стал выкладывать сюда.
    Сейчас заново пишу на эту тему алгоритм и потом напишу программу.
     
  4. Asper Daffy

    Asper Daffy Иксперд

    И кому он нужен? Вам надо, что мы на него полюбовались или Вам надо исправить "нерабочий"? Вы бы уж определились.
     
    parovoZZ нравится это.
  5. 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);
      digitalWrite(red,HIGH);
    }

    void loop() {
    count=count+1;

    //Button 1 Press
     
    button1state = digitalRead(button1);
      if (button1state == 1) {
        if (count==1){
          if (massiv[0]==1){
          digitalWrite(red1,HIGH);
          }
          else{
          buttonReset();
          }
        }
         else if (count==2){
           if(massiv[1]==1){
             digitalWrite(red1,HIGH);
           }
           else{
           buttonReset();
           }
         }    
          else if(massiv[2]==1){
          digitalWrite(red1,HIGH);
          }
          else {
          mistake();
          }
        }
      }

         
    //Button 2 Press
     
    button2state = digitalRead(button2);
      if (button2state == 1) {
        if (count==1){
          if (massiv[0]==2){
          digitalWrite(red2,HIGH);
          }
          else{
          buttonReset();
          }
         else if (count==2){
           if(massiv[1]==2){
             digitalWrite(red2,HIGH);
           }
           else{
           buttonReset();
           }
         }    
          else if(massiv[2]==2){
          digitalWrite(red1,HIGH);
          }
          else {
          mistake();
          }
        }
      }
         
         
    //Button 3 Press
     
    button3state = digitalRead(button3);
      if (button3state == 1) {
        if (count==1){
          if (massiv[0]==3){
          digitalWrite(red3,HIGH);
          }
          else{
          buttonReset();
          }
         else if (count==2){
           if(massiv[1]==3){
             digitalWrite(red3,HIGH);
           }
           else{
           buttonReset();
           }
         }    
          else if(massiv[2]==3){
          digitalWrite(red3,HIGH);
          }
          else {
          mistake();
          }
        }
      }    
         
         
    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);
      }
    }
       

      for (int j=0; j<3; j++) {  
       
        digitalWrite(red1,HIGH);
        digitalWrite(red2,HIGH);
        digitalWrite(red3,HIGH);
        delay(200);
     
        digitalWrite(red1,LOW);
        digitalWrite(red2,LOW);
        digitalWrite(red3,LOW);
        delay(200);
      }
     
    Ругаетсятак:

    'button2state' does not name a type

    'j' does not name a type

    Подозреваю, что что-то напутано с глобальными о локальными переменными, но пока не разобрался что.
     
  6. Andy16

    Andy16 Гик

    У тебя loop() кончается перед //Button 2 Press. Ты с фигурными скобками напутал.
     
  7. Blackgeneral

    Blackgeneral Нерд

    Спасибо! Это исправил, но ошибки, о которых написал выше, никуда не делись.
     
  8. Andy16

    Andy16 Гик

    Значит, неправильно исправил.
     
  9. Blackgeneral

    Blackgeneral Нерд

    Я понимаю, что раз ошибки есть, то что-то неправильно. По скобкам пока больше ошибок не нашел.
     
  10. parovoZZ

    parovoZZ Гуру

    Пиши в редакторе с подсветкой синтаксиса и минимальным линтером. А эта шляпа для профи - у кого матчасть от зубов отскакивает.
     
  11. Asper Daffy

    Asper Daffy Иксперд

    Кода после исправления мы так и не увидим? Мы должны верить на слово, что правильно исправил?
     
  12. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Скопипастил и запустил ваш код - там намного хуже. Нарушен синтаксис. А с ним и логика кода. Но попробуем разобраться.
    ПС. Даже если правильно оформить цикл - Эти ваши вложенные If If If else if - без поллитра не разберешься.
     
    Последнее редактирование: 21 май 2024
  13. parovoZZ

    parovoZZ Гуру

  14. Ariadna-on-Line

    Ariadna-on-Line Гуру

    button2state = digitalRead(button2);
    if (button2state == 1) {
    if (count==1){
    if (massiv[0]==2){
    digitalWrite(red2,HIGH);
    }
    else{
    buttonReset();
    }
    else if (count==2){
    if(massiv[1]==2){
    digitalWrite(red2,HIGH);
    }
    else{
    buttonReset();
    }
    }
    else if(massiv[2]==2){
    digitalWrite(red1,HIGH);
    }
    else {
    mistake();
    }
    }
    }
    if (button2state == 1) {
    if (count==1) {
    не имеют альтернативного поведения при других значениях аргументов - тогда их надо объединить в одну команду -
    if ((button2state == 1) && (count == 1)) {
    Как-то так вроде. И в других местах. Упрощайте структуру кода.

    ПС. Во времена DOS-ассемблера считалось неряшливым, если код процедуры (типа того же loop-а) целиком не вмещается в поле экрана. Правильно - резать код на подпрограммы, создавая иерархию. Если это сделано не тупо, то даёт легко-понятный структурированный код. Правда не все програмёры в этом заинтересованы. Чаще - наоборот.
     
    Последнее редактирование: 21 май 2024
  15. Blackgeneral

    Blackgeneral Нерд

    Я сам запутался в этих ифах )))

    Вот сама задача. Может это поможет.

    Отгадать последовательность.

    При нажатии неправильной кнопки или при написании в массиве чисел, отличных от 1,2,3, мигает «ошибка» и идет сброс отсчета для нажатия комбинации заново.

    Если кнопка нажата верно, то загорается светодиод.

    Если все три кнопки нажаты верно, т.е. в правильной последовательности, то загорается зеленый светодиод в RGB.

    А вот алгоритм, который я составил к этой задаче (чтобы не запутаться), но пока это мало помогло.
    4.png

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

    KindMan Гуру

    Здесь логику нужно просто поменять, если ТС потом захочет 5 кнопок. В одну функцию вывести заполненние массива нужной последовательностью цифр, в другую обработку всех кнопок, в третью передача значения для проверки с массивом. А вы привязаны к каждой кнопке. И потом переделывать код - адская задача.
     
  17. parovoZZ

    parovoZZ Гуру

    алгоритм надо проработать, т.к. вот здесь
    upload_2024-5-20_17-34-12.png
    по какому условию происходит выбор ветки?
     
  18. Blackgeneral

    Blackgeneral Нерд

    Нажимается любая кнопка.
     
  19. parovoZZ

    parovoZZ Гуру

    а дальше алгоритм что делает?
     
  20. Blackgeneral

    Blackgeneral Нерд

    Вот алгоритм работы.
    Нажимаем любую кнопку. При нажатии неправильной кнопки или при написании в массиве чисел, отличных от 1,2,3, мигает «ошибка» и идет сброс отсчета и далее ожидание нажатия кнопки.
    Если кнопка нажата верно, то загорается светодиод.
    Если все три кнопки нажаты верно, т.е. в правильной последовательности, то загорается зеленый светодиод в RGB.