Чтобы хорошо писать коды, нужно познакомиться с тремя частями языка программирования Arduino. Программирование платы для реализации электронного дизайна требует логики и алгоритма, как и любого другого языка программирования. Логика и алгоритм — это пошаговые процедуры, которым можно следовать для решения проблемы. Следует отметить, что существует несколько логических и алгоритмических способов решения проблемы кодирования в ардуино, однако синтаксис и семантика языка программирования должны оставаться неизменными.
Существует ряд соглашений, при соблюдении их очень легко превратит код из беспорядочного в великолепный.
Программирование требует хорошего знания частей языка программирования, перечисленных ниже:
- Структура
- Функция
- Переменные
- Основные места
- Выделение значений регистров в структуре кода.
- Когда функционировать и когда не функционировать
- Функции установки
- Функция цикла
- Блочные комментарии
- Includes
- Определение констант
- Глобальные переменные
- Что такое управляющие операторы?
- Что такое оператор ‘for’?
- Что представляет собой функция Serial parse Int?
- Что такое String()?
- Что такое массив?
- Что такое функция?
Основные места
Некоторые вещи должны находиться в определенных местах. Когда имеете дело с библиотеками, нужно убедиться, что включили библиотеку в начало кода, и если нужно инициализировать вещи, нужно сделать это в настройке. Вы также захотите создать блок заголовка в верхней части кода, чтобы через год напомнить себе, что именно делает ваш код.
Выделение значений регистров в структуре кода.
Когда начнется работа с более продвинутыми микросхемами можно обнаружить, что у них есть всевозможные регистры, и каждый из них будет иметь дискретный шестнадцатеричный адрес. Они никогда не изменятся при обработке кода, поэтому лучше всего создать константы для использования в коде. Объявления констант идут между вашими инклудами и установкой.
В большинстве языков программирования присутствуют так называемые подпрограммы. Иногда эти подпрограммы возвращают данные, и тогда они называются функциями.
В каждом скетче присутствуют две обязательные функции: setup() и loop(). В скетче может быть сколько угодно методов, но эти две должны быть обязательно, иначе скетч откажется компилироваться.
Когда функционировать и когда не функционировать
Функции — это волшебные существа, которые иногда могут быть слишком маленькими, иногда слишком большими, и очень редко — именно такого размера, чтобы внести порядок в хаос.
Как правило, при записи в микросхему I2C нужно отдать четыре команды: послать адрес I2C, сообщаете микросхеме, в какой регистр вы будете записывать, послать значение регистра, а затем завершить все этой командой endTransmission().
Кроме того, если понадобится использовать код, когда Arduino действует как ведомый компонент, то должна быть готовая функция, которую можно объявить в командах onReceive() и onRequest().
Наконец, необходимая процедура настройки, которая обычно включает в себя несколько назначений конфигурации для нескольких регистров и, возможно, нескольких чипов, всегда будет получать свою собственную функцию под названием либо «SetupMyChip», либо «InitMyChip», чтобы она была аккуратно изолирована от всего остального, включая навязчивые переменные не имеющего правильного масштабирования.
Функции установки
Функция setup() — это место, где размещаем код, который хотим запустить только один раз. Обычно это установка параметров конфигурации, определение констант (переменных не изменяемая) или загрузка библиотек, которые будем использовать позже в функции loop(). Хотя стоит отметить, что ничто не мешает поместить в setup() обыкновенный код. Независимо от того, что вы поместите в нее, она будет выполнена в момент включения Arduino и больше не будет выполняться.
Функция цикла
Функция loop() считается тем местом, где происходит волшебство. Логически это основная программа (или «приложение»), которую выполняет Arduino. Когда код, который написали, завершен, loop() запускается и начинает выполнять его заново. Бесконечно (или пока не выключите).
Блочные комментарии
Блочные комментарии используются для написания заметок в коде. По прошествии времени сам автор и программисты могли прочитать и понять, как работает код или почему написан таким образом. Это способ оставить документацию по ходу работы.
Комментарий блока игнорируется компилятором и не отправляется на Arduino, когда загружаете скетч. Поэтому не занимает памяти в Arduino. Рекомендуется создавать обильно комментарии. Удивительно, насколько сильно помогают, спустя годы (даже через день) во время чтения рассеивает туман не понимания над кодом.
Блочные комментарии создаются с помощью /* в начале, * на каждой новой строке и */ в конце.
Includes
Следующее, что необходимо понять, это оператор include. Включение — это способом дополняется код из библиотек или других скетчей. Это достигается в функции setup() с помощью #include.
В экосистеме Arduino доступно множество библиотек, которые помогут начать работу. Во многих случаях код для выполнения алгоритма, уже существует, и уже написан другим. Например, для управления сервоприводом, нет причин писать код, так как существует библиотека сервопривода, которую можно включить и посылать инструкции.
Чтобы включить библиотеку сервоприводов в код, нужно добавить #include перед функцией setup().
Определение констант
Константы — это переменные не меняющая присвоенное значение в течении выполнения кода! Иногда требуется определить в коде оператор для использования позже в местах кода. Это удобно для включения и выключения различных функций при тестировании. Или для создания определенной конфигурации кода, который может быть написан для работы на множестве устройств.
Например, написать скетч, рассчитанный на работу с 10 светодиодами или 20 светодиодами, в зависимости от потребностей пользователя. Поэтому создать константу для определения количества светодиодов в начале скетча. Другим примером может быть определение того, какие PIN-коды что делают на аппаратном обеспечении. Например, определить вывод 3 на Uno как место подключения светодиода. Константы должны быть определены перед функцией setup().
Помните, что в отличие от переменной… константы не изменяются и не могут быть изменены после того, как код будет выполнен.
Arduino IDE включает в себя множество констант, которые определены из коробки и пригодно для использования в коде в целях упрощения работы. Например, для определения того, является ли контакт входным или выходным.
Глобальные переменные
Глобальные переменные — это переменные, которые работают в любом месте скетча Arduino, внутри или вне функции. Большинство переменных локальны только для функции, в которой определены.
Глобальные переменные следует использовать экономно!
Какие существуют типы переменных в программе Arduino?
В языке программирования Arduino существует около 18 типов данных. Однако мы представим здесь только наиболее часто используемые из них.
Int. float string char double boolean byte long/
Что такое управляющие операторы?
Управляющие операторы позволяют добавить условие в цикл. Если вы хотите контролировать количество повторений цикла с некоторыми параметрами, то управляющие операторы — это то, что вам нужно.
Что такое оператор ‘for’?
Синтаксис: for(условие запуска; условие остановки; условие увеличения/уменьшения){}
Аргументы: Внутри оператора for есть три аргумента.
Во-первых, вам нужно инициализировать переменную. И вы можете присвоить этой переменной начальное число.
Второй — условие остановки. Оператор выполняет код до тех пор, пока переменная не выполнит это условие.
Далее, третье — условие изменения, которое определяет, как увеличивать или уменьшать переменную для последующих итераций.
Мы подробно рассмотрели работу цикла for здесь. Условные циклы в языке программирования Arduino похожи на те, которые мы рассматривали в курсе программирования на языке C.
Что представляет собой функция Serial parse Int?
Она ищет следующее допустимое целое число, если текущий входной сигнал не является целым числом.
Синтаксис:
Serial.parseInt()
Serial.parseInt(lookahead)
Serial.parseInt(lookahead, ignore)
Следующее допустимое число с плавающей точкой.
Что такое String()?
Она создает класс строк. То есть, последовательность символов. Существует множество типов для построения строк из различных типов данных, которые форматируют их как последовательность символов. Возвращает экземпляр класса string
В двойных кавычках: строка символов (например, «Naveen»)
В одинарных кавычках: один символ (например, ‘N’).
Это может быть другой экземпляр объекта String.
Преобразует в длинное целое число с указанным основанием
Afloat или double с указанными десятичными знаками.
Синтаксис
string(Val)
string(Val,base)
string(Val, десятичные знаки)
Что такое массив?
Массив — это набор однородных переменных. Для доступа к ним используется индексный номер, например a[0], a[1]. Массивы имеют нулевую индексацию. Первый элемент массива всегда находится под индексом 0, а размер массива равен общему числу-1.
Используя циклы, вы можете манипулировать массивами.
Синтаксис: Вы можете создать массив следующими методами:
int a[6];
int a[]={1,2,3,4,5,6};
Что такое функция?
Помимо встроенных функций, вы также можете писать свои функции. С их помощью мы можем разделить большую программу на основные строительные блоки.
Она содержит набор программных утверждений с фигурными скобками в виде {}. Это обеспечивает возможность повторного использования.
Определяемые пользователем функции делятся на четыре типа, это
Функция без аргументов, которая не возвращает никакого значения.
Функция без аргументов, возвращающая значение.
Функция с аргументами, которая возвращает не значение.
И функция с аргументами, которая возвращает значение.
Преимущества:
Использование функций позволяет избежать переписывания одного и того же кода снова и снова.
Вы можете вызывать функцию много раз. Это помогает легко понять код.