Блок с датойБлок с временемБлок с возрастом сайта
Mr.ALB

    Анатолий Беляев (aka Mr.ALB). Персональный сайт

    Да пребудут с вами Силы СВЕТА!

     

    Ардуино (Arduino). #1

    Меняем яркость светодиода плавно

    Ниже рассмотрим пример использования выходов с ШИМ (PWM) для управления яркостью светодиода.

    Как-то, при изучении программирования Ардуино на просторах Интернета, наткнулся на такой вопрос пользователя Николая (орфография сохранена):

    Здравствуйте)))
    Подскажите пожалуйста новечьку,
    Как можно реализовать такой скечь
    При нажатии на кнопку светодиод плавно загорается
    если нажать ещё раз на кнопку то светодиод плавно тухнет…?
          

    Итак, вот скетч, который реализует это: по нажатии на кнопку, медленное повышение яркости светодиода до максимального, а при повторном нажатии на кнопку – медленное снижение яркости до полного гашения. Чтобы видеть законченность процесса изменения яркости – сделал сигнализацию через встроенный светодиод на pin13, поэтому в начальных настройках его гашу.

    Для реализации такой программы потребуется светодиод VD1(HL1) (любой), ограничивающий резистор R1 на 330...1000 Ом, кнопка SB1 (любая), стягивающий резистор R2 на 10...18 кОм.

    Последовательное соединение светодиода VD1(HL1) и R1 подключается между контактами Ардуино pin11 и GND. Можно использовать любой другой pin, из тех, что имеют возможность выводить ШИМ (PWM) – это контакты (на Arduino UNO) 3, 5, 6, 9, 10, 11, отмеченные на плате значком тильды ~.

    Схема для скетча #1
    Pic 1. Схема для скетча #1

    Кнопка одним контактом подключена к +5V, а второй контакт к стягивающему резистору. От их соединения идёт подключение к контакту pin2. Второй свободный вывод резистора подключен к контакту GND.

    Реализация скетча #1
    Pic 2. Реализация скетча #1

    Для макетирования удобно использовать макетные панельки (Breadboard).

    Макетные панельки (Breadboard)
    Pic 3. Макетные панельки (Breadboard)

    Ниже приведён скетч:

    /**********************************************************************
     * 2018-02-26 Mr.ALB Тренировка в программировании Ардуино
    **********************************************************************/
    // Переменные с пинами подключенных устройств
    int buttonPin = 2;// Подключаем кнопку SB1 на 2-й pin
    // Подключаем светодиод на 11-й pin, можно на любой с PWM
    int ledPin = 11;
    
    // Переменные для хранения состояния кнопки и светодиода
    boolean lastButton = LOW;
    boolean currentButton = LOW;
    int ledLevel = 0;
    
    // Настройка изменения яркости
    int deltaLevel = 10; // Шаг изменения яркости
    int sign = 1;        // Знак шага
    int step_delay = 120;// Здержка в шаге изменения яркости светодиода
    
    // Настройка сигнализатора окончания изменения яркости
    int max_blink = 3;    // Число морганий светодиода на pin13 (LED_BUILTIN)
    int blink_delay = 500;// Задержка состояния светодиода на pin13
    
    /**********************************************************************
     * Настроечная функция, выполняется один раз вначале
    **********************************************************************/
    void setup()
    {
     pinMode(buttonPin, INPUT);
     pinMode(ledPin, OUTPUT);
     pinMode(LED_BUILTIN, OUTPUT);
    // Потушим светодиод на pin13 (LED_BUILTIN)
     digitalWrite(LED_BUILTIN, LOW);
    }
    
    /**********************************************************************
     * Функция постоянно повторяется
     * При нажатии на кнопку, светодиод медленно увеличивает яркость
     * При повторном нажатии на кнопку, светодиод медленно гаснет
    **********************************************************************/
    void loop()
    {
     currentButton = debounce(lastButton);// Опрос кнопки
     if(lastButton == LOW && currentButton == HIGH)
     {
      if(ledLevel == 0) sign = 1;
      if(ledLevel == 255) sign = -1;
      // Изменяем яркость светодиода
      fn_stepBrightness(step_delay,deltaLevel,sign);
      // Сигнализируем об окончании изменения
      fn_blink(max_blink, blink_delay);
     }
     lastButton = currentButton;// Переписываем состояние кнопки
    }
    
    /**********************************************************************
     * Функция для подавления дребезга
    **********************************************************************/
    boolean debounce(boolean last)
    {
     boolean current = digitalRead(buttonPin);// Читаем состояние кнопки
     if(last != current)
     {
      delay(5);
      current = digitalRead(buttonPin);
     }
     return current;
    }
    
    /**********************************************************************
     * Функция сигнализации окончания цикла изменения яркости светодиода
    **********************************************************************/
    void fn_blink(int blink_max, int blink_delay)
    {
     for(int i = 0; i < blink_max; i++)
     {
      digitalWrite(LED_BUILTIN, HIGH);
      delay(blink_delay);
      digitalWrite(LED_BUILTIN, LOW);
      delay(blink_delay);
     }
    }
    
    /**********************************************************************
     * Функция изменения яркости светодиода
    **********************************************************************/
    void fn_stepBrightness(int step_delay, int deltaLevel, int sign)
    {
     for(int i = 0; i < (int(256 / deltaLevel) + 1); i++)
     {
      ledLevel = ledLevel + deltaLevel * sign;
      if(ledLevel > 255) ledLevel = 255;
      if(ledLevel < 0) ledLevel = 0;
      delay(blink_delay);
      analogWrite(ledPin, ledLevel);
      delay(step_delay);
     }
    }
    
    

    Данный пример мною подробно закоментирован и, надеюсь, всё понятно. Конечно можно делать по другому, можно удалить лишнее и код будет меньше. Тут лишь вариант управления яркостью светодиода через ШИМ.

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

    /**********************************************************************
     *  При нажатии на кнопку, светодиод медленно увеличивает яркость
     *  а потом медленно гаснет
    **********************************************************************/
    void loop()
    {
     currentButton = debounce(lastButton);// Опрос кнопки
     if(lastButton == LOW && currentButton == HIGH)
     {
      fn_stepBrightness(step_delay,deltaLevel,1);// Зажигается
      fn_stepBrightness(step_delay,deltaLevel,-1);// Тухнет
      // Сигнализируем об окончании изменения
      fn_blink(max_blink, blink_delay);
     }
     lastButton = currentButton;// Переписываем состояние кнопки
    }
    
    

    Для расширения возможностей этого примера, можно добавить ещё кнопку и по её нажатию можно будет выбирать режим работы светодиода: 1) как в базовом варианте, 2) как в дополнительном, т.е. совместить обе модификации в одной реализации. А если кому и этого мало улыбка, то можно добавить ещё кнопочку или пару, и управлять через них задержками изменения яркости светодиода (гирлянды светодиодов, при использовании внешних источников).

    В приведённом выше скетче использована функция debounce() для устранения дребезга кнопки, при её нажимании. Взял где-то в Интернете или в примерах в Arduino IDE.


    . Mr.ALB
    Предыдущая страница Страница 2 Далее