OUTPUT);

}

void loop()

{

  if (digitalRead(5) == LOW)

  {

    digitalWrite(9, HIGH);

  }

}

В этом случае условие (после оператора if) выполняется, если с контакта 5 прочитано значение LOW. Два знака «равно» == обозначают операцию определения равенства двух значений. Ее легко спутать с единственным знаком «равно», обозначающим операцию присваивания значения переменной. Оператор if говорит: если условие истинно (то есть выполняется), то должны быть выполнены команды в фигурных скобках. В данном случае команда, устанавливающая уровень напряжения HIGH на цифровом выходе 9.

Если условие ложно (не выполняется), то Arduino просто перешагнет через фигурные скобки и продолжит выполнение программы. В данном случае будет достигнут конец функции loop, и она запустится снова.

Циклы

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

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

// sketch 01_01_blink_10

int ledPin = 13;

int delayPeriod = 200;

void setup()

{

  pinMode(ledPin, OUTPUT);

}

void loop()

{

  for (int i = 0; i < 10; i++)

  {

    digitalWrite(ledPin, HIGH);

    delay(delayPeriod);

    digitalWrite(ledPin, LOW);

    delay(delayPeriod);

  }

}

ПРИМЕЧАНИЕ

Это наш первый законченный скетч, поэтому его имя указано в строке комментария в начале файла. Все скетчи с подобными именами можно загрузить на веб-сайте автора www.simonmonk.org. Чтобы установить все скетчи в окружение Arduino, распакуйте файл со скетчами в каталог Arduino, который находится в папке Documents (Документы). Среда разработки Arduino IDE автоматически создает эту папку при первом запуске.

Команда for определяет переменную с именем i и присваивает ей начальное значение 0. За точкой с запятой (;) следует текст i<10. Это условие продолжения цикла. Иными словами, пока значение i остается меньше 10, продолжают выполняться команды, заключенные в фигурные скобки.

Последний элемент в команде for — i++. Это сокращенная форма записи выражения i = i + 1, которое прибавляет 1 к значению i. Увеличение значения i на единицу происходит в конце каждого цикла. Это выражение гарантирует прекращение цикла, потому что, увеличивая i на 1, вы в конечном счете получите значение больше 10.

Функции

Функции — это способ группировки программных команд в удобный для использования блок. Функции помогают поделить скетч на управляемые и простые в использовании фрагменты.

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

Прочитайте следующий листинг, а потом я объясню, как он работает.

// sketch 01_02_blink_fast_slow

int ledPin = 13;

void setup()

{

  pinMode(ledPin, OUTPUT);

  flash(10, 100);

}

void loop()

{

  flash(1, 500);

}

void flash(int n, int delayPeriod)

{

  for (int i = 0; i < n; i++)

  {

    digitalWrite(ledPin, HIGH);

    delay(delayPeriod);

    digitalWrite(ledPin, LOW);

    delay(delayPeriod);

  }

}

Функция setup теперь включает строку flash(10, 100);. Она означает: «мигнуть 10 раз с периодом задержки delayPeriod 100 мс». Команда flash не является встроенной командой Arduino — вы создадите эту очень полезную функцию сами.

Определение функции находится в конце скетча. Первая строка в определении функции

void flash(int n, int delayPeriod)

сообщает Arduino, что определяется новая функция с именем flash, которая принимает два параметра, оба типа int. Первый параметр, с именем n, определяет, сколько раз светодиод должен мигнуть, а второй, с именем delayPeriod, определяет величину паузы после включения или выключения светодиода.

Эти два параметра можно использовать только внутри функции. Так, n используется в команде for, где определяет количество повторений цикла, а delayPeriod — внутри команд delay.

Функция loop скетча также использует функцию flash, но с более длинным периодом задержки delayPeriod и количеством повторений, равным 1. Так как эта команда находится внутри функции loop, она будет выполняться снова и снова, заставляя светодиод мигать непрерывно.

Цифровые входы

Чтобы извлечь максимум пользы из данного раздела, найдите короткий кусок провода или просто металлическую скрепку.

Загрузите следующий скетч и запустите его:

// sketch 01_03_paperclip

int ledPin = 13;

int switchPin = 7;

void setup()

{

  pinMode(ledPin, OUTPUT);

  pinMode(switchPin, INPUT_PULLUP);

}

void loop()

{

  if (digitalRead(switchPin) == LOW)

  {

    flash(100);

  }

  else

  {

    flash(500);

  }

}

void flash(int delayPeriod)

{

  digitalWrite(ledPin, HIGH);

  delay(delayPeriod);

  digitalWrite(ledPin, LOW);

  delay(delayPeriod);

}

Используя кусок провода или выпрямленную скрепку, замкните контакты GND и 7, как показано на рис. 1.13. Это можно делать на включенной плате Arduino, но только после выгрузки в нее скетча. Это связано с тем, что некий предыдущий скетч мог настроить контакт 7 на работу в режиме выхода — в этом случае замыкание на GND может повредить контакт. Так как скетч настраивает контакт 7 на работу в режиме входа, его безопасно соединять с контактом GND.

Вот что происходит в результате: когда контакты замкнуты, светодиод мигает чаще, а когда не замкнуты — реже.

Давайте исследуем скетч и посмотрим, как он работает.

Рис. 1.13. Опыт с цифровым входом

Во-первых, в скетче появилась новая переменная с именем switchPin. Этой переменной присвоен номер контакта 7. Скрепка в данном эксперименте играет роль выключателя. В функции setup контакт 7 настраивается на работу в режиме входа командой pinMode. Во втором аргументе команде pinMode передается не просто значение INPUT, а INPUT_PULLUP. Оно сообщает плате Arduino, что по умолчанию вход должен иметь уровень напряжения HIGH, если на него не подан уровень LOW соединением этого контакта с контактом GND (скрепкой).

В функции loop мы используем команду digitalRead для проверки уровня напряжения на входном контакте. Если он равен LOW (скрепка замыкает контакты), вызывается функция с именем flash и значением 100 (в параметре delayPeriod). Это заставляет светодиод мигать чаще.

Если входной контакт имеет уровень напряжения HIGH, выполняются команды в разделе else инструкции if. Здесь вызывается та же функция flash, но с более продолжительной задержкой, заставляющей светодиод мигать реже. Функция flash является упрощенной версией функции flash из предыдущего скетча, она просто включает и выключает светодиод один раз с указанной задержкой.

Цифровые входы могут

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату