В цьому експерименті ми відправляємо пристрою (макетка зі світлодіодом) команди, як йому світити через USB канал.

#define LED_PIN 9
// для роботи з текстом існують об'єкти-рядки (англ. string)
String message ;
недійсні установки ( )
{
pinMode ( LED_PIN, OUTPUT ) ;
Послідовний. починають ( 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. Якщо після цифр, що йдуть на початку рядка, будуть символом не-цифри, на них конверсія зупинться.
- Зверніть увагу на меню, що випадає внизу монітора порту: щоб наше пристрій отримувало символ перекладу рядка, там повинно бути вибрано «Новий рядок (NL)»
- Порожній рядок позначається так: "". Спустошивши її, ми готові збирати нову послідовність символів.