Задача 1. Определение момента клика тактовой кнопки
Урок 5-6.
|
Для любознательных http://wiki.amperka.ru/
Программирование
Условная конструкция:
| |||||
В общем видеIf конструкциявыглядит так:
А если необходимо выбрать один
вариант из трех, четырех предложенных?
В таком случае используется
конструкция switch
Пояснения.
После слова ставится переменная, значение которой мы оцениваем. Далее после словасaseмы перебираем значения, которые она может принимать, и для каждого значения описываем команды, которые должны исполняться в случае, если значение переменной равно указанному значению. Каждый сaseдолжен заканчиваться командой вreak. Если забыть это сделать, то в этом случае продолжится исполнение кода, следующего после очередного сase, что в большинстве случаев не предполагается и приводит к неожиданным результатам.
Метка default обозначает все случаи, которые не учтены ни в одномсase . Меткуdefault можно и не использовать.
Решение задач
1. Вычислить значение функции
2.
|
Задача 1. Кнопочный переключатель
Светодиод должен включаться и выключаться Принципиальная схема
при нажатии кнопки
Список деталей для эксперимента
· 1 плата Arduino Uno
· 1 беспаечная макетная плата
· 1 тактовая кнопка
· 1 резистор номиналом 220 Ом
· 1 светодиод
· 5 проводов «папа-папа»
Для дополнительного задания
§ еще 1 кнопка
§ еще 2 провода
|
Скетч
#define BUTTON_PIN 3
#define LED_PIN 13
boolean buttonWasUp = true; // была ли кнопка отпущена?
boolean ledEnabled = false; // включен ли свет?
void setup()
{
pinMode(LED_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
}
void loop()
{
// определить момент «клика» несколько сложнее, чем факт того, что кнопка сейчас просто нажата. Для
// определения клика мы сначала понимаем, отпущена ли кнопка прямо сейчас...
boolean buttonIsUp = digitalRead(BUTTON_PIN);
// ...если «кнопка была отпущена и (&&) не отпущена сейчас»...
if (buttonWasUp && !buttonIsUp) {
// ...может это «клик», а может и ложный сигнал (дребезг), возникающий в момент замыкания/размыкания // пластин кнопки, поэтому даём кнопке полностью «успокоиться»...
delay(10);
// ...и считываем сигнал снова
buttonIsUp = digitalRead(BUTTON_PIN);
if (!buttonIsUp) { // если она всё ещё нажата...
// ...это клик! Переворачиваем сигнал светодиода
ledEnabled = !ledEnabled;
digitalWrite(LED_PIN, ledEnabled);
}
}
// запоминаем последнее состояние кнопки для новой итерации
buttonWasUp = buttonIsUp;
}
Пояснения к коду
§ Поскольку мы сконфигурировали вход кнопки как INPUT_PULLUP, при нажатии на кнопку на данном входе мы будем получать 0. Поэтому мы получим значение true («истина») в булевой переменнойbuttonIsUp («кнопка отпущена»), когда кнопка отпущена.
§ Логический оператор && («и») возвращает значение «истина» только в случае истинности обоих его операндов. Взглянем на так называемую таблицу истинности для выражения buttonWasUp && !buttonIsUp («кнопка была отпущена и кнопка не отпущена»):
buttonWasUp | buttonIsUp | !buttonIsUp | buttonWasUp && !buttonIsUp |
Здесь рассмотрены все возможные сочетания предыдущего и текущего состояний кнопки и мы видим, что наш условный оператор if сработает только в случае, когда кнопка нажата только что: предыдущее состояние 1 («была отпущена»), а текущее 0 («не отпущена»).
§ Через 10 миллисекунд мы проверяем еще раз, нажата ли кнопка: этот интервал больше, чем длительность «дребезга», но меньше, чем время, за которое человек успел бы дважды нажать на кнопку. Если кнопка всё еще нажата, значит, это был не дребезг.
§ Мы передаем в digitalWrite не конкретное значение HIGH или LOW, а просто булеву переменнуюledEnabled. В зависимости от того, какое значение было для нее вычислено, светодиод будет зажигаться или гаситься.
§ Последняя инструкция в buttonWasUp = buttonIsUp сохраняет текущее состояние кнопки в переменную предыдущего состояния, ведь на следующей итерации loop текущее состояние уже станет историей.
Задача 1. Определение момента клика тактовой кнопки
Одной из типичных задач при создании устройств на микроконтроллерах является определение момента клика тактовой кнопки, чтобы на это можно было как-то отреагировать. Проблема в том, что кнопка, как сенсор, может лишь сообщить зажата ли она сейчас или отпущена. Она не может сообщить, что была «нажата только что».
Но эта проблема легко решается с помощью небольшого приёма в программной части проекта. Давайте сделаем примитивное устройство с диодом и кнопкой, которое бы включало и выключало диод, поочерёдно, при нажатии кнопки: клик — включили, клик — выключили:
Типы переменных:
|