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

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

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

     

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

    Управляем кодом программы через внешнюю кнопку

    В прошлом примере #1, на предыдущей странице, предложил совместить в скетче два варианта управления светодиодом. Получается, что добавив внешнюю кнопку, по её нажатию, мы будем управлять кодом скетча (программы). Ниже рассмотрим этот пример.

    Начнём с того, что добавим в схему ещё кнопку SB2, сигнал с который мы будем подавать на pin4. Для этой кнопки так же добавим стягивающий резистор R3 на 10...18 кОм. Схема представлена на рисунке ниже.

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

    Кнопка SB2 одним контактом подключена к +5V, а второй контакт к стягивающему резистору R3. От их соединения идёт подключение к контакту pin4. Второй свободный вывод резистора R3 подключен к контакту GND. Светодиод VD1(HL1) подключаем через ограничивающий резистор 330...1000 Ом.

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

    Всё, подключения сделаны, переходим к программе.

    Добавим в скетч переменную switchPin, которая будет определять pin для управления режимами работы светодиода.

    Добавим переменные currentSwitch и lastSwitch для хранения состояния этой переключающей кнопки. Добавим переменную flag, через неё мы будем переключать код программы.

    В настроечную функцию setup() добавим инициализацию новой кнопки, определив её как вход (INPUT). В рабочей функции loop() мы совместим коды разных режимов работы светодиода.

    В начале работы функции loop() мы опрашиваем кнопку выбора режима, и если она была нажата, то выбираем тот код программы, который будет задавать определённый режим работы кнопки SB1, управляющей работой светодиода.

    Так как у нас всего два режима работы светодиода, то достаточно использовать конструкцию if-else.

    Вот полный скетч, его можно скопировать и вставить в свой Arduino IDE:

    /**********************************************************************
     * 2018-03-11 Mr.ALB Тренировка в программировании Ардуино
    **********************************************************************/
    // Переменные с пинами подключенных устройств
    int buttonPin = 2;// Подключаем кнопку SB1 на 2-й pin
    int switchPin = 4;// Подключаем кнопку SB2 на 4-й pin
    // Подключаем светодиод на 5-й pin, можно на любой с PWM
    int ledPin = 5;
    
    // Переменные для хранения состояния кнопки и светодиода
    boolean lastButton = LOW;
    boolean currentButton = LOW;
    boolean lastSwitch = false;
    boolean currentSwitch = false;
    boolean flag = false;// Изначально установлен 1-й режим
    int ledLevel = 0;
    
    // Настройка изменения яркости
    int deltaLevel = 10; // Шаг изменения яркости
    int sign = 1;        // Знак шага
    int step_delay = 120;// Здержка в шаге изменения яркости светодиода
    
    // Настройка сигнализатора окончания изменения яркости
    int max_blink = 3;    // Число морганий светодиода на pin13 (LED_BUILTIN)
    int blink_delay = 250;// Задержка состояния светодиода, немного уменьшил
    
    /**********************************************************************
     * Настроечная функция, выполняется один раз вначале
    **********************************************************************/
    void setup()
    {
     pinMode(buttonPin, INPUT);
     pinMode(switchPin, INPUT);// Pin устанавливаем как вход
     pinMode(ledPin, OUTPUT);
     pinMode(LED_BUILTIN, OUTPUT);
    // Потушим светодиод на pin13 (LED_BUILTIN)
     digitalWrite(LED_BUILTIN, LOW);
    }
    
    /**********************************************************************
     * При нажатии на кнопку SB1:
     * Режим 1: Светодиод медленно увеличивает яркость
     *          При повторном нажатии на кнопку, светодиод медленно гаснет.
     * Режим 2: Светодиод медленно увеличивает яркость до максимума,
     *          а затем уменьшает яркость до полного потухания.
     * При нажатии на кнопку SB2 происходит смена режимов действия кнопки SB1
     *  
    **********************************************************************/
    void loop()
    {
     currentSwitch = fn_debounce(lastSwitch,switchPin);// Опрос кнопки SB2
    // Переключаем режимы работы программы
     if(lastSwitch == LOW && currentSwitch == HIGH)
     {
      if(flag == false) flag = true;
      else flag = false;
      fn_blink(1, blink_delay);// Сигнализируем о смене режима программы
     }
    
     currentButton = fn_debounce(lastButton,buttonPin);// Опрос кнопки SB1
     // Управляем работой светодиода по указанному режиму
     if(lastButton == LOW && currentButton == HIGH)
     {
      if(flag)
      {
        if(ledLevel == 0) sign = 1;
        if(ledLevel == 255) sign = -1;
        // Изменяем яркость светодиода
        fn_stepBrightness(step_delay,deltaLevel,sign);
      }
      else
      {
        fn_stepBrightness(step_delay,deltaLevel,1);// Зажигается
        fn_stepBrightness(step_delay,deltaLevel,-1);// Тухнет
      }
      // Сигнализируем об окончании изменения
      fn_blink(max_blink, blink_delay);
     }
     lastButton = currentButton;// Переписываем состояние кнопки SB1
     lastSwitch = currentSwitch;// Переписываем состояние кнопки SB2
    }
    
    /**********************************************************************
     * Функция для подавления дребезга
     * Модифицирована, добавлен опрос конкретного pin-а
    **********************************************************************/
    boolean fn_debounce(boolean last,int btnPin)
    {
     boolean current = digitalRead(btnPin);// Читаем состояние кнопки
     if(last != current)
     {
      delay(5);
      current = digitalRead(btnPin);
     }
     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;
      ledLevel = constrain(ledLevel, 0, 255);// Ограничиваем диапазон значений
      delay(blink_delay);
      analogWrite(ledPin, ledLevel);
      delay(step_delay);
     }
    }
    
    

    Как вы видели, в скетче немного модифицировал функцию устранения дребезга debounse в fn_debounce, добавил ещё один аргумент для указания какой pin опрашивать, так как у нас уже две кнопки, а в дальнейшем их может быть много.

    Можно представленный скетч модернизировать: режимы работы кнопки выделить в отдельные функции, или в одну функцию с аргументом выбора режима. Тогда вызывая её в loop(), и определяя номер режима, можно создать очень много режимов работы светодиода или какого другого исполнительного механизма. Конечно, в таком случае портебуется использовать не конструкцию if-else, а, к примеру, switch, и тип переменной flag определить как int.


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