Меняем цвет по нажатию кнопки
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой



Не отключая светодиода, подключим к плате замыкающую кнопку
с подключенными к ней гибкими выводами. Один вывод кнопки
подключим к выводу 3 платы, другой — к любому из выводов GND
(один из которых находится рядом с выводом 13, см. рисунок внизу). Сохраним скетч под новым именем (например, migalka_bitton)
и немного изменим его структуру. В самом начале (до функции
setup), в секции определений, которая у нас пока пустовала, добавим строки:

 

#define BUTTON_PIN 3 // вывод подключения кнопки
#define LED_RED_PIN 13 // вывод управления красным светодиодом
#define LED_GREEN_PIN 12 // вывод управления зеленым светодиодом

 

Таким способом безликим номерам выводов присваиваются читаемые
имена: когда далее в программе вы встречаете обращение к выводу
BUTTON_PIN, понятно, что это вывод, к которому подключена кнопка. Другое удобство такого способа заключается в снижении количества трудно отслеживаемых ошибок при подключении кнопки или светодиода к другому выводу: в программе теперь будет достаточно заменить номера в этих строках, оставив все остальное без изменений. Кстати, все символьные константы, которые мы уже встречали (HIGH, LOW, OUTPUT и т.д.), вводятся именно таким способом: где-то в недрах библиотек Arduino стоит выражение #define HIGH и далее численное значение, которым никто никогда не интересовался. Следует привыкнуть применять такой способ во всех своих программах. Во время преобразования текста в исполняемый код программа компилятор просто тупо подставляет вместо символьного имени число, указанное в директиве #define. Потому при ее применении надо быть предельно внимательным: двойное именование одного и того же числа разными именами ошибкой не считается и при компиляции не отслеживается. Например, если вы в обоих строках для LED_RED_PIN и LED_GREEN_PIN по рассеянности поставите число 13, то программа работать не будет, и вы долго будете разбираться, где тут собака порыта. Мало того, такое двойное именование является легитимным программистским приемом и нередко используется, когда, например, один и тот же вывод в разных частях программы используется в разных целях. Советуем в своих программах избегать подобных двойных именований во избежание путаницы при отладке — лучше уж тогда оставить выводу цифровое обозначение.

Функция setup теперь будет выглядеть таким образом:

 

void setup() {
pinMode(LED_RED_PIN, OUTPUT); // вывод красного – на выход
pinMode(LED_GREEN_PIN, OUTPUT); // вывод зеленым – на выход
pinMode(BUTTON_PIN, INPUT_PULLUP); // вывод кнопки на вход
//с подтягивающим резистором
}

 

Обратите внимание на последнюю строку: вывод, к которому подключена кнопка, подключается на вход, то есть на прием сигналов
(INPUT), что изначально можно было бы вообще не указывать —
в исходном состоянии все выводы контроллера подключены именно для
работы на вход. Однако мы не должны оставлять «висящим в воздухе»
вывод кнопки, ни к чему не подключенный в разомкнутом состоянии.
Вывод контроллера при работе на вход имеет огромное сопротивление,
измеряемое гигаомами, потому он будет непрерывно срабатывать
от наводок. Разомкнутый контакт кнопки обязательно подключают
к какому-нибудь потенциалу с помощью резистора.
Для удобства такие резисторы величиной в пределах 20–50 кОм,
«подтягивающие» вывод к напряжению питания (pullup-резисторы),
встроены прямо в контроллер. Константа INPUT_PULLUP и указывает
функции pinMode на такое подключение1. После выполнения такой команды в разомкнутом состоянии кнопки на выводе BUTTON_PIN все время будет «висеть» логическая единица. Так что наша программа обязана отслеживать момент, когда на нем окажется логический ноль — это и будет означать, что кнопка нажата. Это делает следующая последовательность команд, которую мы размещаем в главном цикле скетча:


void loop() {
if (digitalRead(BUTTON_PIN) == HIGH) { //кнопка не нажата

// включаем зеленый светодиод
digitalWrite(LED_GREEN_PIN, HIGH);
digitalWrite(LED_RED_PIN, LOW);
}
else { //кнопка нажата
// включаем красный светодиод
digitalWrite(LED_GREEN_PIN, LOW);
digitalWrite(LED_RED_PIN, HIGH);
}
}


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

 













































Простая пищалка с кнопкой

 

Из схемы мигалки с кнопкой, что осталась от предыдущего примера,

удалим внешний светодиод и вместо него к выводу 13 подключим пье-

зоизлучатель звука (пьезозвонок). Второй вывод звонка подключим к

свободному выводу «земли» GND, на противоположной стороне платы

Uno (см. рисунок вверху).

Теперь загрузим Arduino IDE и создадим новый проект (Файл | Новый).

Сохраним его под названием, например, pischalka. В начале программы

определим два вывода:

#define BUZZER_PIN 13 // вывод для пищалки (англ. «buzzer»)

#define BUTTON_PIN 3 //вывод подключения кнопки

В функции setup определяем назначение этих выводов: BUZZER_

PIN – на выход, BUTTON_PIN, как и ранее, на вход с подтягивающим

резистором:

void setup() {

pinMode(BUZZER_PIN, OUTPUT); // на выход

pinMode(BUTTON_PIN, INPUT_PULLUP); // вывод кнопки на вход

}

И, наконец, в основном цикле отслеживаем состояние кнопки и

в зависимости от этого включаем или останавливаем звук:

void loop() {

 if (digitalRead(BUTTON_PIN) == LOW) { // кнопка нажата

tone(BUZZER_PIN, 1000); //частота 1000 Гц на пищалку

}

 else { //кнопка отпущена

 noTone(BUZZER_PIN);//прекращаем генерацию;

}

}

Загрузите программу в контроллер и проверьте ее работу. Простейшие
пьезоизлучатели, вроде пьезозвонка, который мы здесь используем, формально говоря, имеют довольно узкий диапазон рабочих частот -
от 1 до 3–4 кГц, и хотя схема будет работать с практически любой
заданной частотой в пределах звукового диапазона, но наиболее разборчивый звук вы получите именно при таких частотах (они соответствуют второй-третьей октавам музыкального ряда).

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

void loop() {

if (digitalRead(BUTTON_PIN) == LOW) { // кнопка нажата

tone(BUZZER_PIN, 1000); //частота 1000 Гц на пищалку




Дата: 2019-05-28, просмотров: 216.