Работа с кнопкой Режим переключения работы Нет части кода

Тема в разделе "Arduino & Shields", создана пользователем s3564076, 16 дек 2017.

  1. s3564076

    s3564076 Нуб

    Проект состоит в том что при нажатии кнопки меняется режим мигания. Получается как гирлянда.
    Большую часть я уже написал но не хватает той части кода где при нажатии кнопки меняется значение n и меняется режим мигания. Я пробовал написать но не получается, режимы менялись сами по себе а кнопка вообще не на что не влияла. Помогите кто может. Если кто-то увидит ошибки и знает как надо или как лучше то пишите. Сам работать с Ардуино работаю недавно и поэтому не всё получается



    Код (C++):
    int n=1;
    void setup() {
      pinMode(3, OUTPUT);
      pinMode(4, OUTPUT);
      pinMode(5, OUTPUT);
      pinMode(6, OUTPUT);
      pinMode(7, OUTPUT);
      pinMode(8, OUTPUT);
      pinMode(2, INPUT_PULLUP);
    }
    void loop() {
       if (тут нужен код нажатия кнопки) {
           ++n;
           if (n>5) n=1;
       }
        switch(n) {
           case 1:
      digitalWrite(3, HIGH);   // Подаем на вывод 3 логическую единицу,
      delay(500);            
      digitalWrite(3, LOW);    // Подаем на вывод 3 логический ноль,
      delay(500);            
      digitalWrite(4, HIGH);   // Подаем на вывод 4 логическую единицу,
      delay(500);            
      digitalWrite(4, LOW);    // Подаем на вывод 4 логический ноль,
      delay(500);            
      digitalWrite(5, HIGH);   // Подаем на вывод 5 логическую единицу,
      delay(500);            
      digitalWrite(5, LOW);    // Подаем на вывод 5 логический ноль,
      delay(500);            
      digitalWrite(6, HIGH);   // Подаем на вывод 6 логическую единицу,
      delay(500);            
      digitalWrite(6, LOW);    // Подаем на вывод 6 логический ноль,
      delay(500);            
      digitalWrite(7, HIGH);   // Подаем на вывод 7 логическую единицу,
      delay(500);            
      digitalWrite(7, LOW);    // Подаем на вывод 7 логический ноль,
      delay(500);        
      digitalWrite(8, HIGH);   // Подаем на вывод 8 логическую единицу,
      delay(500);            
      digitalWrite(8, LOW);    // Подаем на вывод 8 логический ноль,
      delay(500);    
               break;
           case 2:
      digitalWrite(3, HIGH);  
      delay(200);            
      digitalWrite(4, HIGH);  
      delay(200);            
      digitalWrite(5, HIGH);  
      delay(200);            
      digitalWrite(6, HIGH);  
      delay(200);            
      digitalWrite(7, HIGH);
      delay(200);
      digitalWrite(8, HIGH);  
      delay(200);            
      digitalWrite(8, LOW);              
      delay(200);            
      digitalWrite(7, LOW);  
      delay(200);            
      digitalWrite(6, LOW);  
      delay(200);            
      digitalWrite(5, LOW);  
      delay(200);            
      digitalWrite(4, LOW);  
      delay(200);            
      digitalWrite(3, LOW);  
      delay(200);
               break;
           case 3:
      digitalWrite(3, HIGH);  
      digitalWrite(4, HIGH);  
      digitalWrite(5, HIGH);  
      digitalWrite(6, HIGH);
      digitalWrite(7, HIGH);
      digitalWrite(8, HIGH);
      delay(1000);            
      digitalWrite(3, LOW);  
      digitalWrite(4, LOW);  
      digitalWrite(5, LOW);  
      digitalWrite(6, LOW);  
      digitalWrite(7, LOW);
      digitalWrite(8, LOW);
      delay(1000);          
      digitalWrite(3, HIGH);  
      digitalWrite(4, HIGH);  
      digitalWrite(5, HIGH);  
      digitalWrite(6, HIGH);  
      digitalWrite(7, HIGH);
      digitalWrite(8, HIGH);
      delay(1000);            
      digitalWrite(3, LOW);  
      digitalWrite(4, LOW);  
      digitalWrite(5, LOW);  
      digitalWrite(6, LOW);  
      digitalWrite(7, LOW);
      digitalWrite(8, LOW);
      delay(1000);
               break;
           case 4:
      digitalWrite(3, HIGH);  
      delay(100);            
      digitalWrite(3, LOW);  
      delay(100);            
      digitalWrite(4, HIGH);  
      delay(100);            
      digitalWrite(4, LOW);  
      delay(100);            
      digitalWrite(5, HIGH);  
      delay(100);            
      digitalWrite(5, LOW);  
      delay(100);            
      digitalWrite(6, HIGH);  
      delay(100);            
      digitalWrite(6, LOW);  
      delay(100);            
      digitalWrite(7, HIGH);  
      delay(100);            
      digitalWrite(7, LOW);
      delay(100);
      digitalWrite(8, HIGH);  
      delay(100);            
      digitalWrite(8, LOW);  
      delay(100);            
      digitalWrite(7, HIGH);  
      delay(100);            
      digitalWrite(7, LOW);  
      delay(100);              
      digitalWrite(6, HIGH);  
      delay(100);            
      digitalWrite(6, LOW);  
      delay(100);            
      digitalWrite(5, HIGH);  
      delay(100);            
      digitalWrite(5, LOW);  
      delay(100);            
      digitalWrite(4, HIGH);  
      delay(100);            
      digitalWrite(4, LOW);  
      delay(100);            
      digitalWrite(3, HIGH);  
      delay(100);            
      digitalWrite(3, LOW);  
      delay(100);  
               break;
           case 5:
      digitalWrite(3, HIGH);  
      digitalWrite(8, HIGH);
      delay(200);            
      digitalWrite(4, HIGH);  
      digitalWrite(7, HIGH);  
      delay(200);            
      digitalWrite(5, HIGH);  
      digitalWrite(6, HIGH);  
      delay(200);                  
      digitalWrite(3, LOW);  
      digitalWrite(4, LOW);  
      digitalWrite(5, LOW);  
      digitalWrite(6, LOW);  
      digitalWrite(7, LOW);
      digitalWrite(8, LOW);
      delay(1000);
               break;          
             
        }
      }
     
     
  2. akl

    akl Гуру

  3. MihaNN52

    MihaNN52 Нерд

    Код (C++):
    int n = 1;
    void setup() {
        pinMode(3, OUTPUT);
        pinMode(4, OUTPUT);
        pinMode(5, OUTPUT);
        pinMode(6, OUTPUT);
        pinMode(7, OUTPUT);
        pinMode(8, OUTPUT);
        pinMode(2, INPUT_PULLUP);
        attachInterrupt(0, switch_button, FALLING); //настройка прерывания
        // когда возникает прерывание контроллер останавливает то что делал и
        // начинает делать то что указано в функции обработчика прерываний
        // как будто ты читал стихи, у тебя спросили сколько времени ты ответил и продолжил читать их дальше))
        // 0 это второй пин на уно если контроллер другой то смотри описание к контроллеру.
        // название функции switch_button она ниже
        // FALLING прерывание вызывается только при смене значения на порту с HIGH на LOW
        //LOW вызывает прерывание, когда на порту LOW
        //CHANGE прерывание вызывается при смене значения на порту, с LOW на HIGH и наоборот
        //RISING прерывание вызывается только при смене значения на порту с LOW на HIGH
        // http://arduino.ru/Reference/AttachInterrupt
        // т.к кнопка подтянута к питанию pinMode(2, INPUT_PULLUP); регистрируем ка раз падение - FALLING
    }
    void switch_button() { // функция обработчика прерываний
    // в нем краткость сестра таланта, надо быстро что то делать и заниматься дальше програмой.
        ++n;
        // вот и не будем выделяться

    }
    void loop() {

        if (n > 5)// все что осталось ограничить режимы
        // на самом деле надо уходить от delay но это уже другая история
            n = 1;

        switch (n) {
        case 1:
            digitalWrite(3, HIGH); // Подаем на вывод 3 логическую единицу,
            delay(500);
            digitalWrite(3, LOW); // Подаем на вывод 3 логический ноль,
            delay(500);
            digitalWrite(4, HIGH); // Подаем на вывод 4 логическую единицу,
            delay(500);
            digitalWrite(4, LOW); // Подаем на вывод 4 логический ноль,
            delay(500);
            digitalWrite(5, HIGH); // Подаем на вывод 5 логическую единицу,
            delay(500);
            digitalWrite(5, LOW); // Подаем на вывод 5 логический ноль,
            delay(500);
            digitalWrite(6, HIGH); // Подаем на вывод 6 логическую единицу,
            delay(500);
            digitalWrite(6, LOW); // Подаем на вывод 6 логический ноль,
            delay(500);
            digitalWrite(7, HIGH); // Подаем на вывод 7 логическую единицу,
            delay(500);
            digitalWrite(7, LOW); // Подаем на вывод 7 логический ноль,
            delay(500);
            digitalWrite(8, HIGH); // Подаем на вывод 8 логическую единицу,
            delay(500);
            digitalWrite(8, LOW); // Подаем на вывод 8 логический ноль,
            delay(500);
            break;
        case 2:
            digitalWrite(3, HIGH);
            delay(200);
            digitalWrite(4, HIGH);
            delay(200);
            digitalWrite(5, HIGH);
            delay(200);
            digitalWrite(6, HIGH);
            delay(200);
            digitalWrite(7, HIGH);
            delay(200);
            digitalWrite(8, HIGH);
            delay(200);
            digitalWrite(8, LOW);
            delay(200);
            digitalWrite(7, LOW);
            delay(200);
            digitalWrite(6, LOW);
            delay(200);
            digitalWrite(5, LOW);
            delay(200);
            digitalWrite(4, LOW);
            delay(200);
            digitalWrite(3, LOW);
            delay(200);
            break;
        case 3:
            digitalWrite(3, HIGH);
            digitalWrite(4, HIGH);
            digitalWrite(5, HIGH);
            digitalWrite(6, HIGH);
            digitalWrite(7, HIGH);
            digitalWrite(8, HIGH);
            delay(1000);
            digitalWrite(3, LOW);
            digitalWrite(4, LOW);
            digitalWrite(5, LOW);
            digitalWrite(6, LOW);
            digitalWrite(7, LOW);
            digitalWrite(8, LOW);
            delay(1000);
            digitalWrite(3, HIGH);
            digitalWrite(4, HIGH);
            digitalWrite(5, HIGH);
            digitalWrite(6, HIGH);
            digitalWrite(7, HIGH);
            digitalWrite(8, HIGH);
            delay(1000);
            digitalWrite(3, LOW);
            digitalWrite(4, LOW);
            digitalWrite(5, LOW);
            digitalWrite(6, LOW);
            digitalWrite(7, LOW);
            digitalWrite(8, LOW);
            delay(1000);
            break;
        case 4:
            digitalWrite(3, HIGH);
            delay(100);
            digitalWrite(3, LOW);
            delay(100);
            digitalWrite(4, HIGH);
            delay(100);
            digitalWrite(4, LOW);
            delay(100);
            digitalWrite(5, HIGH);
            delay(100);
            digitalWrite(5, LOW);
            delay(100);
            digitalWrite(6, HIGH);
            delay(100);
            digitalWrite(6, LOW);
            delay(100);
            digitalWrite(7, HIGH);
            delay(100);
            digitalWrite(7, LOW);
            delay(100);
            digitalWrite(8, HIGH);
            delay(100);
            digitalWrite(8, LOW);
            delay(100);
            digitalWrite(7, HIGH);
            delay(100);
            digitalWrite(7, LOW);
            delay(100);
            digitalWrite(6, HIGH);
            delay(100);
            digitalWrite(6, LOW);
            delay(100);
            digitalWrite(5, HIGH);
            delay(100);
            digitalWrite(5, LOW);
            delay(100);
            digitalWrite(4, HIGH);
            delay(100);
            digitalWrite(4, LOW);
            delay(100);
            digitalWrite(3, HIGH);
            delay(100);
            digitalWrite(3, LOW);
            delay(100);
            break;
        case 5:
            digitalWrite(3, HIGH);
            digitalWrite(8, HIGH);
            delay(200);
            digitalWrite(4, HIGH);
            digitalWrite(7, HIGH);
            delay(200);
            digitalWrite(5, HIGH);
            digitalWrite(6, HIGH);
            delay(200);
            digitalWrite(3, LOW);
            digitalWrite(4, LOW);
            digitalWrite(5, LOW);
            digitalWrite(6, LOW);
            digitalWrite(7, LOW);
            digitalWrite(8, LOW);
            delay(1000);
            break;

        }
    }
     
     
  4. akl

    akl Гуру

    ну или так с прерываниями. Но тогда количество кнопок (в случае уно) будет не более двух.
    И в любом случае лучше сразу научиться обходиться без дилеев.
     
  5. s3564076

    s3564076 Нуб

    Спасибо код рабочий. Только для того чтобы поменялись режимы приходится размыкать и замыкать цепь светодиодов, а изначально планировалось что лампочки не трогаем а ардуино напрямую считывает нажатия кнопки.
    А как тогда можно написать код без delay. Есть другая функция вместо неё или как?
     
  6. akl

    akl Гуру

    неочень понятно - это как? в том варианте режим (в виде циферки) должен меняться в прерывании, а соответствующий алгоритм мигания диодов должен запускаться после того как закончится цикл предыдущего, (из-за дилеев)
    есть функция millis(), которая возвращает количество миллисекунд, прошедшее с момента включения процессора.