Що таке Serial Println?
Serial. print() та Serial. println() – це основні функції Arduino для передачі інформації від плати Ардуін до комп'ютера через послідовний порт.
Що робить Serial Begin?
begin() Ініціює послідовне з'єднання та задає швидкість передачі даних у біт/c (бод).
Як вивести дані в Монітор порту Ардуїно?
Arduino на моніторі порту Кракозябри Щоб надсилати дані до послідовного порту з комп'ютера та керувати Ардуїно, використовується команда Serial. read(); для прийому даних та Serial. parseInt(); для читання великих чисел.
AlexGyver Technologies
Монітор порту, налагодження
Serial Monitor. Спілкуємось із комп'ютером
Для спілкування між платою Arduino та комп'ютером або іншим пристроєм у контролері використовується інтерфейс UART або USART, який у поєднанні з вбудованим у UNO USB-to-UART конвертером дозволить встановити двонаправлений зв'язок із комп'ютером через віртуальний послідовний порт. У деяких моделей Arduino може бути кілька портів. Порт з'єднується через цифровий пін 0 (RX) та 1 (TX) при підключенні до комп'ютера через USB, тому не використовуйте піни 0 та 1 для введення/виведення.
Раніше на старих комп'ютерах були COM-порти, зараз вони створюються віртуально за допомогою FTDI мікросхеми, коли ми підключаємо плату до комп'ютера через USB.
Вам часто доведеться використовувати спілкування між пристроями для обміну інформацією. Можна посилати сигнал з комп'ютера, наприклад, з клавіатури, так і приймати сигнали з плати. Це корисно, щоб дізнатися, що відбувається з сигналом з потрібного виведення плати.
Arduino IDE має спеціальний значок із зображенням лупи, який запускає Serial Monitor (Монітор порту).
Для коректної роботи з портом потрібно виконання двох умов: вибрати правильний COM-порт, вибрати швидкість роботи в скетчі, яка повинна співпадати зі швидкістю, вибраною в моніторі порту.
Для спілкування використовується клас Serial. У методі setup() ми відкриваємо порт для спілкування функцією Serial.begin() із зазначенням швидкості у бодах (baud). Бод – це кількість змін сигналу в секунду. У нашому випадку сигнали можуть бути тільки двійковими, тому швидкість в бодах відповідає швидкості в бітах в секунду. Можна використовувати будь-яку швидкість, головне щоб на приймальній стороні, що передає, вони були однаковими. Доступні швидкості можна переглянути в налаштуваннях порту. Значення 9600 є стандартним і його можна не змінювати (9600 бод – 960 символів – один стартовий біт, вісім біт на сам символ та кінцевий біт). Якщо встановити неправильну швидкість, замість даних отримаємо "сміття" – дані, які не можна обробити. Для обміну даними між іншими компонентами швидкість може бути вищою, наприклад між платою і Bluetooth-модулем.
На платах Arduino Mega та Arduino Due доступні також Serial1, Serial2, Serial3.
Щоб надіслати повідомлення до порту, використовуються методи print() (символи йдуть поспіль) або println() (З переведенням на новий рядок).
Давайте виведемо якесь повідомлення. Це можна зробити у методі setup()тому що нам не потрібно повторювати одну і ту ж фразу нескінченно. Метод loop() залишаємо порожнім.
Якщо посилаємо рядок, то обрамляємо його лапками. Якщо число, то лапки не використовуємо. Змінимо функцію setup().
Можна замінити рядки та числа на змінні. Перепишемо приклад.
String cat = "А у кішки"; int leg = 4; void setup() < Serial.begin(9600); Serial.print(cat); Serial.print(leg); Serial.println("ноги,"); Serial.print("А ззаду у неї довгий хвіст."); >void loop()
Трохи про числа.При роботі з дробовими числами можна вказати число знаків після коми.
Робота з масивами та рядками
Розберемо приклад відправлення рядків у випадковому порядку. Будь-який рядок є масивом символів. Тому замість типу String, можна використовувати масив char[]. Для прикладу створимо масив із чотирьох імен і виводитимемо їх у випадковому порядку через різні проміжки часу, використовуючи функцію random().
char* catNames[] = < "Барсик", "Васька", "Мурзик", "Рижик" >; void setup() < Serial.begin(9600); >void loop()
Прийом даних
Виводити дані в порт просто. А ось приймати дані з комп'ютера та інших джерел складніше. При надсиланні даних вони складаються в буфер, чекаючи, коли плата їх прочитає. Об'єм буфера становить 64 байти. Щоб постійно не читати порожній буфер, є спеціальна функція перевірки буфера Serial.available(). Вона повертає число байт, що лежать у буфері. Зазвичай у коді створюють умову перевірки – якщо у буфері більше 0 байт, то виконуємо якісь команди.
Для демонстрації створимо дивний приклад – створимо змінну, надамо їй дані через Serial.read() і попросимо її надіслати отримані дані через Serial.print(). Вийде кругообіг даних або луна.
Перевіряємо на числах. Відправляємо число 9, а отримуємо 57. Якщо ви отримуєте два рядки з числами 57 та 10, то в нижній частині вікна виберіть налаштування No line ending замість Newline.
Спробуємо також надіслати літеру. Знову замість t повертається 116. Нісенітниця якась. Все просто, функція read() працює з символьними значеннями, і ми бачимо код символу зі стандартної таблиці символів ASCII.
Щоб вирішити проблему, потрібно змінити тип даних на char.
Наче проблема вирішена. Ми можемо приймати окремі цифри та літери. Але літери лише англійські, а числа лише однозначні.
Якщо ми плануємо працювати лише з однозначними числами, можна написати такий код.
Рішення якесь половинчасте. А як бути з великими числами чи словами?
Якщо відправити двозначне число 23, відповідь розбивається на частини – 2 і 3. Виходить, що змінна отримає останнє число 3 (проміжні значення перезаписуються). Щоб обробити все число, потрібно використати метод parseInt().
Тепер можна вводити будь-які числа. Але, напевно, тепер ви помітите невелику затримку у відповідях. Метод у собі перемелює дані. До речі, можна використовувати і звичайні символи. Якщо набір символів складається лише з літер, то повернеться 0. Якщо траплятимуться і цифри, повертатимуться цифри. Спробуйте комбінувати різні поєднання цифр та букв, щоб зрозуміти, як будуть оброблятися дані.
Управління світлодіодом з клавіатури
Напишемо приклад управління вбудованим світлодіодом із клавіатури. Якщо натиснуто клавішу 1, то світлодіод повинен спалахнути, при натисканні клавіші 0 вимкнемо світлодіод.
int ledPin = 13; byte incomingByte; void setup() <pinMode(ledPin, OUTPUT); Serial.begin(9600); >void loop() < if (Serial.available() >0) < incomingByte = Serial.read(); if(incomingByte == '1')< digitalWrite(ledPin, HIGH); >else if (incomingByte == '0') < digitalWrite(ledPin, LOW); >Serial.print("I received: "); Serial.println(incomingByte, DEC); > delay (10); >
Частина коду нам вже знайома – ми використовуємо вбудований світлодіод під номером 13.
Сигнал від комп'ютера надходить у вигляді байта. Створюємо нову змінну incomingByte для цих цілей.
Послідовний порт включається командою begin() із зазначенням швидкості.
Якщо з комп'ютера надходить сигнал, функція available() поверне кількість байт, доступну для читання. Таким чином, ми просто переконуємось, що якийсь сигнал прийшов (більше за нуль).
Після першої перевірки ми перевіряємо введений символ, який може бути представлений як байт. Якщо символ дорівнює одиниці, то вмикаємо світлодіод, як ми робили раніше. Якщо символ дорівнює 0, то вимикаємо.
Як це виглядає практично. Заливаємо скетч та запускаємо Serial Monitor (Ctrl+Shift+M). У вікні Serial Monitor нагорі є текстове поле. Вводимо до нього числа 1 або 0 і натискаємо кнопку Send. Можна також натиснути клавішу Enter для швидкого введення.
Для загального розвитку до скетчу додано також два рядки коду, що визначають код натиснутої клавіші. Таким чином, ви можете дізнатися код для клавіш 0 і 1. Ви також можете натискати і на інші клавіші, вони не вплинуть на світлодіод, але ви побачите коди клавіш.
Трохи складніший приклад, коли рядок заданий у вигляді масиву та символи виводяться по черзі.
#define ARRAY_SIZE 12 //global variable definition char hello[ARRAY_SIZE] = <'h','e','l','l','o','','k','i','t' ,'t','y','!'>; void setup() < Serial.begin(9600); >void loop() < //print characters з array to serial monitor for(int x = 0; x < ARRAY_SIZE; x++) < Serial.print(hello[x]); delay(250); >Serial.println(); delay(250); >
Функція Serial.end() закриває послідовне з'єднання, порти RX і TX звільняються і можуть бути використані для введення/виведення.
У різних уроках ви прийматимете сигнали від плати Arduino. Це корисно, наприклад, для налагодження програми, коли ви виводите повідомлення і по них орієнтуєтеся, яка частина програми працює, а яка – ні. Здатність спілкування між Arduino та комп'ютером дуже важлива. Ви можете приймати сигнали не тільки в Arduino IDE, але і в інших програмах на комп'ютері. Наприклад, у зв'язці з Arduino часто використовують додаток Processing, в якому малюють графіки сигналів, що надходять.
Якщо ви більше не потребуєте отримання даних, то закривайте вікно Serial Monitor.
Також існує бібліотека SoftwareSerial. Вона дозволяє здійснити послідовну передачу даних через інші цифрові контакти Arduino.
Інші варіанти
Читання даних із послідовного порту можливо іншими способами. Шукайте розширення, наприклад, Arduino Chrome Serial Monitor.На відео можна переглянути, як створити розширення самостійно.
На C# також можна написати програму, яка вмітиме зчитувати дані.
Processing також може працювати з послідовним портом.
Додаткове читання
ASCIITable – роздруковуємо таблицю символів ASCII у різних форматах
Serial println як користуватися
Функція виводить через послідовний порт заданий ASCII текст у вигляді, зрозумілому для людини. Ця команда може мати кілька різних форм. При виведенні числа кожної його цифри відповідає один символ ASCII. Дробові числа теж виводяться у вигляді ASCII-цифр, при цьому після коми за замовчуванням залишаються два десяткові знаки. Байти виводяться у вигляді окремих символів, а символи та рядки виводяться без змін – "як є". Наприклад:
- Serial.print(78) – виведе "78"
- Serial.print(1.23456) – виведе "1.23"
- Serial.print('N') – виведе "N"
- Serial.print("Hello world.") – виведе "Hello world."
Необов'язковий другий параметр задає формат виводу; цей параметр може приймати наступні значення: BIN (двійкова система з основою 2), OCT (вісімкова система з основою 8), DEC (десяткова система з основою 10), HEX (шістнадатирічна система з основою 16). Для числа з плаваючою точкою цей параметр визначає кількість десяткових знаків після коми. Наприклад:
- Serial.print(78, BIN) – виведе "1001110"
- Serial.print(78, OCT) – виведе "116"
- Serial.print(78, DEC) – виведе "78"
- Serial.print(78, HEX) – виведе "4E"
- Serial.println(1.23456, 0) – виведе "1"
- Serial.println(1.23456, 2) – виведе "1.23"
- Serial.println(1.23456, 4) – виведе "1.2346"
Функції Serial.print() можна передавати і рядки, записані у флеш-пам'ять контролера. Для цього їх потрібно укласти в конструкцію F(). Наприклад:
Для надсилання окремого байта використовуйте функцію Serial.write().
Синтаксис
Serial.print(val) Serial.print(val, format)
Параметри
val: значення, яке необхідно вивести – будь-який тип даних
format: визначає систему числення (для цілих типів), а також кількість десяткових знаків після коми (для чисел з плаваючою точкою).
Значення, що повертаються
size_t(long): функція print() повертає кількість виведених байт. Зчитування цього значення необов'язково.
приклад
/* Використання циклу FOR для обробки даних та виведення чисел у різних форматах. */ int x = 0; // Змінна void setup() < Serial.begin(9600); // відкриваємо послідовний порт швидкості 9600 бод >void loop() < // print labels Serial.print("NO FORMAT"); // виводимо мітку Serial.print("\t"); // Виводимо символ табуляції Serial.print("DEC"); Serial.print("\t"); Serial.print("HEX"); Serial.print("\t"); Serial.print("OCT"); Serial.print("\t"); Serial.print("BIN"); Serial.print("\t"); for(x=0; x< 64; x++)< // трохи ASCII-графіки, можете змінити код на свій смак // виводимо значення в різних форматах: Serial.print(x); // виводимо як десяткове число - те саме, що і формат "DEC" Serial.print("\t"); // Виводимо символ табуляції Serial.print(x, DEC); // виводимо десяткове число ASCII-символами Serial.print("\t"); // Виводимо символ табуляції Serial.print(x, HEX); // виводимо шістнадатиричне число ASCII-символами Serial.print("\t"); // Виводимо символ табуляції Serial.print(x, OCT); // виводимо восьмиричне число ASCII-символами Serial.print("\t"); // Виводимо символ табуляції Serial.println(x, BIN); // виводимо двійкове число ASCII-символами // із символом повернення каретки, який додає функція "println" delay (200); // затримка 200 мілісекунд >Serial.println(""); // Виводимо ще один символ повернення каретки >
Порада
У всіх версіях Ардуїно, починаючи з версії 1.0, послідовна передача даних здійснюється асинхронно, внаслідок чого функція Serial.print() завершується до відправлення даних.