Загрузите следующий скетч:
// 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"};
void setup()
{
Serial.begin(9600);
}
void loop()
{
int delayPeriod = random(2000, 8000);
delay(delayPeriod);
int messageIndex = random(4);
Serial.println(messages[messageIndex]);
}
Все сообщения, или строки, как часто называют коллекции символов, имеют тип char*. Символ звездочки (*) говорит о том, что это указатель на что-то. Подробнее об указателях будет рассказываться в главе 6. Квадратные скобки ([]) в конце объявления переменной указывают, что данная переменная хранит массив данных типа char*, а не единственное значение char*.
Внутри функции loop переменной delayPeriod присваивается случайное значение из диапазона от 2000 до 7999 (второй аргумент random не входит в диапазон). Затем вызовом функции delay выполняется пауза, продолжительность которой равна полученному промежутку.
Переменной messageIndex также присваивается случайное значение с помощью команды random, но на этот раз ей передается единственный параметр, в результате чего она возвращает случайное число в диапазоне от 0 до 3, которое затем используется как индекс сообщения для отправки в монитор порта.
Наконец, сообщение, находящееся в выбранной позиции, посылается в монитор порта. Опробуйте этот скетч, не забыв открыть окно монитора последовательного порта.
Аналоговые входы
Контакты с метками от A0 до A5 на плате Arduino можно использовать для измерения приложенного к ним напряжения. Уровень напряжения должен находиться в диапазоне от 0 до 5 В. Измерение выполняется с помощью встроенной функции analogRead, которая возвращает значение в диапазоне от 0 до 1023: значение 0 соответствует напряжению 0 В, а значение 1023 — напряжению 5 В. То есть, чтобы преобразовать число в значение, находящееся в диапазоне от 0 до 5, нужно разделить полученное число на 5: 1023/5 = 204,6.
Тип данных int не очень хорошо подходит для измерения напряжения, так как представляет только целые числа, а нам было бы желательно видеть также дробную часть. Для этого следует использовать тип данных float.
Загрузите следующий скетч в плату Arduino и затем замкните скрепкой контакты A0 и 3.3V (рис. 1.15).
Рис. 1.15. Соединение контактов A0 и 3.3V