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

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

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

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

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

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

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

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

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

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

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

Подключение светодиода к Arduino

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

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

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

24 комментариев

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

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

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

void setup() <
pinMode(switchPin, INPUT);
pinMode(ledPin, OUTPUT);
>

// функция для подавления дребезга
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) <
for(int i=ledLevel;i 255) ledLevel = 0;
>
currentButton = debounse(lastButton);

//второй цикл, постепенно выключает светодиодик
if(lastButton == LOW && currentButton == HIGH) <
for(int i=ledLevel;i>0;i=i-1) <
ledLevel = ledLevel — 1;
delay(100);
analogWrite(ledPin, ledLevel);>
//if(ledLevel > 255)
ledLevel = 0;
>

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

Денис что такое ledlevel?

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

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

// переменные с пинами подключенных устройств
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
Света 2018-03-12 12:18:59

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

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

выдаёт ошибку на

for(int i = 0; i 255) ledLevel = 255;

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

LiquidCrystal_I2C lcd(0x27, 16, 2);

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

int relayPin = 11;

pinMode (relayPin, OUTPUT);

digitalWrite (relayPin, HIGH);

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(); //запуск шагового двигателя. Эта строка повторяется вновь и вновь для непрерывного вращения двигателя

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

Привет) Имеем простейший скетч для управления оборотами бк мотора. как добавить сюда кнопку, при нажатии и удержании двиг должен крутиться на выставленых оборотах, при отпускании кнопки двиг останавливается
#include

void setup() <
motor.attach(8);
motor.writeMicroseconds(2300);
delay(2000);
motor.writeMicroseconds(800);
delay(6000);
>

int val = map(analogRead(0), 0, 1023, 800, 2300);
motor.writeMicroseconds(val);

Очень просто! в setup() <> надо добавить строку: pinMode(D5, INPUT); // D5 номер цифрового пина к которому подключена кнопка. Можете подключить к любому цифровому пину но не забудьте поменять значение

В loop()<> добавляем следующее условие:
if(digitalRead(D5)) < // ждем высокого сигнала с кнопки
int val = map(analogRead(0), 0, 1023, 800, 2300);
motor.writeMicroseconds(val);
>

void setup() <
pinMode(D5, INPUT);
motor.attach(8);
motor.writeMicroseconds(2300);
delay(2000);
motor.writeMicroseconds(800);
delay(6000);
>

if(digitalRead(D5))
int val = map(analogRead(0), 0, 1023, 800, 2300);
motor.writeMicroseconds(val);

ошибка ‘D5’ was not declared in this scope

подскажите где ошибка??

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

Странно что вам никто не ответил. В цикле изменяйте параметры ШИМ от 0 до 255 и постоянно опрашивайте кнопку на предмет нажатия. Сделайте задержку опроса немного больше, например 10ms. Чтобы не ошибиться с «отжатием». По false заканчивайте опрос и устанавливайте выход в LOW.
Написать видимо могу, но тратить на это время не хочу. Я всего пару часов учу этот предмет 🙂
Надеюсь вы уже и без меня догадались как это сделать.

Есть стойкое ощущение, что автор статьи дисциплины схемотехника и принцип работы электронных приборов в ВУЗе прогуливал.
«Теперь светодиод подключен к 11 пину ардуино, которой умеет делать ШИМ. И нам пришлось добавить токоограничивающий резистор на 220 Ом перед светодиодом, что бы его не спалить. Это необходимо потому, что светодиоды работают при напряжении 3.3 В, а пин ардуино отдает 5 В.»
1. Без разницы где стоит резистор До или После светодиода.
2. «токоограничивающий резистор» — совершенно верно!
3. «Это необходимо потому, что светодиоды работают при напряжении 3.3 В, а пин ардуино отдает 5 В.» А это вы батенька придумали самостоятельно. Сетодиод — прибор управляемый током (в п.2 ошибки нет). На напряжение ему плевать, кроме полярности естественно. Дальше закон Киргоффа для участка цепи. Я включаю светодиоды в розетку 220В. Так что напряжение на выходе Arduino тут вообще не причем. Касаемо резистора то тут он, скорее всего ограничивает ток коллектора выходного транзистора контроллера, т.к. светодиод горит ярко уже при 10ma, новые даже при 5-7ma. А здесь ограничено около 20-23ma. Т.е. для свечения светодиода можно было смело ставить 470 Ом и выше. На это плевать когда вы питаетесь от компа и не «греетесь». Как только будете «жрать» батарейки (или сделаете высоко нагруженную схему), то все будет греться а батарея заканчиваться довольно быстро.
Сорри. не по теме программирования.
К программированию претензий нет. Я в этом пока не сильно понимаю. Первый день…

