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().