Программируем Arduino. Основы работы со скетчами - Монк Саймон
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 из предыдущего скетча, она просто включает и выключает светодиод один раз с указанной задержкой.
Цифровые входы могут соединяться с цифровыми выходами других модулей, которые действуют не так, как выключатель, но устанавливают те же уровни напряжения HIGH и LOW. В таких случаях функции pinMode следует передавать аргумент INPUT вместо INPUT_PULLUP.
Цифровые выходы
Немного нового можно сказать о цифровых выходах с точки зрения программирования после экспериментов с контактом 13, к которому подключен встроенный светодиод.
Настройка контактов на работу в режиме цифровых выходов осуществляется в функции setup с помощью следующей команды:
pinMode(outputPin, OUTPUT);
Чтобы на цифровом выходе установить уровень напряжения HIGH или LOW, нужно вызывать команду digitalWrite:
digitalWrite(outputPin, HIGH);
Монитор последовательного порта
Так как плата Arduino подключается к компьютеру через порт USB, есть возможность пересылать сообщения между ними, используя компонент Arduino IDE, который называется монитором последовательного порта (Serial Monitor). Для иллюстрации изменим скетч 01_03 так, чтобы вместо изменения частоты мигания светодиода после установки уровня напряжения LOW на цифровом входе 7 он посылал сообщение.
Загрузите следующий скетч:
// sketch 01_04_serial
int switchPin = 7;
void setup()
{
pinMode(switchPin, INPUT_PULLUP);
Serial.begin(9600);
}
void loop()
{
if (digitalRead(switchPin) == LOW)
{
Serial.println("Paperclip connected");
}
else
{
Serial.println("Paperclip NOT connected");
}
delay(1000);
}
Теперь откройте монитор последовательного порта в Arduino IDE, щелкнув на кнопке с изображением, напоминающим лупу. Вы сразу же должны увидеть несколько сообщений, появляющихся одно за другим (рис. 1.14).
Рис. 1.14. Монитор последовательного порта
Разъедините контакты, убрав скрепку, и вы должны увидеть, что текст сообщения изменился.
Так как встроенный светодиод в этом скетче не используется, отпала и необходимость в переменной ledPin. Зато появилась новая команда Serial.begin, запускающая обмен сообщениями через последовательный порт. Ее параметр определяет скорость передачи. Подробнее о взаимодействиях через последовательный порт рассказывается в главе 13.
Чтобы записать сообщение в монитор порта, достаточно выполнить команду Serial.println.
В данном примере Arduino посылает сообщения в монитор последовательного порта.
Массивы и строки
Массивы предназначены для хранения списков значений. Переменные, которые нам встречались до сих пор, могли хранить только одно значение, обычно типа int. Массив, напротив, может хранить список значений и позволяет обращаться к отдельным значениям по их позициям в списке.
В C, как и в большинстве других языков программирования, нумерация позиций в массиве начинается с 0, а не с 1. Это означает, что первый элемент фактически является нулевым элементом.
Мы уже сталкивались с одной из разновидностей массивов в предыдущем разделе, где знакомились с монитором последовательного порта. Сообщения, такие как «Paperclip NOT connected» (скрепка не замыкает контакты), называют массивами символов, потому что фактически они являются коллекциями символов.
Например, научим Arduino посылать в монитор порта всякую чепуху.
Следующий скетч имеет массив массивов символов. Он выбирает их по одному в случайном порядке и посылает в монитор последовательного порта через случайные интервалы времени. Попутно этот скетч показывает, как в Arduino получать случайные числа.
// sketch 01_05_gibberish
char* messages[] = {
"My name is Arduino",
"Buy books by Simon Monk",
"Make something cool with me",
"Raspberry Pis are fruity"};