Как подключить светодиод к кнопке
Работа с кнопками
Кнопка является простейшим устройством, при помощи которого можно управлять ходом программы на микроконтроллере, но физически она выполняет очень простую функцию: замыкает и размыкает контакт. Кнопки бывают нескольких типов:
- С фиксацией – кнопка остаётся нажатой после отпускания, без фиксации – отключается обратно.
- Нормально разомкнутая (Normal Open, NO) – при нажатии замыкает контакты. Нормально замкнутая (Normal Closed, NC) – при нажатии размыкает контакты.
- Тактовые кнопки – замыкают или размыкают контакт. У обычных тактовых кнопок ноги соединены вдоль через корпус (см. картинку ниже). Переключатели – обычно имеют три контакта, общий COM, нормально открытый NO и нормально закрытый NC. При отпущенной кнопке замкнута цепь COM-NC, при нажатой замыкается COM-NO.
Расчет параметров схемы
Формулы расчета параметров электрической цепи | ||||
---|---|---|---|---|
Напряжение | Сила тока | Сопротивление | Мощность | Реактивное сопротивление конденсатора |
U= I*R | I=U/R | R=U/I | P=Ur*I | Rc=2*π*£*C(ф); Rc=314*C(ф) |
Подбираем резистор для светодиода. В этой формуле напряжение сети принимается за 320В, поскольку необходимо учитывать не номинальный параметр, а эффективное амплитудное напряжение.
Подбираем резистор
Подключение кнопки в режиме INPUT_PULLUP
В указанной выше схеме мы использовали резистор, называемый подтягивающим, для формирования определенного уровня сигнала на цифровом порту. Но есть другой способ подключить кнопку без резистора, используя внутренне сопротивление платы ардуино. В блоке setup мы должны всего лишь определить тип пина, к которому подключим кнопку, как INPUT_PULLUP.
Альтернативным вариантом будет выбрать режим пина как OUTPUT и установить на данный порт высокий уровень сигнала. Встроенный подтягивающий резистор подключиться автоматически.
И все. Можно собрать вот такую сложную схему и работать с кнопкой в скетче.
Инструкция по подключению кнопки
В платформы включены тактовые кнопки Ардуино, состоящие из переключателя с 2 парами контактов, соединенных между собой. Подобная система не позволяет создать больше, чем 1 выключатель, зато дает возможность управления 2 параллельными сегментами сразу.
Без резистора
Перед подключением нужно уделить внимание размыкающим контактам. По сторонам квадратного датчика находятся по 2 ножки, а посередине ножек создается выключатель. Чтобы включить датчик, нужно соединиться с 2 контактами, находящимися максимально близко друг к другу. Другие 2 будут повторять первую пару.
С использованием подтягивающего резистора
В этой схеме датчик подтягивается резистором к «плюсу» и замыкает вход на «землю». Чтобы резистор выполнял свою работу верно, следует добавить сопротивление 10 кОм, при такой величине он сможет притягивать контакт к «земле».
К платформе следует присоединить 3 провода. Первый прикрепить к 1 из ножек, провести через резистор и заземлить. Следующий присоединить ко второй ножке, провести к Arduino-контакту с 5-Вольтовым напряжением. Последний подсоединить к третьей, не имеющей контактов ни с одной из двух предыдущих, и подвести ко второму цифровому, который станет считывать состояние кнопки.
В скетче для этой схемы нажатая кнопка обозначается LOW, вернувшаяся в исходное положение (отпущенная) прописывается как HIGH.
В режиме input-pullup
Позволяет при подключении и в работе обойтись без резистора. В этом случае используется внутреннее сопротивление самой платы. Чтобы написать алгоритм, следует определить пин, к которому планируется подключать кнопку, как INPUT_PULLUP.
Есть альтернативная версия, в которой вместо обозначенной команды можно использовать пин OUTPUT.
Программа для работы с кнопкой на Ардуино
Наконец, мы разобрались с нюансами нашей схемы, и готовы к написанию программы. В уроке по зажиганию светодиода мы познакомились с функциями настройки выводов pinMode и функцией вывода в цифровой порт digitalWrite. На этот раз нам понадобится ещё одна важная функция, которая обеспечивает ввод информации в микроконтроллер:
Эта функция возвращает логическое значение, которое Ардуино считала с заданного контакта. Это означает, что если на контакт подать напряжение +5В, то функция вернет истину*. Если контакт соединить с землей, то получим значение ложь. В языке C++, истина и ложь эквивалентны числам 1 и 0 соответственно.
Для того, чтобы интересующий нас контакт заработал в режиме ввода информации, нам нужно будет установить его в определенный режим:
Наконец, соберем всё вместе, и напишем программу.
Загружаем программу на Ардуино Уно, и проверяем работу программы. Если всё сделано правильно, должно получиться как на картинке:
Ну вот и всё. Теперь мы можем управлять нашими устройствами при помощи кнопок. Если вы уже прошли урок по подключению ЖК дисплея, то мы вполне сможем сделать часы с будильником!
Переключение режимов с помощью кнопки
Для того, чтобы определить, была ли нажата кнопка, надо просто зафиксировать факт ее нажатия и сохранить признак в специальной переменной.
Факт нажатия мы определяем с помощью функции 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 ) мы сразу сравнили вход с нужным нам значением и определили, что кнопка нажата, хотя и на входе сейчас низкий уровень сигнала. И сохранили в переменную статус кнопки. Старайтесь явно указывать все выполняемые вами логические операции, чтобы делать свой код более прозрачным и избежать лишних глупых ошибок.
Как переключать режимы работы после нажатия кнопки?
Часто возникает ситуация, когда мы с помощью кнопок должны учитывать факт не только нажатия, но и отпускания кнопки. Например, нажав и отпустив кнопку, мы можем включить свет или переключить режим работы схемы. Другими словами, нам нужно как-то зафиксировать в коде факт нажатия на кнопку и использовать информацию в дальнейшем, даже если кнопка уже не нажата. Давайте посмотрим, как это можно сделать.
Логика работы программы очень проста:
- Запоминаем факт нажатия в служебной переменной.
- Ожидаем, пока не пройдут явления, связанные с дребезгом.
- Ожидаем факта отпускания кнопки.
- Запоминаем факт отпускания и устанавливаем в отдельной переменной признак того, что кнопка была полноценно нажата.
- Очищаем служебную переменную.
Как определить нажатие нескольких кнопок?
Нужно просто запомнить состояние каждой из кнопок в соответствующей переменной или в массиве ардуино. Здесь главное понимать, что каждая новая кнопка – это занятый пин. Поэтому если количество кнопок у вас будет большим, то возможно возникновение дефицита свободных контактов. Альтернативным вариантом является использование подключения кнопок на один аналоговый пин по схеме с резистивным делителем. Об этом мы поговорим в следующих статьях.
Отключение цепи индикации
При необходимости элементы подсветки можно удалить. Такая потребность может возникнуть, например, при неприятном мигании светодиодных или энергосберегающих ламп, вызванном протеканием малого тока через ограничивающий элемент. Эта проблема может быть решена другими способами, но может случиться, что удаление индикации – единственный выход. В этом случае понадобятся кусачки небольшого размера.
Работу по удалению цепочки индикации можно проводить на демонтированном приборе, а можно выключатель со светодиодом не демонтировать, лишь снять декоративные пластиковые детали. В любом случае перед началом работ надо отключить питание сети освещения коммутационным прибором в распредщите. После этого убедиться в отсутствии напряжения непосредственно на выключателе.
После получения доступа к внутреннему устройству аппарата достаточно перекусить любой вывод светодиода. Это разомкнет цепь индикации. Но лучше полностью удалить LED или неонку, чтобы избежать случайных замыканий отрезанными выводами.
Возможно, удаления пластиковых деталей будет недостаточно, чтобы получить доступ к цепочке подсветки. В этом варианте надо будет продолжить разборку прибора. В большинстве случаев для этого не обойтись без демонтажа включателя с места установки.
В видео очень быстро удаляют светодиод из выключателя.
Схема подключения кнопки к Arduino.
Установим на макетную плату тактовую кнопку, и подключим одну ножку к +5v, вторую ножку, с помощью подтягивающего резистора, подключим к GND.
Это необходимо сделать, чтобы кнопка не была в «подвешенном» состоянии. Если не поставить подтягивающий резистор, то в состоянии, когда кнопка не нажата, на контакте Arduino будет неустановившееся состояние: и не логический ноль, и не логическая единица. Вот почему важно ставить подтягивающий резистор.
Можно использовать встроенный в Arduino подтягивающий резистор. Тогда измениться схема подключения и код, но об этом поговорим в следующих уроках.
ОБОРУДОВАНИЕ ТЕХНОЛОГИИ РАЗРАБОТКИ
В этом уроке напишем первую программу, научимся считывать значение цифровых входов и устанавливать состояние выходов. Реализуем управление такими простыми элементами, как кнопка и светодиод.
Предыдущий урок Список уроков Cледующий урок
Первая программа должна управлять светодиодом с помощью кнопки:
- при нажатой кнопке светодиод светится;
- при отжатой кнопке светодиод не светится.
Подключение кнопки и светодиода к плате Ардуино.
Для связи с внешними элементами в контроллере Arduino UNO существуют 14 цифровых выводов. Каждый вывод может быть определен программой как вход или выход.
У цифрового выхода есть только два состояния высокое и низкое. Высокое состояние соответствует напряжению на выходе порядка 5 В, низкое состояние – 0 В. Выход допускает подключение нагрузки с током до 40 мА.
Когда вывод определен как вход, считав его состояние, можно определить уровень напряжения на входе. При напряжении близком к 5 В (реально более 3 В) будет считано высокое состояние, соответствующее константе HIGH. При напряжении близком к 0 (менее 1,5 В) будет считано низкое состояние, или константа LOW.
Светодиод мы должны подключить к выводу, определив его как выход, а кнопка подключается к выводу с режимом вход.
Светодиод подключается через резистор, ограничивающий ток. Вот типичная схема.
Резистор рассчитывается по формуле I = Uвыхода – Uпадения на светодиоде / R.
Uвыхода = 5 В, Uпадения на светодиоде можно принять равным 1,5 В (более точно указывается в справочнике). Получается, то в нашей схеме ток через светодиод задан на уровне 10 мА.
Можете выбрать любой вывод, но я предлагаю для простоты соединений использовать светодиод, установленный на плате. Тот самый, который мигал в первом тестовом примере. Он подключен к цифровому выводу 13. В этом случае дополнительный светодиод к плате подключать не надо.
Кнопку подключаем к любому другому выводу, например, 12. Аппаратная часть схемы подключения кнопки должна обеспечивать уровни напряжений 0 В при нажатой кнопке и 5 В при свободной. Это можно сделать простой схемой.
При отжатой кнопке резистор формирует на выводе 5 В, а при нажатой – вход замыкается на землю. Рекомендации по выбору резистора я напишу в заключительном уроке про кнопки. Сейчас предложу другой вариант. Все выводы платы имеют внутри контроллера резисторы, подключенные к 5 В. Их можно программно включать или отключать от выводов. Сопротивление этих резисторов порядка 20-50 кОм. Слишком много для реальных схем, но для нашей программы и кнопки, установленной вблизи контроллера, вполне допустимо.
В итоге схема подключения будет выглядеть так.
Кнопку можно припаять на проводах к разъему. Я установил ее на макетную плату без пайки. Купил специально для демонстрации уроков.
Функции управления вводом/выводом.
Для работы с цифровыми выводами в системе Ардуино есть 3 встроенные функции. Они позволяют установить режим вывода, считать или установить вывод в определенное состояние. Для определения состояния выводов в этих функциях используются константы HIGH и LOW, которые соответствуют высокому и низкому уровню сигнала.
pinMode(pin, mode)
Устанавливает режим вывода (вход или выход).
Аргументы: pin и mode.
- pin – номер вывода;
- mode – режим вывода.
mode = INPUT | вывод определен как вход, подтягивающий резистор отключен |
mode = INPUT_PULLUP | вывод определен как вход, подтягивающий резистор подключен |
mode = OUTPUT | вывод определен как выход |
Функция не возвращает ничего.
digitalWrite(pin, value)
Устанавливает состояние выхода (высокое или низкое).
Аргументы pin и value:
- pin – номер вывода;
- value – состояние выхода.
value = LOW | устанавливает выход в низкое состояние |
value = HIGH | устанавливает выход в высокое состояние |
Функция не возвращает ничего.
digitalRead(pin)
Считывает состояние входа.
Аргументы: pin — номер вывода.
Возвращает состояние входа:
digitalRead(pin) = LOW | низкий уровень на входе |
digitalRead(pin) = HIGH | высокий уровень на входе |
Программа управления светодиодом.
С учетом предыдущего урока теперь у нас есть вся необходимая информация для написания программы. Программа в Ардуино состоит из двух функций setup() и loop. В setup() мы устанавливаем режимы выводов, а в loop() считываем состояние кнопки в переменную buttonState и передаем его на светодиод. По пути инвертируем, т.к. при нажатой кнопке низкое состояние сигнала, а светодиод светится при высоком.
/* Программа scetch_5_1 урока 5 Зажигает светодиод (вывод 13) при нажатии кнопки (вывод 12) */ boolean buttonState; // создаем глобальную переменную buttonState void setup() < pinMode(13, OUTPUT); // определяем вывод 13 (светодиод) как выход pinMode(12, INPUT_PULLUP); // определяем вывод 12 (кнопка) как вход >
Для хранения промежуточного значения состояния кнопки создаем переменную buttonState с типом boolean. Это логический тип данных. Переменная может принимать одно из двух значений: true (истинно) или false (ложно). В нашем случае — светодиод светится и не светится.
Скопируйте или перепишите код программы в окно Arduino IDE. Загрузите в контроллер и проверьте.
Для сохранения проектов Ардуино я создал папку d:Arduino ProjectsLessonsLesson5. В каждом уроке программы называю scetch_5_1, scetch_5_2, … Вы можете поступать также или ввести свою систему сохранения файлов.
buttonState = digitalRead(12); // считываем состояние 12 входа (кнопки) и записываем в buttonState buttonState = ! buttonState; // инверсия переменной buttonState digitalWrite(13, buttonState); // записываем состояние из buttonState на выход 13 (светодиод)
можно записать без использования промежуточной переменной buttonState.
В качестве аргумента для функции digitalWrite() выступает функция digitalRead(). Хороший стиль это именно такой вариант. Не требуются дополнительные переменные, меньше текст.
Т.е. функцию можно использовать как аргумент другой функции. Функции можно вызывать из функций.
Другой вариант этой же программы, использующий условный оператор if.
// бесконечный цикл void loop()
В бесконечном цикле проверяется состояние вывода 12 (кнопка), и если оно низкое (LOW), то на выводе 13 (светодиод) формируется высокое состояние (HIGH). В противном случае состояние светодиода низкое (LOW).
Директива #define.
Во всех примерах для функций ввода/вывода мы указывали аргумент pin, определяющий номер вывода, в виде конкретного числа — константы. Мы помнили, что константа 12 это номер вывода кнопки, а 13 – номер вывода светодиода. Гораздо удобнее работать с символьными именами. Для этого в языке C существует директива, связывающая идентификаторы с константами, выражениями.
Директива #define определяет идентификатор и последовательность символов, которая подставляется вместо идентификатора, каждый раз, когда он встречается в тексте программы.
В общем виде она выглядит так:
#define имя последовательность_символов
Если в наших программах мы напишем:
#define LED_PIN 13 // номер вывода светодиода равен 13
то каждый раз, когда в программе встретится имя LED_PIN, при трансляции вместо него будет подставлены символы 13. Функция включения светодиода выглядит так:
Окончательный вариант программы с использованием #define.
/* Программа урока 5 Зажигает светодиод (вывод 13) при нажатии кнопки (вывод 12) */ #define LED_PIN 13 // номер вывода светодиода равен 13 #define BUTTON_PIN 12 // номер вывода кнопки равен 12
// бесконечный цикл void loop()
Обратите внимание, что после директивы #define точка с запятой не ставится, потому что это псевдо оператор. Он не совершает никаких действий. Директива задает константы, поэтому принято имена для нее писать в верхнем регистре с разделителем – нижнее подчеркивание.
В следующем уроке будем бороться с дребезгом кнопки, разобьем программу на блоки и создадим интерфейс связи между блоками.
Предыдущий урок Список уроков Cледующий урок
Автор публикации
не в сети 15 часов
Эдуард
Комментарии: 1690Публикации: 173Регистрация: 13-12-2015