Помогите исправить скетч.

Тема в разделе "Arduino & Shields", создана пользователем Alex-26rus, 28 сен 2016.

  1. Alex-26rus

    Alex-26rus Нерд

    Здравствуйте уважаемые форумчане!
    Помогите пожалуйста исправить (дописать) скетч.
    Идея такая: при нажатии и удержании кнопки, светодиод горит с минимальной яркостью. Отпускаем кнопку- светодиод гаснет, нажимаем (и удерживаем) снова- светодиод горит ярче и т.д по кругу.
    Задача сделать так, чтоб условие выполнения цикла выполнялось в том случае, если пауза между нажиманиями кнопки была не более 1 секунды. Если пауза более одной секунды, то независимо в каком предидущем состоянии яркости был светодиод, он зажигался с минимальной яркостью. Типа цикл начинается сначала.
    Вот сам скетч:

    int switchPin = 10;
    int ledPin = 11;
    boolean lastButton = LOW;
    int ledLevel = 0; //
    boolean currentButton = LOW;
    int stepp = 51;
    void setup()
    {
    pinMode(switchPin, INPUT);
    pinMode(ledPin, OUTPUT);
    }

    boolean debounce(boolean last)
    {
    boolean current = digitalRead(switchPin);
    if (last != current)
    {
    delay(5);
    current = digitalRead(switchPin);
    }
    return current;
    }

    void loop()
    {
    currentButton = debounce(lastButton);
    if (lastButton == LOW && currentButton == HIGH)
    {
    ledLevel = ledLevel + stepp; // Меняем значение яркости на stepp
    }
    lastButton = currentButton;

    if (ledLevel > 255) ledLevel = stepp; // Ограничиваем макс. значение в 255
    // и вместо нуля включаем мин яркость

    if (currentButton==HIGH) analogWrite(ledPin, ledLevel);
    // эта строчка будет зажигать светодиод с нужной яркостью
    //но только если кнопка нажата
    else analogWrite(ledPin, 0);
    // а иначе выключаем все
    }
     
  2. ostrov

    ostrov Гуру

    Пользуйтесь тэгами для кода.
     
  3. Alex-26rus

    Alex-26rus Нерд

    что за теги???
     
  4. ostrov

    ostrov Гуру

    Над окном куда вы пишите сообщение есть тэг для кода, слева от кавычек. Используйте его.
     
  5. Максимус-Бог

    Максимус-Бог Убийца матрёшек

    [ code=cpp] тут код на языке C++
    // пробелы убрать надо
    [ /code]

    В ардуино IDE есть функция "копировать для форума" (CTRL + SHIFT + C)
     
  6. Alex-26rus

    Alex-26rus Нерд

    Код (C++):
    int switchPin = 10;
    int ledPin = 11;
    boolean lastButton = LOW;
    int ledLevel = 0; //
    boolean currentButton = LOW;
    int stepp = 51;
    void setup()
    {
    pinMode(switchPin, INPUT);
    pinMode(ledPin, OUTPUT);
    }

    boolean debounce(boolean last)
    {
    boolean current = digitalRead(switchPin);
    if (last != current)
    {
    delay(5);
    current = digitalRead(switchPin);
    }
    return current;
    }

    void loop()
    {
    currentButton = debounce(lastButton);
    if (lastButton == LOW && currentButton == HIGH)
    {
    ledLevel = ledLevel + stepp; // Меняем значение яркости на stepp
    }
    lastButton = currentButton;

    if (ledLevel > 255) ledLevel = stepp; // Ограничиваем макс. значение в 255
    // и вместо нуля включаем мин яркость

    if (currentButton==HIGH) analogWrite(ledPin, ledLevel);
    // эта строчка будет зажигать светодиод с нужной яркостью
    //но только если кнопка нажата
    else analogWrite(ledPin, 0);
    // а иначе выключаем все
    }
     
    ostrov нравится это.
  7. ostrov

    ostrov Гуру

    Еще бы предварительно автовыравнивание сделать, так вообще красота! Но и так сойдет.
     
  8. ostrov

    ostrov Гуру

    Теперь напишите что работает а что не работает. Упростите нам задачу.
     
  9. Alex-26rus

    Alex-26rus Нерд

    Задача сделать так, чтоб условие выполнения цикла выполнялось в том случае, если пауза между нажиманиями кнопки была не более 1 секунды. Если пауза более одной секунды, то независимо в каком предидущем состоянии яркости был светодиод, он зажигался с минимальной яркостью. Типа цикл начинается сначала.
     
  10. ostrov

    ostrov Гуру

    Сколько всего градаций яркости должно быть? То есть сколько раз нужно правильно нажать чтобы светодиод загорелся максимально ярко. И что должно произойти после этого? Цикл начнется сначала или что?
     
  11. Максимус-Бог

    Максимус-Бог Убийца матрёшек

    Код (C++):
    bool CheckButton()
    {
    bool CheckButton()
    {
        if(!(digitalRead(BUTTONPIN))) return false;
        unsigned long time = millis();
        while(digitalRead(BUTTONPIN))
        {
            while(!(digitalRead(BUTTONPIN)){}
        }
        if (millis() - time < 1000)
            return true;
        else
            return false;
    }
    }
    Функция проверки кнопки.
     
    Tomasina и Alex-26rus нравится это.
  12. Alex-26rus

    Alex-26rus Нерд

    Градаций будет пять, или шесть или три... это не важно. Значение 51 изменить не проблемма. и после самого яркого включения светодиода, при след нажатии, он загорается с минимальной яркостью, цикл начинается сначала.
     
  13. ostrov

    ostrov Гуру

    Не знаю даже как помочь. Мне править чужой код, тем более с чуждой обработкой дребезга, не хочется вообще. Проще свой написать.
     
    Alex-26rus нравится это.
  14. Alex-26rus

    Alex-26rus Нерд

    даже не знаю что на это ответить...:(
     
  15. fogary

    fogary Гик

    Сразу предупреждаю, код на работоспособность не проверял.
    Код (C++):
    void loop() {
      static unsigned long prev_millis = 0;

      currentButton = debounce(lastButton);
     
      if (currentButton != lastButton) {
        if (currentButton == HIGH) {
          if ( (millis() - prev_millis <= 1000) && (ledLevel + stepp <= 255)) {
            ledLevel = ledLevel + stepp; // Меняем значение яркости на stepp
          } else {
            ledLevel = stepp;
          }
        } else {
          ledLevel = 0;
          prev_millis = millis();
        }
       
        lastButton = currentButton;
      }

      analogWrite(ledPin, ledLevel);
    }
     
  16. Alex-26rus

    Alex-26rus Нерд

    Всё получилось! Всем БОЛЬШОЕ спасибо!!!
    Кажется разобрался... сделал вот так и всё заработало.
    Код (C++):
    int switchPin = 10;
    int ledPin = 11;
    boolean lastButton = LOW;
    int ledLevel = 0; //
    boolean currentButton = LOW;
    int stepp = 85;

    void setup()
    {
    pinMode(switchPin, INPUT);
    pinMode(ledPin, OUTPUT);
    }

    boolean debounce(boolean last)
    {
    boolean current = digitalRead(switchPin);
    if (last != current)
    {
    delay(5);
    current = digitalRead(switchPin);
    }
    return current;
    }

    void loop()
    {
    static long unsigned lastButtonPressedTime = 0;
    if (millis() - lastButtonPressedTime > 1000) ledLevel = 0;
    currentButton = debounce(lastButton);
    if (lastButton == LOW && currentButton == HIGH)
    {
    lastButtonPressedTime = millis();
    ledLevel = ledLevel + stepp; // Меняем значение яркости на stepp
    }
    lastButton = currentButton;

    if (ledLevel > 255) ledLevel = stepp; // Ограничиваем макс. значение в 255
    // и вместо нуля включаем первую скорость
    if (currentButton==HIGH) analogWrite(ledPin, ledLevel);
    // эта строчка будет зажигать светодиод с нужной яркостью
    //но только если кнопка нажата
    else analogWrite(ledPin, 0);
    // а иначе выключаем все
    }
     
  17. Alex-26rus

    Alex-26rus Нерд

    Всё. Проблемма решена. Код написан заново и подругому. Спасибо OSTROV!!!:)
    Тему можно закрывать.
     
    Последнее редактирование: 30 сен 2016