Как сделать на 2 кнопках? Чтобы нажал на первую кнопку загорелся первый светодиод,нажал на вторую кнопку загорелся второй светодиод.

Подскажите пожалуйста а как написать код чтоб 2 кнопки и 2 светодиода работало. а то я не как не могу в толк взять. Как и что здесь сделоть. int switchPin = 2;
int switch1Pin = 4;
int ledPin = 12;
int led1Pin = 13;

// переменные для хранения состояния кнопки и светодиода
boolean lastButton = LOW;
boolean last1Button = LOW;
boolean currentButton = LOW;
boolean current1Button = LOW;
boolean ledOn = false;
boolean led1On = false;

void setup() <
pinMode(switchPin, INPUT);
pinMode(switch1Pin, INPUT);
pinMode(ledPin, OUTPUT);
pinMode(led1Pin, OUTPUT);
>

// функция для подавления дребезга

boolean debounse(boolean last);
boolean debounse1(boolean last1);
boolean current = digitalRead(switchPin);
boolean current1 = digitalRead(switch1Pin);

if (last != current) <
delay(5);
current = digitalRead(switchPin);
<
return current;
>
if (last1 != current1) <
delay(5);
current1 = digitalRead(switch1Pin);
>
<
return current1;
>

currentButton = debounse(lastButton);
if(lastButton == LOW && currentButton == HIGH) <
ledOn = !ledOn;
>
lastButton = currentButton;
digitalWrite(ledPin, ledOn);

current1Button = debounse1(last1Button);
if(last1Button == LOW && current1Button == HIGH) <
led1On = !led1On;
>
last1Button = current1Button;
digitalWrite(led1Pin, led1On);
>>
>

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

Почему когда открываешь монитор порта на пине 13 появляется напряжение и на других пинах тоже. Тоесть реле подключенное к другим пинам тоже срабатывает

«Это необходимо потому, что светодиоды работают при напряжении 3.3 В, а пин ардуино отдает 5 В.» Светодиод работает от тока 10-20мА. И резистор ограничивает ток по закону ОМА. Исправьте ошибку!

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

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

void setup() <
pinMode(switchPin, INPUT);
pinMode(ledPin, OUTPUT);
>

// функция для подавления дребезга
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) <
ledOn = !ledOn;
>
lastButton = currentButton;
digitalWrite(ledPin, ledOn);
>
одно нажатие на кнопу светодиод горит второе гаснет . мне нужно тоже самое только управлять кодом если кнопка не нажата выполняется первый код нажал выполняется второй , еде раз нажал выполняется первый код , я не пойму как переменную для хранения состояния светодиода boolean ledOn = false; заменить на переменную хранения состояния кода ? подскажите пожалуйста .

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

Для отправки комментария вам необходимо авторизоваться.

Источник

Как подключить кнопку к Arduino

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

Инструкция по подключению кнопки к Arduino

  • Arduino UNO или иная совместимая плата;
  • тактовая кнопка;
  • резистор 10 кОм (вот отличный набор резисторов с основными номиналами от 10 Ом до 10 МОм);
  • макетная плата (breadboard);
  • соединительные провода (рекомендую вот такой набор);
  • персональный компьютер со средой разработки Arduino IDE.

