Arduino UNO и кнопка.

Тема в разделе "Arduino & Shields", создана пользователем knhoman, 12 фев 2018.

  1. knhoman

    knhoman Нуб

    Добрый вечер.
    Пытаюсь сделать простейший скетч: 9 светодиодов и по нажатию кнопки идет переключение режима свечения - типа гирлянда. Одна возникла проблема: работает только первый режим. Не получается ни через if, ни через switch..case. Причем пытался описывать функции отдельно, и как в скетче сейчас - ничего не помогает. Однако, если в этом скетче сделать, что по нажатию загорается дополнительный диод, то такой вариант работает.
    Подскажите, пожалуйста, в чем может быть проблема?

    Код (C++):
    int ledPins[] = {2,3,4,5,6,7,8,9,10};
    int button = 11;
    int count;
    int index = 0;
    int delayTime = 750;

    void setup()
    {
      int index;
     
      pinMode(button, INPUT);

      for(index = 0; index <= 8; index++)
      {
        pinMode(ledPins[index],OUTPUT);
      }
    }

    void loop()
    {

      int c = 0;

      if (digitalRead(button) == HIGH && c == 0)
        {
          c = 1;
        }
       
      if (digitalRead(button) == LOW && c == 1)
        {
          count = count + 1;
          if (count == 6)
          {
            count = 1;
          }
          c = 0;
        }

        if (count == 1)
        {

             index = 0;

             for(index = 0; index <= 8; index++)
             {
                digitalWrite(ledPins[index], HIGH);
                delay(delayTime);              
             }                                
             for(index = 8; index >= 0; index--)
             {
                digitalWrite(ledPins[index], LOW);
                delay(delayTime);
             }            
        }

        if (count == 2)
        {

             index = 0;
             
             for(index = 0; index <= 8; index++)
             {
                digitalWrite(ledPins[index], HIGH);
                delay(delayTime);                  
                digitalWrite(ledPins[index], LOW);
             }
        }

        if (count == 3)
        {

             index = 0;
           
             for(index = 0; index <= 8; index++)
             {
                digitalWrite(ledPins[index], HIGH);
                delay(delayTime);                
                digitalWrite(ledPins[index], LOW);
             }
     
             for(index = 8; index >= 0; index--)
             {
                digitalWrite(ledPins[index], HIGH);
                delay(delayTime);                
                digitalWrite(ledPins[index], LOW);
             }
        }

        if (count == 4)
        {

             index = 0;
           
             for(index = 0; index <= 4; index++)
             {
                digitalWrite(ledPins[index], HIGH);
                digitalWrite(ledPins[index+4], HIGH);
                delay(delayTime);                  
                digitalWrite(ledPins[index], LOW);    
                digitalWrite(ledPins[index+4], LOW);
             }
        }

        if (count == 5)
        {
         
             index = random(9);
     
             digitalWrite(ledPins[index], HIGH);
             delay(delayTime);                  
             digitalWrite(ledPins[index], LOW);
        }

    }
     
  2. Пушной звер

    Пушной звер Оракул

    в цикле, так и должно?
     
  3. knhoman

    knhoman Нуб

    Не совсем понял вопрос. Разве в цикле? Просто в void loop {} ее объявил.
     
  4. DIYMan

    DIYMan Гуру

    Вынесите int c наружу loop - вам об этом говорят. Она у вас каждый раз при заходе в loop сбрасывается в 0, соответственно, неправильно работает учёт нажатой кнопки.
     
  5. mcureenab

    mcureenab Гуру

    Или добавить модификатор static


    Код (C++):
    static int c = 0;
    Чтобы не засорять пространство глобальных переменных.
     
    Сусемьбек нравится это.
  6. mcureenab

    mcureenab Гуру

    Функция loop это по сути тело бесконечного цикла.
     
  7. knhoman

    knhoman Нуб

    А, понял.
    Я, в общем, так и сделал сразу, но результата никакого.
     
  8. mcureenab

    mcureenab Гуру

    Есть еще загвоздка.
    Пока гирлянда отрабатывает цикл программы переключений, она не воспринимает состояние кнопки.
    Кнопку нужно долго держать.
     
  9. Пушной звер

    Пушной звер Оракул

    а как она вообще обрабатывается?
    в режимах есть delayTime, который останавливает программу, счего бы в этот момент кнопки работали?
     
  10. knhoman

    knhoman Нуб

    Вот, кстати, об этом думал, но сколько примеров ни смотрел, нигде про это не говорится, все и так работало.
    Ну а раз каждая программа выполняется бесконечно, по сути, есть ли какой-то способ следить за нажатием кнопки?
     
  11. mcureenab

    mcureenab Гуру

    Можно на кнопку прерывание повесить.
    И
    Код (C++):
    volatile int count;
    из прерывания менять.
     
  12. b707

    b707 Гуру

    Для этого в программе не должно быть операторов delay() Вам надо прочитать про работу со временем с помощью millis().