Ардуино для начинающих. Урок 5. Кнопки, ШИМ, функции

В этом уроке мы узнаем: как подключить кнопку к ардуино, как подавить дребезг контактов, как в прошивке обработать нажатие на кнопку, как послать ШИМ сигнал, как создать свою функцию и как управлять светодиодом.

В этом уроке используются следующие детали:

Большая макетная плата на 1600 точек с 4 шинами питания: Купить
Набор резисторов из 100 штук на все случаи: Купить
Набор светодиодов из 100 штук: Купить
5 штук кнопок в удобной форме: Купить
Соединительные провода 120 штук: Купить

Подключение кнопки к Arduino

подключение кнопки к ардуино

подключение кнопки к ардуино

Как видите, ничего сложно в подключении кнопки к ардуино нет. Обратите внимание, что кнопка установлена так, что каждый ее контакт подключен к разным линиям макетной платы. Так же вы можете заметить резистор на 10 кОм который притягивает контакт к земле. Это нужно для того, что бы мы на 8 контакте не ловили наводок. Попробуйте убрать этот резистор из схемы. Светодиод будет загораться при шевелении проводов или кнопки. Теперь давайте рассмотрим скетч:

В этом уроке, как и прошлом, в самом начале мы объявляем переменные со значениями пинов к которым у нас подключены кнопка и светодиод. Далее в функции setup() мы обозначаем какой пин используется как вход, а какой как выход. В функции loop() мы используем условный оператор if с оператором сравнения и проверяем приходит ли на пин 8 высокий сигнал. Если да то включаем светодиод, если нет то выключаем. Описание функций и операторов вы найдете в справочнике по языку программирования Arduino

Теперь немного усложним наш код. Давайте сделаем так, что бы при нажатии на кнопку светодиод загорался и гас только при следующем нажатии на кнопку. Для этого в схеме мы менять ничего не будем, а скетч теперь будет выглядеть так:

В этом скетче мы добавили переменные для хранения состояния светодиода и кнопки. Так же мы создали новую функцию для подавления дребезга контактов debounse(). Код в цикле loop() тоже немного изменился. Теперь в условном операторе мы проверяем нажата ли кнопка и если нажата, то меняем состояние светодиода на противоположное. Потом меняем переменную с последним состоянием на текущее состояние кнопки и включаем или выключаем светодиод.

Понравилось? Давайте еще больше усложним наш проект. Теперь мы будем управлять яркостью светодиода. Для этого нам надо немного изменить схему нашего устройства. Для управления яркостью мы будем использовать ШИМ. Значит нам надо подключить светодиод к выходу, который может выдавать ШИМ. Теперь наша схема будет выглядеть вот так:

Управление яркостью светодиода

Управление яркостью светодиода

Теперь светодиод подключен к 11 пину ардуино, которой умеет делать ШИМ. И нам пришлось добавить токоограничивающий резистор на 220 Ом перед светодиодом, что бы его не спалить. Это необходимо потому, что светодиоды работают при напряжении 3.3 В, а пин ардуино отдает 5 В. Теперь посмотрим что нужно изменить в скетче:

В этом примере мы изменили значение переменной ledPin на 11. Так же добавили переменную для хранения уровня ШИМ ledLevel. При нажатии на кнопку будем увеличивать эту переменную. Функция debounce() осталась без изменений. В цикле мы теперь используем функцию analogWrite().

Вот и все! Сегодняшний урок на этом мы закончим. Надеюсь вам все было понятно. Если нет, то можете задавать свои вопросы в комментариях ниже.

