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

Мы сделали на монтажной плате схему из резистора, светодиода, кнопки и набора проводников.

Схема на Arduino из резистора, светодиода, кнопки и набора проводников

У нас подается 5 вольт на кнопку, и если через кнопку приходит 5 Вольт на 12 пин на плате Arduino, то загорается светодиод, соответственно если нет, то светодиод не горит.

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

Давайте введём несколько дополнительных переменных типа int в наш предыдущий код, объявим переменную tekButton - текущая кнопка, присвоим ей значение LOW, это у нас будет 0 или отсутствие напряжения, еще одна int переменная prevButton это у нас будет обозначать прошлое состояние нажатия на кнопку.

Присвоим этой переменной значение LOW и объявим логическую булевую переменную ledOn, которая будет иметь значение False, означающее ложь или 0.

const int keyPin = 12;
const int ledPin = 13;
int tekButton = LOW;
int prevButton = LOW;
boolean ledOn = false;

Подпрограмму setup поставим без изменения, а в цикле loop мы напишем следующий код.

void loop() 
{ 
    tekButton=digitalRead(keyPin); 
    if (tekButton == HIGH && prevButton == LOW) 
        { 
            ledOn=!ledOn;
            digitalWrite(ledPin,ledOn);
        }
    prevButton=tekButton;
}

Запишем нашу переменную tekButton равно, через DigitalRead мы присвоим ей значения переменной keyPin.

Как вы помните это у нас 12 разъем, и переменная tekButton будет учитывать состояние 12 разъёма и изменим теперь условия if, если tekButton принимает значения HIGH, если подаётся напряжение на 12 разъем и предыдущее значение переменной prevButton будет равно LOW, то есть, предыдущий раз не было напряжения, то ledOn, наша булевая переменная, будет инвертироваться, принимать противоположное значение.

Если изначально она равно False(ложь), то станет равна True, и соответственно в функцию digitalWrite( ledPin) мы передаем инвертированная значение ledOn.

В принципе конструкция else нам уже не нужна. Давайте присвоим prevButton значение tekButton.

Сохраним наш скетч, проверим и загрузим его на Arduino.


Смотрите так же видео Скетч - выключатель, светодиод и кнопка в Arduino UNO - (видео), ссылка откроется в новой вкладке.


Промигали индикаторы, прошла загрузка, при нажатии на кнопку индикатор горит, при повторном нажатии индикатор гаснет.

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

Давайте ещё немного модифицируем наш код, перезапустив его, может быть что-то, где-то не прошло, опять нажали, где-то удерживает, где-то не срабатывает.

Давайте изменим скетч таким образом, чтобы у нас срабатывало всё чётко, надо избавиться от этого дребезга контактов.

Напишем небольшую функцию, которая будет всем этим делом управлять, функция у нас будет логическая, Boolean, она будет возвращать либо True либо False, назовем ее testLed.

boolean testLed(boolean last)
{
    boolean current = digitalRead(keyPin);
    if(last != current)
    {
        delay(5);
        current = digitalRead(keyPin);
    }
return current;    
}

У нас будет тест светодиода. Внутренняя переменная last будет принимать значение true/false.

Объявим еще одну логическую переменную - current текущее значение будет равно digitalRead и принимать значение она будет из переменной keyPin, с нашего 12 разъёма.

Будет определяться, подавалось ли напряжение или нет, если предыдущее значению last не равно текущему current, то мы выполним следующие действия: сделаем небольшую задержку в 5 миллисекунд с помощью delay, этого будет достаточно чтобы процессор обработал данные и присвоим переменной current значение DigitalWrite с нашего 12 разъёма через переменную keyPin.

Ну и соответственно наша функция testLed должна что-то вернуть, для этого допишем return и возвращать она будет current – текущее нажатие, с небольшой задержкой в 5 миллисекунд.

Так давайте теперь в нашем коде изменим tekButton у нас будет принимать значение из функции testLed, здесь мы будем передавать переменную prevButton, которая в самом начале у нас имеет значение LOW.

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

void loop()
{
    tekButton = testLed(prevButton);
        if(tekButton == HIGH && prevButton == LOW)
        {
           ledOn= !ledOn;
        }
    prevButton = tekButton;
digitalWrite(ledPin,ledOn);
}

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

Схема на Arduino из резистора, светодиода, кнопки и набора проводников

Как видите всё очень просто! В следующих статьях, мы вернемся к коду с кнопкой, поскольку на этой конструкции будут базироваться остальные разработки.

Видео: Скетч - выключатель, светодиод и кнопка в Arduino UNO




Понравилась статья? Поделитесь ею с друзьями и напишите отзыв в комментариях!

We use cookies on our website. Some of them are essential for the operation of the site, while others help us to improve this site and the user experience (tracking cookies). You can decide for yourself whether you want to allow cookies or not. Please note that if you reject them, you may not be able to use all the functionalities of the site.

Ok