1 Виды кнопок

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

Виды кнопок, их внешний вид и обозначение на электрической схеме

Некоторые кнопки после нажатия оставляют проводники соединёнными (фиксирующиеся кнопки), другие – сразу же после отпускания размыкают цепь (нефиксирующиеся кнопки).

Также кнопки делят на:

  • нормально разомкнутые,
  • нормально замкнутые.

Первые при нажатии замыкают цепь, вторые – размыкают.

Сейчас нашёл широкое применение тип кнопок, которые называют «тактовые кнопки». Тактовые – не от слова «такт», а от слова «тактильный», т.к. нажатие хорошо чувствуется пальцами. Но этот ошибочный термин устоялся, и теперь эти кнопки у нас повсеместно так называют. Это кнопки, которые при нажатии замыкают электрическую цепь, а при отпускании – размыкают, т.е. это нефиксирующиеся, нормально разомкнутые кнопки.

2 Дребезг контактов

Кнопка – очень простое и полезное изобретение, служащее для лучшего взаимодействия человека и техники. Но, как и всё в природе, она не идеальна. Проявляется это в том, что при нажатии на кнопку и при её отпускании возникает т.н. «дребезг» («bounce» по-английски). Это многократное переключение состояния кнопки за короткий промежуток времени (порядка нескольких миллисекунд), прежде чем она примет установившееся состояние. Это нежелательное явление возникает в момент переключения кнопки из-за упругости материалов кнопки или из-за возникающих при электрическом контакте микроискр.

Дребезг контактов в момент нажатия и отпускания кнопки

В следующей статье подробно описаны основные способы борьбы с «дребезгом» при замыкании и размыкании контактов. А пока что рассмотрим варианты подключения кнопки к Arduino.

3 Некорректное подключение кнопки

Чтобы подключить нормально разомкнутую тактовую кнопку к Arduino, можно поступить самым простым способом: один свободный проводник кнопки соединить с питанием или землёй, другой – с цифровым выводом Arduino. Но, вообще говоря, это неправильно. Дело в том, что в моменты, когда кнопка не замкнута, на цифровом выводе Ардуино будут появляться электромагнитные наводки, и из-за этого возможны ложные срабатывания.

Неправильное подключение кнопки к Arduino

Чтобы избежать наводок, цифровой вывод обычно подключают через достаточно большой резистор (10 кОм) либо к земле, либо к питанию. В первом случае это называется «схема с подтягивающим резистором», во втором – «схема со стягивающим резистором». Давайте рассмотрим каждую из них.

4 Подключение кнопки по схеме с подтягивающим резистором

Сначала подключим к Arduino кнопку по схеме с подтягивающим резистором. Для этого один контакт кнопки соединим с землёй, второй – с цифровым выходом «2». Цифровой выход «2» также подключим через резистор номиналом 10 кОм к питанию +5 В.

Схема подключения кнопки к Arduino по схеме с подтягивающим резистором

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

Встроенный светодиод на выводе «13» постоянно горит, пока не нажата кнопка. Т.е. на порте «2» Arduino всегда присутствует высокий логический уровень HIGH. Когда нажимаем кнопку, напряжение на «2» порте принимает состояние LOW, и светодиод гаснет.

5 Подключение кнопки по схеме со стягивающим резистором

Теперь соберём схему со стягивающим резистором. Один контакт кнопки соединим с питанием +5 В, второй – с цифровым выходом «2». Цифровой выход «2» подключим через резистор номиналом 10 кОм к земле. Скетч менять не будем.

Подключение кнопки к Arduino по схеме со стягивающим резистором

При включении схемы на цифровом порте «2» Arduino низкий уровень LOW, и светодиод не горит. При нажатии на кнопку на порт «2» поступает высокий уровень HIGH, и светодиод загорается.

Источник

Adblock
detector