8 thoughts on “Ардуино для начинающих. Урок 5. Кнопки, ШИМ, функции

  1. Николай

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

    Reply
  2. Денис

    Очевидно при нажатии на кнопку в цикле менять значение ledLevel

    Reply
  3. Mr.ALB

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

    /*== к примеру, вот так ==*/

    // переменные с пинами подключенных устройств
    int switchPin = 8;
    int ledPin = 11;

    // переменные для хранения состояния кнопки и светодиода
    boolean lastButton = LOW;
    boolean currentButton = LOW;
    int ledLevel = 0;

    // настройка изменения яркости
    int deltaLevel = 5; // Шаг изменения яркости
    int sign = 1; // Знак шага
    int step_delay = 100; // задержка в шаге изменения яркости светодиода

    // настройка сигнализатора окончания изменения яркости
    int max_blink = 3; //число морганий светодиода на pin13 (LED_BUILTIN)
    int blink_delay = 500; //задержка состояния светодиода на pin13 (LED_BUILTIN)

    void setup()
    {
    pinMode(switchPin, INPUT);
    pinMode(ledPin, OUTPUT);
    pinMode(LED_BUILTIN, OUTPUT);
    digitalWrite(LED_BUILTIN, LOW);// потушим светодиод на pin13 (LED_BUILTIN)
    }

    // функция для подавления дребезга
    boolean debounse(boolean last)
    {
    boolean current = digitalRead(switchPin);
    if(last != current)
    {
    delay(5);
    current = digitalRead(switchPin);
    }
    return current;
    }

    // При нажатии на кнопку, светодиод медленно увеличивает яркость
    // При повторном нажатии на кнопку, светодиод медленно гаснет
    void loop()
    {
    currentButton = debounse(lastButton);
    if(lastButton == LOW && currentButton == HIGH)
    {
    if(ledLevel == 0) sign = 1;
    if(ledLevel == 255) sign = -1;
    for(int i = 0; i 255) ledLevel = 255;
    if(ledLevel < 0) ledLevel = 0;
    analogWrite(ledPin, ledLevel);
    delay(step_delay);
    }
    /* Сигнализация окончания цикла изменения яркости светодиода */
    for(int i = 0; i < max_blink; i++)
    {
    digitalWrite(LED_BUILTIN, HIGH);
    delay(blink_delay);
    digitalWrite(LED_BUILTIN, LOW);
    delay(blink_delay);
    }
    }
    lastButton = currentButton; // переписываем состояние кнопки
    }

    //P.S. почему-то первый ответ криво пошёл, исказился код… надеюсь этот пройдёт

    Reply
  4. Света

    МУЖЧИНЫ кто согласится написать скетч за вознаграждение,к примеру на телефон.

    Reply
    1. Tviort Post author

      Здравствуйте. Какой именно скетч вам нужен?

      Reply
  5. иван

    помогите освоить кнопки для изменения параметра int b = 7883; с запоминанием
    #include

    LiquidCrystal_I2C lcd(0x27, 16, 2);

    #include

    AccelStepper Stepper1(1, 13, 12); //использует пин 12 и 13 для dir и step, 1 — режим «external driver» (A4988)

    int dir = 1;

    int a = 0;

    int relayPin = 11;

    int b = 7883;

    void setup() {

    lcd.init();

    lcd.backlight();

    lcd.setCursor(0, 1);

    lcd.print(b);

    pinMode (relayPin, OUTPUT);

    digitalWrite (relayPin, HIGH);

    }

    void loop() {

    Stepper1.setMaxSpeed(1500.0);
    Stepper1.setAcceleration(1500.0);
    if (Stepper1.distanceToGo() == 0) {
    digitalWrite (relayPin, LOW);
    delay(30);
    Stepper1.move(b);
    delay(500);

    }
    if (Stepper1.distanceToGo() == b)
    {
    digitalWrite (relayPin, HIGH);
    delay(30);
    a = 0;
    }
    Stepper1.run(); //запуск шагового двигателя. Эта строка повторяется вновь и вновь для непрерывного вращения двигателя

    }

    Reply
  6. иван

    так то тело работает как надо, но чтото я в ступоре что и где написать ему еще ))))))

    Reply

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *