Подключение датчика кнопки к ардуино требует определенных знаний и навыков. В этой статье мы поговорим о том, что такое тактовая кнопка, что такое дребезг кнопки, как правильно подключать кнопку с подтягивающим и стягивающим резистором, как можно управлять с помощью кнопки светодиодами и другими устройствами.
Кнопка ардуино
Кнопка (или кнопочный переключатель) – самый простой и доступный из всех видов датчиков. Нажав на нее, вы подаете контроллеру сигнал, который затем приводит к каким-то действиям: включаются светодиоды, издаются звуки, запускаются моторы. В своей жизни мы часто встречаемся с разными выключателями и хорошо знакомы с этим устройством.
Тактовые кнопки и кнопки-переключатели
Как обычно, начинаем раздел с простых вещей, интересных только начинающим. Если вы владеете азами и хотите узнать о различных вариантах подключения кнопки к ардуино – можете пропустить этот параграф.
Что такое кнопка? По сути, это достаточно простое устройство, замыкающее и размыкающее электрическую сеть. Выполнять это замыкание/размыкание можно в разных режимах, при этому фиксировать или не фиксировать свое положение. Соответственно, все кнопки можно поделить на две большие группы:
- Кнопки переключатели с фиксацией. Они возвращаются в исходное состояние после того, как их отпустили. При в зависимости от начального состояния разделяют на нормально-замкнутые и нормально-разомкнутые кнопки.
- Кнопки без фиксации (тактовые кнопки). Они фиксируются и остаются в том положении, в котором их оставили.
Вариантов различных кнопок великое множество, это действительно один из самых распространенных видов электронных компонентов.
Кнопки ардуино для простых проектов
В наших проектах мы будем работать с очень простыми тактовыми кнопками с 4 ножками, которые идут практически в любом наборе ардуино. Кнопка представляет собой переключатель с двумя парами контактов. Контакты в одной паре соединены между собой, поэтому больше одного выключателя в схеме реализовать не удастся, но вы можете одновременно управлять двумя параллельными сегментами, это бывает полезно.
В зависимости от ситуации, вы можете создавать как схемы с нормально замкнутыми, так и с нормально разомкнутыми контактами – для этого нужно будет только соответствующим образом выполнить соединение в схеме.
Для удобства работы в комплекте с тактовой кнопкой обычно идет пластмассовый колпачок какого-то цвета, он достаточно очевидно надевается на кнопку и придает проекту менее хакерский вид.
Подключение кнопки Ардуино
Включение и выключение светодиода с помощью кнопки
Давайте начнем с самого простого способа подключения тактовой кнопки. Рассмотрим схему с Arduino в качестве источника питания, светодиода, ограничительного резистора номиналом 220 Ом и кнопки, которая будет замыкать и размыкать цепь.

При подключении кнопки с двумя парами ножек важно правильно выбрать размыкающие контакты. Посмотрите на изображение внимательно: пары ножек расположены по бокам кнопки. Сама кнопка квадратная, но расстояния между парами контактов визуально заметны: можно сразу выделить два на одной стороне и два а другой. Так вот, именно между одной «парой» на стороне и будет реализован выключатель. Для включения в схему мы соединяемся с одним и с другим контактом, между которыми минимальное расстояние. Вторая пара контактов просто дублирует первую.
Если у вас переключатель другого типа, то можете смело выбрать контакты с противоположных углов (на некоторых кнопка делается специальный знак в виде выемки, по которому можно определить, с какой стороны расположены спаренные контакты). Самый надежный способ определить правильные ножки – это прозвонить контакты тестером.
Сама схема с кнопкой, светодиодом и контроллером Arduino не нуждается в особых пояснениях. Кнопка разрывает цепь, светодиод не горит. При нажатии цепь замыкается, светодиод включается. Если вы перепутаете контакты (включите через замкнутые спаренные контакты кнопки), то кнопка работать не будет, потому что цепь никогда не разомкнется. Просто поменяйте контакты местами.
Подключение кнопки с подтягивающим резистором
Давайте теперь подключим кнопку к ардуино так, чтобы можно было считывать в скетче ее состояние. Для этого воспользуемся следующей схемой.
В скетче мы будем отслеживать факт нажатия и выводить сообщение в монитор порта. Более интересный пример и подробное объяснение самой схемы мы приведем чуть позже.
Следует обратить внимание на сопротивление 10 К, которое мы добавили в этой схеме. Более подробно о его предназначении мы поговорим позже, просто имейте в виду, что такой резистор необходим для правильной работы схемы.
Скетч для кнопки ардуино с подтягивающим резистором:
Подключение кнопки в режиме INPUT_PULLUP
В указанной выше схеме мы использовали резистор, называемый подтягивающим, для формирования определенного уровня сигнала на цифровом порту. Но есть другой способ подключить кнопку без резистора, используя внутренне сопротивление платы ардуино. В блоке setup мы должны всего лишь определить тип пина, к которому подключим кнопку, как INPUT_PULLUP.
Альтернативным вариантом будет выбрать режим пина как OUTPUT и установить на данный порт высокий уровень сигнала. Встроенный подтягивающий резистор подключиться автоматически.
И все. Можно собрать вот такую сложную схему и работать с кнопкой в скетче.

Мигание светодиода после нажатия на кнопку
В предыдущем примере со светодиодами мы подключили кнопку к плате ардуино и поняли, как она работает. Светодиод включался и выключался, но делал это в совершенно пассивном режиме – сам контроллер здесь был абсолютно лишним, его можно было бы заменить батарейками. Поэтому давайте сделаем наш новый проект более «интеллектуальным»: при нажатии на кнопку заставим светодиод непрерывно мигать. Обычной схемой с лампочкой и выключателем этого уже не сделаешь – мы будем использовать мощь нашего микроконтроллера для решения этой пусть и простой, но не тривиальной задачи.
Полная схема проекта изображена на рисунке:

Фрагмент схемы со светодиодом уже хорошо нам знаком. Мы собрали обычный маячок со светодиодом и ограничительным резистором. А вот во второй части мы видим знакомую нам кнопку и еще один резистор. Пока не будем вдаваться в подробности, просто соберем схему и закачаем в ардуино простой скетч. Все элементы схемы идут в самых простых стартовых наборах ардуино.
Нажимаем и держим – светодиод мигает. Отпускаем – он гаснет. Именно то , что хотели. Хлопаем от радости в ладоши и приступаем к анализу того, что сделали.
Давайте посмотрим на скетч. В нем мы видим довольно простую логику.
- Определяем, нажата ли кнопка.
- Если кнопка не нажата, то просто выходим из метода loop, ничего не включая и не меняя.
- Если кнопка нажата, то выполняем мигание, используя фрагмент стандартного скетча:
- Включаем светодиод, подавая напряжение на нужный порт
- Делаем нужную паузу при включенном светодиоде
- Выключаем светодиод
- Делаем нужную паузу при выключенном светодиоде
Логика поведения кнопки в скетче может зависеть от способа подключения с подтягивающим резистором. Об этом мы поговорим в следующей статье.
Дребезг кнопки ардуино
В процессе работы с кнопками мы можем столкнуться с очень неприятным явлением, называемым дребезгом кнопки. Как следует из самого названия, явление это обуславливается дребезгом контактов внутри кнопочного переключателя. Металлические пластины соприкасаются друг с другом не мгновенно (хоть и очень быстро для наших глаз), поэтому на короткое время в зоне контакта возникают скачки и провалы напряжения. Если мы не предусмотрим появление таких “мусорных” сигналов, то будем реагировать на них каждый раз и можем привести наш проект к хаусу.
Для устранения дребезга используют программные и аппаратные решения. В двух словах лишь упомянем основные методы подавления дребезга:
- Добавляем в скетче паузу 10-50 миллисекунд между полкучением значений с пина ардуино.
- Если мы используем прерывания, то программный метд использоваться не может и мы формируем аппаратную защиту. Простейшая из них – RC фильтр с конденсатором и сопротивлением.
- Для более точного подавления дребезга используется аппаратный фильтр с использованием триггера шмидта. Этот вариант позволит получить на входе в ардуино сигнал практически идеальной формы.
Более подробную информацию о способах борьбы с дребезгом вы можете найти в этой статье об устранении дребезга кнопок.
Переключение режимов с помощью кнопки
Для того, чтобы определить, была ли нажата кнопка, надо просто зафиксировать факт ее нажатия и сохранить признак в специальной переменной.
Факт нажатия мы определяем с помощью функции digitalRead(). В результате мы получим HIGH (1, TRUE) или LOW(0, FALSE), в зависимости от того, как подключили кнопку. Если мы подключаем кнопку с помощью внутреннего подтягивающего резистора, то нажатие кнопки приведет к появлению на входе уровня 0 (FALSE).
Для хранения информации о нажатии на кнопку можно использовать переменную типа boolean:
boolean keyPressed = digitalRead(PIN_BUTTON)==LOW;
Почему мы используем такую конструкцию, а не сделали так:
boolean keyPressed = digitalRead(PIN_BUTTON);
Все дело в том, что digitalRead() может вернуть HIGH, но оно не будет означать нажатие кнопки. В случае использования схемы с подтягивающим резистором HIGH будет означать, что кнопка, наоборот, не нажата. В первом варианте (digitalRead(PIN_BUTTON)==LOW ) мы сразу сравнили вход с нужным нам значением и определили, что кнопка нажата, хотя и на входе сейчас низкий уровень сигнала. И сохранили в переменную статус кнопки. Старайтесь явно указывать все выполняемые вами логические операции, чтобы делать свой код более прозрачным и избежать лишних глупых ошибок.
Как переключать режимы работы после нажатия кнопки?
Часто возникает ситуация, когда мы с помощью кнопок должны учитывать факт не только нажатия, но и отпускания кнопки. Например, нажав и отпустив кнопку, мы можем включить свет или переключить режим работы схемы. Другими словами, нам нужно как-то зафиксировать в коде факт нажатия на кнопку и использовать информацию в дальнейшем, даже если кнопка уже не нажата. Давайте посмотрим, как это можно сделать.
Логика работы программы очень проста:
- Запоминаем факт нажатия в служебной переменной.
- Ожидаем, пока не пройдут явления, связанные с дребезгом.
- Ожидаем факта отпускания кнопки.
- Запоминаем факт отпускания и устанавливаем в отдельной переменной признак того, что кнопка была полноценно нажата.
- Очищаем служебную переменную.
Как определить нажатие нескольких кнопок?
Нужно просто запомнить состояние каждой из кнопок в соответствующей переменной или в массиве ардуино. Здесь главное понимать, что каждая новая кнопка – это занятый пин. Поэтому если количество кнопок у вас будет большим, то возможно возникновение дефицита свободных контактов. Альтернативным вариантом является использование подключения кнопок на один аналоговый пин по схеме с резистивным делителем. Об этом мы поговорим в следующих статьях.

