Структура програми мовою C дляArduino Амперка
Розглянемо приклад мінімально можливої програми C++ для Arduino, яка нічого не робить:
Розберемося, що тут написано і чому це обов'язково: чому не можна обійтися просто порожнім файлом.
З чого складається програма
Блоки бувають різних видів і який з них коли виконуватиметься залежить від зовнішніх умов. У прикладі мінімальної програми ви можете бачити 2 блоки. У цьому вся прикладі блоки називаються визначенням функції. Функція - це просто блок коду із заданим ім'ям, яким хтось потім може користуватися ззовні.
В даному випадку у нас 2 функції з іменами setup та loop. Їхня присутність обов'язково в будь-якій програмі на C++ для Arduino. Вони можуть нічого і не робити, як у нашому випадку, але мають бути написані. Інакше на стадії компіляції ви отримаєте помилку.
Класика жанру: миготливий світлодіод
Давайте тепер доповнимо нашу програму так, щоб відбувалося хоч щось. На Arduino, до 13-го піна підключений світлодіод. Їм можна керувати, чим ми й займемося.
Скомпілюйте, завантажте програму. Ви побачите, що кожну секунду світлодіод на платі миготить. Розберемося чому цей код призводить до щомиті.
До наших раніше порожніх функцій ми додали кілька виразів. Вони були розміщені між фігурними дужками функцій setup та loop. У setup з'явилося одне вираз, а loop відразу 4.
Тепер зрозуміємо у порядку виконуються самі блоки, тобто. функції setup та loop. Не замислюйтесь поки що означають конкретні висловлювання, просто стежте за порядком.
Якщо пронумерувати вирази по порядку, як вони виконуються, вийде:
Результат від цього не зміниться на йоту: після компіляції ви отримаєте абсолютно еквівалентнийбінарний файл.
Що висловлюють
Тепер давайте спробуємо зрозуміти чому написана програма призводить до миготіння світлодіода.
Як відомо, піни Arduino можуть працювати як виходи і як входи. Коли ми хочемо чимось керувати, тобто видавати сигнал, нам потрібно перевести пінець у стан роботи на вихід. У нашому прикладі ми керуємо світлодіодом на 13-му піні, тому 13-й пін перед використанням потрібно зробити виходом.
Це робиться виразом у функції setup:
Вирази бувають різними: арифметичними, деклараціями, ухвалами, умовними тощо. В даному випадку ми у виразі здійснюємо виклик функції. Пам'ятаєте? Ми маємо свої функції setup і loop , які викликаються чимось, що ми назвали «щось». Так ось тепер ми викликаємо функції, які вже десь написані.
Саме в нашому setup ми викликаємо функцію з ім'ям pinMode. Вона встановлює заданий номер пін у заданий режим: вхід або вихід. Про який пін і про який режим йдеться вказується нами в круглих дужках, через кому, відразу після імені функції. У нашому випадку ми хочемо, щоб 13 пін працював як вихід. OUTPUT означає вихід, INPUT – вхід.
Насправді, ви могли помітити, що наші функції setup і loop також не приймають жодних аргументів. І загадкове «щось» так само викликає їх з порожніми дужками в потрібний момент.
Повернемося до нашого коду. Отже, оскільки ми плануємо вічно блимати світлодіодом, керуючий пін повинен один раз бути зроблений виходом, а потім ми не хочемо згадувати про це. Для цього ідеологічно і призначена функція setup: налаштувати плату як треба, щоб потім з нею працювати.
Перейдемо до функції loop:
Вона, як говорилося, викликається відразу після setup. І викликається знову і знову яклише сама закінчується. Функція loop називається основним циклом програми та ідеологічно призначена для виконання корисної роботи. У нашому випадку корисна робота - блимання світлодіодом.
Пройдемося виразами по порядку. Отже, перший вираз - це виклик вбудованої функції digitalWrite. Вона призначена для подачі на заданий пін логічного нуля (LOW, 0 вольт) або логічної одиниці (HIGH, 5 вольт) У функцію digitalWrite передається 2 аргументи: номер піна та логічне значення. У підсумку, насамперед ми запалюємо світлодіод на 13-му піні, подаючи на нього 5 вольт.
Як тільки це зроблено процесор моментально вдається до наступного виразу. У нас це виклик функції delay. Функція delay - це, знову ж таки, вбудована функція, яка змушує процесор заснути на певний час. Вона приймає лише один аргумент: час у мілісекундах, який слід спати. У нашому випадку це 100 мс.
Поки ми спимо все залишається так, тобто. світлодіод продовжує горіти. Як тільки 100 мс закінчуються, процесор прокидається і відразу переходить до наступного виразу. У прикладі це знову виклик знайомої нам вбудованої функції digitalWrite . Правда цього разу другим аргументом ми передаємо значення LOW. Тобто встановлюємо на 13-му піні логічний нуль, тобто подаємо 0 вольт, тобто гасимо світлодіод.
Після того, як світлодіод погашений, ми приступаємо до наступного виразу. І знову це виклик функції delay. На цей раз ми засинаємо на 900 мс.
Як тільки сон закінчився, функція loop завершується. За фактом завершення «щось» відразу викликає її ще раз і все відбувається знову: світлодіод підпалюється, горить, гасне, чекає і т.д.
Якщо перекласти написане українською, вийде наступний алгоритм: