Программируем Arduino. Профессиональная работа со скетчами. - страница 11

стр.

Мы уже сталкивались с одной из разновидностей массивов в предыдущем разделе, где знакомились с монитором последовательного порта. Сообщения, такие как «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


// sketch 01_06_analog

int analogPin = A0;

void setup()

{

  Serial.begin(9600);

}

void loop()

{

  int rawReading = analogRead(analogPin);

  float volts = rawReading / 204.6;

  Serial.println(volts);

  delay(1000);

}

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


Рис. 1.16. Вывод значений напряжения


ВНИМАНИЕ

Не замыкайте между собой контакты электропитания (5V, 3.3V и GND). Это может привести к выходу из строя платы Arduino, а может быть, и компьютера.

Если теперь один конец скрепки оставить соединенным с контактом A0, а другой подключить к контакту 5V, числа в мониторе изменятся и будут близки к 5 В. Теперь соедините контакт A0 с контактом GND, и вы увидите числа 0 В.


Аналоговые выходы

Плата Arduino Uno не имеет настоящих аналоговых выходов (такие выходы вы найдете на плате Arduino Due), но она имеет несколько выходов с широтно-импульсной модуляцией (Pulse-Width Modulation, PWM). Они имитируют аналоговые выходы, управляя длительностью импульсов (рис. 1.17).


Рис. 1.17. Широтно-импульсная модуляция


Чем длиннее положительный импульс, тем выше среднее напряжение на выходе. Так как импульсы следуют с частотой 500 раз в секунду, а большинство устройств, которые вам доведется подключать к выходам PWM, не обладают мгновенной реакцией, возникает эффект изменения напряжения.