Доброго времени суток!
Продолжаю рассказывать вам о своем опыте знакомства с микроконтроллерами на примере Arduino. Ранее я рассказал, как управлять светодиодом при помощи тактовой кнопки. Задача была в следующем: нажали кнопку светодиод загорелся, отпустили — погас. Однако, на практике чаще стоит задача зафиксировать действие кнопки, т.е. нажал кнопку — светодиод загорелся, нажал еще раз — погас.
Если описать алгоритм человеческим языком, то получится следующее: если кнопка нажималась и светодиод горит, то погасить светодиод, если кнопка нажималась и светодиод не горит, то зажечь светодиод.


if (условие)
<
// здесь находятся команды, которые выполнятся, если условие выполняется (т.е. не равно нулю)
>
else
<
// здесь находятся команды, которые выполнятся, если условие не выполняется (т.е. равно нулю)
>
на примере моего скетча это выглядит так:
if (0 == onOff) // если светодиод не горит, …
<
onOff = 1;
digitalWrite(13, HIGH); // …то зажигаем его, …
>
else // … иначе …
<
onOff = 0;
digitalWrite(13, LOW); // … гасим
>
Загружаем скетч в Arduino и пробуем понажимать кнопку. Иногда всё работает верно. Иногда светодиод еле заметно моргнет и погаснет. Иногда ничего не происходит. Почему такая разница в результате, при выполнении одной и той же программы? Вроде бы делаем всё правильно… Виной тому явление, в электронике называемое "дребезгом контактов".


Для реализации такой задержки в пустой цикл ожидания отпускания кнопки я добавил команду задержки delay(1) (цифра в скобках-это длительность задержки в миллисекундах(1/1000 секунды)).
Также в цикле появился счётчик cycle++. Эту запись программисты называют инкрементом. При каждом выполнении этой команды переменная cycle увеличивается на единицу. Эту же строчку можно записать так: cycle = cycle + 1. Никакой ошибки не будет. Загружаю дополненный скетч в Arduino и проверяю. Теперь всё работает чётко. Задача выполнена.
Жмите кнопки) Для Вас это — щелчок мышью, а для меня — повод продолжать делиться своими наработками.
Всем Мира и правильных решений!
До свидания.

Смотрите также
Комментарии 20

