← Тестер батареек | Оглавление | Перетягивание каната →
В этом эксперименте мы отправляем устройству команды, как ему светить.
#define LED_PIN 9 // для работы с текстом существуют объекты-строки (англ. string) String message; void setup() { pinMode(LED_PIN, OUTPUT); Serial.begin(9600); } void loop() { // передаваемые с компьютера данные поставляются байт за // байтом, в виде отдельных символов (англ. character). Нам // нужно последовательно их обрабатывать пока (англ. while) // в порту доступны (англ. available) новые данные while (Serial.available()) { // считываем (англ. read) пришедший символ в переменную char incomingChar = Serial.read(); // не стоит путать целые числа и символы. Они соотносятся // друг с другом по таблице, называемой кодировкой. Например // '0' — это 48, '9' — 57, 'A' — 65, 'B' — 66 и т.п. Символы // в программе записываются в одинарных кавычках if (incomingChar >= '0' && incomingChar <= '9') { // если пришёл символ-цифра, добавляем его к сообщению message += incomingChar; } else if (incomingChar == '\n') { // если пришёл символ новой строки, т.е. enter, переводим // накопленное сообщение в целое число (англ. to integer). // Так последовательность символов '1', '2', '3' станет // числом 123. Результат выводим на светодиод analogWrite(LED_PIN, message.toInt()); // обнуляем накопленное сообщение, чтобы начать всё заново message = ""; } } // посылайте сообщения-числа с компьютера через Serial Monitor }
String
. Это встроенный класс, предназначенный для работы со строками, т.е. с текстом.string
, который является просто массивом символов. String
же позволяет использовать ряд методов для удобной работы со строками.while
. В отличие от цикла со счетчиком for
, цикл while(expression)
выполняется до тех пор, пока логическое выражение expression
истинно.available()
объекта Serial
возвращает количество байт, полученных через последовательный порт.while
работает до тех пор, пока available()
возвращает ненулевое значение, любое из которых приводится к true
.char
могут хранить один символ.Serial.read()
, который возвращает первый байт, пришедший на последовательный порт, или -1, если ничего не пришло.if
мы сравниваем не пришедший символ с 0 и 9, но их коды. Если пришел какой-то символ, который не является цифрой, мы не будем его добавлять к нашей строке message
.String
позволяют производить конкатенацию, т.е. объединение строк. Это можно сделать так: message = message + incomingChar
, но можно записать в сокращенной форме: message += incomingChar
.if
конструкцией else if
. Это еще один условный оператор, который проверяется только в случае ложности выражения, данного первому оператору. Несколько else if
могут следовать друг за другом, при этом каждое следующее условие будет проверяться только в случае невыполнения всех предыдущих. Если в конце разместить else
, он выполнится только если ни одно из условий не выполнено.\n
кодируется символ переноса строки. Если он был передан устройству, мы передаем полученные ранее символы как параметр для analogWrite()
, которая включает светодиод.String
, toInt()
, который заставляет считать строку не набором цифр, но числом. Он возвращает значение типа long
, при этом, если строка начинается с символа, не являющегося цифрой, будет возвращен 0. Если после цифр, идущих в начале строки, будут символы не-цифры, на них конверсия остновится.""
. Опустошив ее, мы готовы собирать новую последовательность символов.Serial.available()
и Serial.read()
?for
и while
?if … else
?analogWrite()
. Передайте на компьютер сообщение об ошибке, если нет.
Вам может пригодиться один из методов String
: toLowerCase(yourString)
или toUpperCase(yourString)
, которые возвращают переданную строку yourString
, приведенную к нижнему или верхнему регистру соответственно.