Выходы А1 и А2. От них через мосфеты ШИМ будет подан на инверсный вход DIM импульсного драйвера. В драйвере встроен силовой мосфет 1А. Нагрузкой будет 11красных и 7синих одноваттных светодиодов с максимальным током 350мА,
С помощью ШИМ я хочу изменять этот ток от 10 до 350мА. Такую задачу себе поставил.
Выбрал именно этот драйвер потому, что у него минимальная обвязка.
Сейчас я использую грубое изменение соотношения тумблерами, что увеличивает к-во проводов на светильниках, да и просто неудобно.
здесь видео моего бокса 

А какое Arduino ? например, на Nano на этих выводах ШИМ получить штатными средствами не удастся.
Штатно ШИМ работает на выводах 3,5,6,9,10,11 выводах.

Я ошибся — просто забыл. А ведь в прошлом году пробовал командой
analogWrite(RED, brightness(100)); на #define RED 3 . r
Это значит те выводы, что обозначены DIGITAL ( PWM) -как в UNO ?
Тото не мог понять -осциллограф не фиксирует ШИМ ниже скважности 120 на аналоговом выходе А1.
Скоро попробую.
Но пока для меня главный вопрос по фиксации сигнала нажатой кнопки. Спасибо за науку!

Да. Что в Нано, что в Уно один и тот же камень стоит.
Вечером Вам скетч накидаю. На работе Arduino IDE не установлено.

А какое Arduino ? например, на Nano на этих выводах ШИМ получить штатными средствами не удастся.
Штатно ШИМ работает на выводах 3,5,6,9,10,11 выводах.
Только что проверил на УНО — все так! Любую скважность отрабатывает на 3 выходе.
Благодарю!

byte RED = 9, // выход синего канала — пин 9
BLUE = 10, // выход красного канала — пин 10
button1 = 5, // вход первой кнопки — пин 5
button2 = 6, // вход второй кнопки — пин 6
button3 = 7, // вход третьей кнопки — пин 7
buttonstate = 0,
b = 0,
r = 0;
void setup() <
// put your setup code here, to run once:
pinMode(RED, OUTPUT);
pinMode(BLUE, OUTPUT);
pinMode(button1, INPUT);
pinMode(button2, INPUT);
pinMode(button3, INPUT);
>
void loop() <
// put your main code here, to run repeatedly:
while (!buttonstate) < // ожидаем нажатие кнопки или комбинации кнопок
buttonstate = digitalRead(button1) * 1 + digitalRead(button2) * 2 + digitalRead(button3) * 4;
>
switch (buttonstate)
<
case 1: b = 255; r = 255; break; // если нажата кнопка 1, красный и синий по 100%
case 2: b = 82; r = 255 ; break; // если нажата кнопка 2, синий 30% и красный 100%
case 4: b = 255; r = 0; break; // если нажата кнопка 3, синий 100% и красный 0%
>
while (buttonstate = digitalRead(button1) * 1 + digitalRead(button2) * 2 + digitalRead(button3) * 4); // ждем отпускания нажатой комбинации
analogWrite(RED, r); // включаем красный канал
analogWrite(BLUE, b); // включаем синий канал
>

Здорово и оригинально!
Мне еще нужно понять саму запись, я ведь не знаком отдельными командами. но суть понимаю так:
каждой кнопке свои параметры скважности
эта строка совсем непонятна:
while (buttonstate = digitalRead(button1) * 1 + digitalRead(button2) * 2 + digitalRead(button3) * 4);
Буду разбираться . Огромное спасибо!

В предыдущем цикле мы вычислили, какое сочетание кнопок было нажато. Записали его в переменную buttonstate. А в этом цикле мы сравниваем текущее состояние с запомненным. Как только оно изменится, считаем что кнопку отпустили.

Только что проверил на УНО — все так! Любую скважность отрабатывает на 3 выходе.
Благодарю!

Я сегодня соберу прототип заново. В том, что получится я даже не сомневаюсь.
Я понял, что пара switch и case — это условие. А можно было использовать if . else?

Можно. Но когда ветвлений больше двух, я предпочитаю использовать switch и case.
www.drive2.ru/b/456724211990266406/
тут я подробно эту конструкцию описывал.

Так я выращиваю рассаду под светодиодами


Уважаемый Albion76!
Очень нравятся Ваши доходчивые посты.
Благодаря Вам, стал интересоваться Ардуино и решил приучать внука 9лет к творчеству,
Я бывший радиолюбитель, современны схемы мне понятны, но программирование с трудом — память подводит. Решил я с внуком сделать диммируемую подсветку для рассады. Ардуино будет управлять двумя драйверами с помощью ШИМ. Один драйвер — мощные красные светодиоды 660нм, , второй синие- 440нм
Будет 3 режима, в смысле соотношения по яркости между красным и синим цветом, типа 1:1 . 3:1 и 0:1
Решил использовать 3 кнопки, Скетч составил, но взаимодействие между ними не могу сообразить, чтобы нажатие и фиксация одной кнопки сбрасывала предыдущее нажатие.
Если не трудно, подскажите пожалуйста как поправить. Благодарю заранее.


А как у Вас кнопки подключены физически?

обычное подключение: кнопка к плюсу, вход притянут 10кОм на землю.
При нажатии "1" есть, но фиксации нет ( просто не знаю как), Можно тумблер поставить, но все равно проблема исключения ситуации, когда включено два одновременно.
Проблема моя в незнании программирования. Учиться уже сложно в 70лет. Однако стараюсь копипастом.
На жесткой логике я могу собрать, но мне все равно нужна ардуинка с прицелом на расширение функций управления светильником- поддержание температуры, влажности и время свечения (таймер).
Драйверы я уже собрал на NCL30160. Но пока не опробовал


Отвык я уже от управления по единице. Обычно вход притягивают к U пит встроенным резистором, а кнопку цепляют между входом и массой. Внешний резистор в этом случае не нужен. Ну да ладно, это лирика…
Следующий вопрос: выходы красного и синего канала на какие пины вешаете? А1 и А2?

Все ниженаписаное — мое ИМХО — не принмай близко.
Не заю, где ты подсмотрел запись сравнения с операндом-переменной справа, но обычно все пишут переменную слева. Аж как-то неудобно читать.
Ну и вместо твоего иф, я б написал так (применимо к примеру. Понятное дело — ставилась цель не причесать код, а показать оператор ветвления):
Антидребезг (как по мне) реализуется немного не так. Что есть антидребезг — дождаться устойчивого сигнала (а не пропустить несколько отсчетов).
Там где у тебя cycle++, я б еще раз проверял ногу на изменение состояния (изменилось — обнуляем cycle). И по прогествии какого-то времени (тех же cycle) если состояние не изменилось — считаем что дребезг прошел. А. Не внимательно посмотрел — также почти и у тебя. Но вот циклить while-ом я б все же не стал. — возможно будут другие вещи которые можно выполнить пока кнопку не отпустили. А здесь — проц просто ждет.

Спасибо за отзыв.
Правильно просёк меня)) Я и хотел показать конструкцию if — else . Хотел еще описать else if и case, но получалось очень много букв. Отложил до лучших времен. Были жалобы, что люди засыпают в процессе чтения)))
Понимаю, что подобные циклы, да и сам delay не являются эталоном оптимального кода. Но я же еще начинающий прогер 😉
Касаемо константы справа.
Допустим надо сравнить а с нулем.
Если написать if(a=0), вместо if(a==0), то компилятор пропустит, но программа будет работать неверно. Такую ошибку в большом коде запаришься искать ошибку, а if(0=a) компилятор не пропустит. Согласен?
В этом уроке мы узнаем: как подключить кнопку к ардуино, как подавить дребезг контактов, как в прошивке обработать нажатие на кнопку, как послать ШИМ сигнал, как создать свою функцию и как управлять светодиодом.
В этом уроке используются следующие детали:
| Большая макетная плата на 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().
Вот и все! Сегодняшний урок на этом мы закончим. Надеюсь вам все было понятно. Если нет, то можете задавать свои вопросы в комментариях ниже.
СХОЖИЕ СТАТЬИБОЛЬШЕ ОТ АВТОРА

Arduino. Урок 15. SD карта.

Ардуино для начинающих. Урок 14. Прерывания.

Ардуино для начинающих. Урок 13. Беспроводная связь.
17 КОММЕНТАРИИ
Здравствуйте)))
Подскажите пожалуйста новечьку,
Как можно реализовать такой скечь
При нажатии на кнопку светодиод плавно загорается если нажать ещё раз на кнопку то светодиод плавно тухнет…?
Очевидно при нажатии на кнопку в цикле менять значение 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
Света12.03.2018 at 12:18
МУЖЧИНЫ кто согласится написать скетч за вознаграждение,к примеру на телефон.
Здравствуйте. Какой именно скетч вам нужен?
выдаёт ошибку на
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 кнопках? Чтобы нажал на первую кнопку загорелся первый светодиод,нажал на вторую кнопку загорелся второй светодиод.





