Void setup в ардуино что это
Урок 2. Программируем Arduino: структура кода
В прошлой статье мы разобрали устройство платы Arduino, научились подключать ее к компьютеру и загрузили свой первый скетч! Называется он Blink и отвечает за мигание встроенного светодиода в плату с определенной частотой. Если вы начинающий, и только начали изучать мир Arduino, то вам некоторые функции в коде могут быть непонятны. Поэтому давайте разберем все по порядку. Структура кода в Arduino IDE – начинаем!
Программный код состоит из двух обязательных частей – функций. Первая часть называется void setup() (в переводе на русский – установка) и в ней прописывается код, который отработает всего один раз. Во второй обязательной функции void loop() прописывается код, работающий в бесконечном цикле. Сюда прописывается то, что будет происходить циклично (то есть с определенной частотой в определенный промежуток времени). Еще перед этими двумя функциями, то есть в самом начале кода, иногда прописываются различные директивы или переменные, которые будут необходимы для дальнейшей работы кода. Они будут постоянны на протяжении всего кода (это различные библиотеки, введенные названия устройств и т.д.)
Если перенестись на минутку в реальный мир, то эту структуру легко можно представить на простых вещах. Например, вы включаете свет в комнате, когда темно. Для этого, вы нажали на выключатель и лампочка загорелась. Также и в коде: сначала мы задаем постоянные данные, которые нам необходимы, то есть прописываем, что существует некое устройство (лампочка), прописываем для нее низкой значение
Таким образом, структура кода будет всегда одна и та же, вы ее сейчас видите ниже (от нее уже и нужно будет отталкиваться в дальнейшем, в зависимости от того, что вы хотите сделать и запрограммировать)
В нашем первом коде Blink есть некая функция PinMode(), а также delay() и digitalWrite()
Разберемся с каждой из них в отдельности.
В нашем коде встроенный светодиод мигает с частотой в одну секунду. Он подключается к выводу 13. В прошлом статье мы уже говорили, что на плате Arduino имеются выводы для подключения различных устройств и периферии – они делятся на цифровые и аналоговые. По отдельности их мы разберём чуть позднее, а пока скажем, что у каждого вывода есть номер. На плате Arduino Uno вверху расположены выводы, пронумерованные от 0 до 13. Это цифровые выводы, к ним подключают обычно различные светодиоды. Однако, вывод номер 13 отвечает за работу встроенного светодиода на плате и служит, чаще всего, для проверки ее работоспособности. Указав в скетче номер вывода, мы можем работать с устройством, которое подключено к нему.
Функция PinMode() служит для настройки этого самого вывода. Все выводы на плате могут работать, как входы, так и выходы. Потому пользователь это также должен учитывать. По умолчанию, все контакты являются входами, но для светодиода нужен выходной сигнал, так как на него идет рабочая команда и подается напряжение.
digitalWrite(13, HIGH); // подается высокое напряжение и светодиод включается.
digitalWrite(13, LOW); // напряжение не подается, светодиод выключен.
Функция delay() служит для установки задержки в программном коде между выполнением различных действий (так как контроллер не может одновременно выполнять несколько действий, а выполняет их последовательно). В самой функции прописывается время этой самой задержки в миллисекундах (1000мс=1с)
delay(1000); //устанавливаем задержку в 1 секунду
void loop()
<
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13, LOW);
delay(1000);
>
На этом наш второй урок по программированию на Arduino подходит к концу. Сегодня мы познакомились со структурой кода на примере Blink, узнали о новых функциях и как их использовать, а впереди нас ожидает еще много всего интересного и познавательного. Всем удачной компиляции и отличного настроения!
Функции arduino void loop () и void setup ()
Функции void loop () и void setup () – именно с них начинается знакомство с программированием под arduino у большинства начинающих. В этой статье мы узнаем, для чего нужны эти функции, что можно, а что нельзя в них писать, а также попробуем найти решение таких проблем как ‘redefinision of void setup’, часто возникающих у новичков в проектах arduino.
Как запускается программа на Arduino
Когда мы подключаем плату Arduino к питанию, то внутри него начинается весьма бурная деятельность встроенных микропрограмм. Микроконтроллер сконфигурирован так, что при запуске системы управление получает программа-загрузчик. Первое, что делает загрузчик – проверяет в течение 1-2 секунд, не начнется ли от пользователя отправка новой программы. Если процесс перепрограммирования начат, то скетч загружается в память и управление отдается ему. Если новых программ нет, то загрузчик выполняет ранее сохраненную программу.
Начав выполнение программы, Arduino выполняет ряд рутинных операций по инициализации и настройке среды окружения и только затем приступает к выполнению того самого кода, который содержится в наших с вами скетчах. Таким образом, ардуино избавляет нас от необходимости помнить все детали архитектуры микропроцессора и сконцентрироваться на стоящей перед нами задаче (это не значит, что мы не должны понимать, что же происходит за кадром, но об этом поговорим в отдельной статье).
Для иллюстрации сказанного приведем фрагмент исходников Arduino, в которых и производится вызов наших функций (файл main.cpp):
Функция main() – это настоящая точка входа в программу, именно она вызывается первой. Как мы видим, в ней вызываются методы инициализации параметров и среды окружения, а затем и наши void setup() и, уже в цикле – void loop();
По идее, мы можем реализовать другую логику запуска и сделать внутри основного метода несколько функций loop, реализуя многопоточность. Но в данной статье мы не будем этого делать. Более подробно о возможности реализации многопоточности можно прочитать в этой замечательной статье.
Для чего нужна функция void setup()
Загрузив программу, Arduino дает нашему коду возможность поучаствовать в инициализации системы. Для этого мы должны указать микроконтроллеру команды, которые он выполнит в момент загрузки и потом забудет про них (т.е. эти команды выполнятся только один раз при старте системы). И именно с этой целью в нашей с вами программе мы должны выделить блок, в котором будут храниться эти команды. void setup(), а верней пространство внутри фигурных скобок этой функции, и является таким местом внутри Arduino скетча.
Синтаксис void setup()
Синтаксис функции setup очень прост:
// тут располагаются команды подпрограммы
В этом примере слово setup – это название функции. Нужно писать именно так, именно в таком регистре. Слово перед названием описывает тип возвращаемых данных. В данном случае никаких данных подпрограмма не возвращает, поэтому мы должны указать слово void. Все команды должны размещаться внутри фигурных скобок <>.
Не забывайте ставить фигурные скобки! Потеря хотя бы одной скобки сразу сделает всю программу непонятной для ардуино. Но и лишние скобки тоже не ставьте – это так же приведет к ошибке.
Примеры void setup()
Чаще всего внутри void setup указываются следующие инструкции:
Если говорить об ошибке redefinision of void setup’, то она возникает в том случае, если мы подключаем модуль или скетч, в котором уже есть данная функция. Это и вызывает ошибку
Функция void loop()
Функция loop это то место, куда мы должны поместить команды, которые будут выполняться все время, пока включена плата Arduino. Начав выполнение с первой команды, микроконтроллер дойдет до конца и сразу же перепрыгнет в начало, чтобы повторить ту же последовательность. И так бесконечное число раз (до тех пор, пока на плату будет подан электричество). Наиболее уместный перевод английского слова loop в даном случае – это цикл (петля).
По своей сути, void loop – это главная функция, точка входа в нашу программу. Arduino повторяет вызов этой функции миллионы раз в секунду, таким образом, вы можете быть уверены, что
Пример void loop()
Так хорошо знакомый пример скетча проекта Blink (маячок). Если бы не функция delay(), мы бы никогда не заметили выключение светодиода, т.к. дойдя до конца, скетч начнет выполняться с первой строчки, в которой он сразу же включится.
Резюме
С помощью функций arduino void loop и void setup мы передаем микроконтроллеру инструкции нашего скетча. Все то, что содержится внутри блока setup выполнится один раз. Содержимое блока loop будет выполняться в цикле до тех пор, пока останется включенным Arduino-контроллер.
Ардуино язык программирования: основные понятия
Язык программирования Ардуино основывается на языке C/C++, который широко распространен в мире программирования.
Целевой аудиторией Ардуино являются непрофессиональные пользователи в сфере роботостроения и простейших систем автоматики. Основной продукцией является набор плат, комбинируя которые, возможно создавать различные устройства, способные выполнять широкий ряд задач.
В качестве примера, из набора плат, выпускаемых данной фирмой, можно собрать автоматическую кормушку для своих домашних животных. И это лишь один из наиболее простых примеров. Сфера их возможного применения ограничивается лишь фантазией пользователей.
Кроме печатных плат, выпускаемых под торговой маркой Arduino, у них имеется собственный язык программирования Ардуино, который основывается на широко известном в кругу программистов языке C/C++. Давайте более подробно разберемся, что он из себя представляет.
Язык программирования
Язык программирования Ардуино довольно прост в освоении, так как основной целевой аудиторией его применения являются любители. Однако считается одним из самых лучших языков для программирования микроконтроллеров.
Arduino IDE является бесплатной программой, скачать которую может любой желающий. На нашем сайте вы можете скачать любую подходящую для вас версию среды. Также доступ к скачиванию IDE предоставлен на официальном сайте компании, а при желании, разработчиков можно отблагодарить, сделав денежный перевод.
Среда IDE поддерживается такими операционными системами, как Windows, MacOs и Linux. На официальном сайте компании указанно, что данный язык программирования написан на Wiring, но на самом деле его не существует и для написания используется C++ с небольшими изменениями.
Что необходимо для начала работы с Arduino IDE?
Для начала нам потребуются следующие вещи:
Имея этот набор, можно начинать экспериментировать с имеющимися у вас платами, записывая на них ваши первые скетчи.
Как настроить Ардуино на компьютере?
Делается это просто. Необходимо выполнить следующие действия:
Знакомство с интерфейсом Ардуино
Одним из основных элементов ардуино является главное меню программы, которое позволяет получить доступ ко всем доступным функциям нашей программы.
Ниже расположена панель с иконками, которые отображают наиболее используемые функции Arduino IDE:
Следующим по важности элементом является вкладка с файлами проекта. Если это простой скетч, то файл будет всего один. Однако сложные скетчи могут состоять из нескольких файлов. В таком случае на панели вкладок можно быстро переключить просмотр с одного файла на другой. Это очень удобно.
Самым большим из блоков является поле редактора наших скетчей. Тут мы можем просмотреть и, при необходимости, отредактировать нужный нам программный код. Отдельно реализовано поле для вывода системных сообщений. С его помощью можно убедиться, что сохранение вашего скетча или его загрузка были проведены успешно, и вы можете приступать к следующим действиям. Также в программе существует окно, отображающее наличие в ходе компиляции вашего скетча.
Основные функции языка программирования
Давайте наконец-то перейдем к самым основным функция языка программирования Ардуино.
Сразу скажем, что все функции вы можете найти в нашем удобном справочнике на нашем сайте.
Точка с запятой ;
Точка с запятой должна следовать за каждым выражением, написанным на языке программирования Arduino. Например:
В этом выражении мы присваиваем значение переменной и обратите внимание на точку с запятой в конце. Это говорит компилятору, что вы закончили кусок кода и переходите к следующему фрагменту. Точка с запятой в коде Ардуино отделяет одно полное выражение от другого.
Двойная обратная косая черта для однострочных комментариев //
Теперь, даже через 3 месяца когда я просматриваю эту программу я знаю о том куда подключался светодиод.
Компилятор будет игнорировать комментарии, поэтому вы можете писать все, что вам нравится. Если вам нужно много текста для комментария вы можете использовать многострочный комментарий, показанный ниже:
Комментарии похожи на сноски кода, но более распространены, чем те что ставят в книгах внизу страниц.
Фигурные скобки
Фигурные скобки используются для того, чтобы добавить инструкции, выполняемые функцией (мы обсудим функции дальше). Всегда есть открытая фигурная скобка и закрывающая фигурная скобка. Если вы забудете закрыть фигурную скобку, компилятор выведет код ошибки.
Функции ()
В Ардуино есть определенные функции, которые часто используются в среде Arduino IDE. Когда вы вводите их, имя функции будет оранжевым. Например, функция pinMode() является общей функцией, используемой для обозначения режима вывода Arduino.
Обратите внимание, что слово OUTPUT обычно синего цвета. В языке программирования Ардуино есть определенные ключевые слова, которые часто используются, а синий цвет помогает их идентифицировать. Arduino IDE автоматически превращает их в синий цвет.
Далее мы поговорим о двух функциях, используемых почти в любой программе Arduino.
void setup ( )
Возможно, вам интересно что означает void перед функцией setup(). Void означает, что функция не возвращает информацию.
Давайте рассмотрим пару вещей, которые вы должны знать о setup():
void loop( )
Как и в случае с setup(), функция loop() не возвращает никаких значений, поэтому перед неё предшествует слово void.
Если у вас есть датчик температуры, подключенный к вашему Arduino, например, тогда когда температура достигнет определенного порога вы можете включить вентилятор. Код цикла постоянно проверяет температуру, ожидающую запуска вентилятора. Поэтому, хотя код повторяется снова и снова, не каждая часть кода будет выполняться каждую итерацию цикла.
Существуют ли еще программы, работающие с Ардуино?
Помимо официальной Arduino IDE, существуют программы сторонних разработчиков, которые предлагают свои продукты для работы с микроконтроллерами на базе ардуино.
Аналогичный набор функций нам может предоставить программа, которая называется Processing. Она очень схожа с Arduino IDE, так как обе сделаны на одном движке. Processing имеет обширный набор функций, который мало уступает оригинальной программе. С помощью загружаемой библиотеки Serial пользователь может создать связь между передачей данных, которые передают друг другу плата и Processing.При этом мы можем заставить плату выполнять программы прямо с нашего ПК.
Существует еще одна интересная версия исходной программы. Называется она B4R, и главным ее отличием является использование в качестве основы не языка си, а другой язык программирования – Basic. Данный программный продукт является бесплатным. Для работы с ним существуют хорошие самоучители, в том числе и написанные создателями данного продукта.
Есть и платные варианты Arduino IDE. Одним из таких является программа PROGROMINO. Главным ее достоинством считается возможность автодополнения кода. При составлении программы вам больше не нужно будет искать информацию в справочниках. Программа сама предложит вам возможные варианты использования той или иной процедуры. В ее набор входит еще множество интересных функций, отсутствующих в оригинальной программе и способных облегчить вам работу с платами.
Конкуренты Ардуино
Данный рынок по производству микроконтроллеров для создания различных электронных схем и робототехники имеет много поклонников по всему земному шару. Данная ситуация способствует появлению на рынке не только конкурентов, которые предлагают схожие продукты. Кроме них выпускается значительное количество подделок разного качества. Одни очень тяжело отличить от оригиналов, ведь они имеют идентичное качество, другие обладают очень плохими характеристиками и могут вовсе не работать с оригинальными продуктами.
Существуют даже платы Arduino, которые поддерживают работу микропроцессоров с интерпретаторами JavaScript. Актуальны они, в первую очередь, для тех, кто желает использовать язык Java вместо Си. Ведь он более прост, и позволяет добиваться результатов с повышенной скоростью. Однако данные платы являются более дорогими по отношению к ардуино, что является существенным минусом.
Если вы ищите себе хобби и вам интересно такое направление, как электротехника, вы смело можете выбирать для этого Arduino. Плюсов такое хобби имеет массу. Вы будете развиваться в интеллектуальном плане, так как данное занятие потребует от вас знаний в разных областях.
Помимо развлечений, ваше хобби поможет вам в создании массы полезных изделий, которые вы сможете использовать для облегчения повседневной жизни. С каждым разом вы будете находить все новые и новые способы использования вашего увлечения.
Освоить данное занятие будет не так сложно, благодаря наличию большого количества учебников и самоучителей. В дальнейшем вы найдете множество единомышленников по всему миру, которые поделятся с вами своими знаниями и дадут вам стимул для совершения новых экспериментов!
Список команд Arduino
На этой странице представлен список всех (или почти всех) доступных “из коробки” команд для Arduino с кратким описанием и примерами. Часть информации взята из Гугла, в основном некоторые особенности языка, часть получена методом проб и ошибок. Полную информацию о том, как этим пользоваться, можно получить из уроков или официального reference. Также изо всех сил рекомендую вот этот онлайн справочник по C++, из него можно узнать гораздо больше о некоторых особенностях использования операторов и типов данных.
А ещё у меня есть краткий сборник всех основных Ардуино-функций для печати! Смотри в этом уроке.
Структура скетча
Синтаксис, структура кода
Ставится в конце каждого действия
Функция, содержимое которой выполняется один раз при запуске микроконтроллера. Подробнее – в этом уроке.
Функция, содержимое которой выполняется (или пытается выполняться) “по кругу” на протяжении всего времени работы МК. Подробнее – в этом уроке.
Директива, позволяющая подключать в проект дополнительные файлы с кодом.
В чём отличие <> и “”? Когда указываем название “в кавычках”, компилятор сначала ищет файл в папке со скетчем, а затем в папке с библиотеками. При использовании компилятор ищет файл только в папке с библиотеками
Директива, дающая команду препроцессору заменить указанное название на указанное значение. Чаще всего таким образом объявляют константы:
После компиляции все встречающиеся в тексте программы слова MOTOR_PIN будут заменены на цифру 10, а LED_PIN – на цифру 3. Такой способ хранения констант не использует оперативную память микроконтроллера. Также define позволяет делать т.н. макро функции. Например Ардуиновская функция sq (квадрат) является макро, который при компиляции превращается в умножение:
Директивы препроцессору, позволяющие включать или исключать участки кода по условию
При помощи условной компиляции очень удобно собирать и настраивать сложные проекты с кучей настроек и библиотек, подключаемых “по условию”. Например:
Если параметру DEBUG установить 1, то будет подключена библиотека Serial, если 0 – то нет. Таким образом получаем универсальный оптимизированный проект с отладкой. Подробнее – в этом уроке.
Условные директивы препроцессору, позволяют включать или исключать участки кода по условию: ifdef – определено ли? ifndef – не определено ли? Подробнее – в этом уроке.
Оператор перехода в другую часть кода по метке. Не рекомендуется к использованию, всегда можно обойтись без него. Как пример использования – выход из кучи условий
Оператор прерывания функции, он же оператор возврата значения из функции. Подробнее – в этом уроке
Условия (if, switch)
Оператор сравнения и его друзья. Подробнее – в этом уроке.
Оператор выбора, заменяет конструкцию с else if. Подробнее – в этом уроке.
Оператор break очень важен, позволяет выйти из switch. Но можно использовать так:
Циклы (for, while)
Цикл – “счётчик”. for (инициализация; условие; инкремент). Подробнее – в этом уроке.
Также используется для создания замкнутых циклов, т.к. настройки for необязательны. Выход только через break или goto
Цикл с предусловием. Подробнее – в этом уроке.
Может быть использован для создания замкнутого цикла, выход только через break или goto
Цикл с постусловием. Подробнее – в этом уроке.
Отличается от while тем, что гарантированно выполнится хотя бы один раз
Пропускает все оставшиеся в теле цикла действия и переходит к следующей итерации
Операторы
Запятая тоже является оператором, используется в следующих случаях:
Рассмотрим третий случай здесь:
Арифметические
Арифметические операторы – самые простые и понятные из всех
Большой урок по математическим действиям.
Сравнение и логика
Подробный урок по сравнениям и условиям.
Составные операторы
По битовым операциям читай отдельный урок. По математическим операциям у меня тоже есть подробный урок.
Битовые операции
По битовым операциям читай урок у меня на сайте.
Указатели и ссылки
Подробнее об указателях и ссылках читайте в отдельном уроке.
Работа с данными
Типы данных, переменные
Переменная – элементарная ячейка для хранения данных (цифр). Переменные разных типов имеют разный “размер ячейки” и имеют разный лимит на размер числа.
Название | Альт. название | Вес | Диапазон | Особенность |
boolean | bool | 1 байт | 0 или 1, true или false | Логическая переменная. bool на Arduino тоже занимает 1 байт, а не бит! |
char | int8_t | 1 байт | -128… 127 | Хранит номер символа из таблицы символов ASCII |
byte | uint8_t | 1 байт | 0… 255 | |
int | int16_t, short | 2 байта | -32 768… 32 767 | |
unsigned int | uint16_t, word | 2 байта | 0… 65 535 | |
long | int32_t | 4 байта | -2 147 483 648… 2 147 483 647 | – 2 миллиарда… 2 миллиарда |
unsigned long | uint32_t | 4 байта | 0… 4 294 967 295 | 0… 4 миллиарда… |
float | — | 4 байта | -3.4028235E+38… 3.4028235E+38 | Хранит числа с плавающей точкой (десятичные дроби). Точность: 6-7 знаков |
double | — | 4 байта | Для AVR то же самое, что float. А так он 8 байт | |
— | int64_t | 8 байт | -(2^64)/2… (2^64)/2-1 | Очень большие числа. Serial не умеет такие выводить |
— | uint64_t | 8 байт | 2^64-1 | Очень большие числа. Serial не умеет такие выводить |
Существует еще несколько специальных типов данных для символов. Подробнее можно почитать здесь.
Создаёт тип данных под названием color, который будет абсолютно идентичен типу byte (то есть принимать 0-255). Теперь с этим типом можно создавать переменные:
Создали три переменные типа color, который тот же byte, только в профиль. Это всё!
Более подробно о переменных и данных можно почитать вот здесь.
Структуры
Структура (struct) – очень составной тип данных: совокупность разнотипных переменных, объединённых одним именем.
Ярлык будет являться новым типом данных, и, используя этот ярлык, можно объявлять уже непосредственно саму структуру:
Также есть вариант объявления структуры без создания ярлыка, т.е. создаём структуру, не объявляя её как тип данных со своим именем.
Более подробно про структуры читай тут.
Перечисления
Перечисления (enum – enumeration) – тип данных, представляющий собой набор именованных констант, нужен в первую очередь для удобства программиста.
Объявление перечисления чем-то похоже на объявление структуры:
Таким образом мы объявили ярлык. Теперь, используя этот ярлык, можно объявить само перечисление:
Также как и у структур, можно объявить перечисление без создания ярлыка (зачем нам лишняя строчка?):
Более подробно про перечисления читай тут.
Классы
Классы в С++ – это основной и очень мощный инструмент языка, большинство “библиотек” являются классами. Иерархия такая:
Класс объявляется следующим образом:
Более подробно про работу с классами читай вот в этом уроке про классы.
Массивы
Для объявления массива достаточно указать квадратные скобки после имени переменной, тип данных – любой. Более подробно про массивы читай в уроке.
Строки (объект String)
String – очень мощный инструмент для работы со строками, т.е. текстовыми данными. Объявить строку можно несколькими способами:
Подробнее про строки String и массивы символов читай в этом уроке.
Строки можно сравнивать, складывать и вычитать, также для работы с ними есть куча функций:
myString.charAt(index);
Возвращает элемент строки myString под номером index. Аналог – myString[index];
myString.setCharAt(index, val);
Записывает в строку myString символ val на позицию index. Аналог – myString[index] = val;
myString.compareTo(myString2);
myString.concat(value);
Присоединяет value к строке (value может иметь любой численный тип данных). Возвращает true при успешном выполнении, false при ошибке. Аналог – сложение, myString + value;
myString.endsWith(myString2);
Проверяет, заканчивается ли myString символами из myString2. В случае совпадения возвращает true
myString.startsWith(myString2);
Проверяет, начинается ли myString символами из myString2. В случае совпадения возвращает true
myString.equals(myString2);
Возвращает true, если myString совпадает с myString2. Регистр букв важен
myString.equalsIgnoreCase (myString2);
Возвращает true, если myString совпадает с myString2. Регистр букв неважен
myString.indexOf(val);
myString.indexOf(val, from);
myString.lastIndexOf(val);
myString.lastIndexOf(val, from);
myString.length();
Возвращает длину строки в количестве символов
myString.remove(index);
myString.remove(index, count);
Удаляет из строки символы, начиная с index и до конца, либо до указанного count
myString.replace(substring1, substring2);
В строке myString заменяет последовательность символов substring1 на substring2.
myString.reserve(size);
Зарезервировать в памяти количество байт size для работы со строкой
myString.c_str();
Преобразовывает строку в “СИ” формат (null-terminated string) и возвращает указатель на полученную строку
myString.trim();
Удаляет пробелы из начала и конца строки. Действует со строкой, к которой применяется
myString.substring(from);
myString.substring(from, to);
Возвращает кусок строки, содержащейся в myString начиная с позиции from и до конца, либо до позиции to
myString.toCharArray(buf, len);
Раскидывает строку в массив – буфер buf (типа char []) с начала и до длины len
myString.getBytes(buf, len);
Копирует указанное количество символов len (вплоть до unsigned int) в буфер buf (byte [])
myString.toFloat();
Возвращает содержимое строки в тип данных float
myString.toDouble();
Возвращает содержимое строки в тип данных double
myString.toInt();
Возвращает содержимое строки в тип данных int
myString.toLowerCase();
Переводит все символы в нижний регистр. Было ААААА – станет ааааа
myString.toUpperCase();
Переводит все символы в верхний регистр. Было ааааа – станет ААААА
Спецификаторы переменных
Преобразование типов данных
Таким образом можно преобразовывать обычные переменные, указатели и другие типы данных.
И для строк мы уже рассматривали выше
Как пользоваться: на примере предыдущего примера
Подробный урок по типам данных смотри тут.
“Символьные” функции
Все следующие функции принимают как аргумент символ (тип char), анализируют его и возвращают true или false в зависимости от предназначения.
Работа с цифрами
Целые и дробные числа
Arduino поддерживает работу с целыми числами в разных системах исчисления:
Базис | Префикс | Пример | Особенности |
2 (двоичная) | B или 0b (ноль бэ) | B1101001 | цифры 0 и 1 |
8 (восьмеричная) | 0 (ноль) | 0175 | цифры 0 – 7 |
10 (десятичная) | нет | 100500 | цифры 0 – 9 |
16 (шестнадцатеричная) | 0x (ноль икс) | 0xFF21A | цифры 0-9, буквы A-F |
ВАЖНО! Для арифметических вычислений по умолчанию используется ячейка long (4 байта), но при умножении и делении используется int (2 байта), что может привести к непредсказуемым результатам! Если при умножении чисел результат превышает 32’768, он будет посчитан некорректно. Для исправления ситуации нужно писать (тип данных) перед умножением, что заставит МК выделить дополнительную память для вычисления (например (long)35 * 1000). Также существую модификаторы, делающие примерно то же самое.
Посмотрим, как это работает на практике:
Arduino поддерживает работу с числами с плавающей точкой (десятичные дроби). Этот тип данных не является для неё “родным”, поэтому вычисления с ним производятся в несколько раз дольше, чем с целочисленным типом (около 7 микросекунд на действие). Arduino поддерживает три типа ввода чисел с плавающей точкой:
Тип записи | Пример | Чему равно |
Десятичная дробь | 20.5 | 20.5 |
Научный | 2.34E5 | 2.34*10^5 или 234000 |
Инженерный | 67e-12 | 67*10^-12 или 0.000000000067 |
С вычислениями есть такая особенность: если в выражении нет float чисел, то вычисления будут иметь целый результат (дробная часть отсекается). Для получения правильного результата нужно писать (float) перед действием, или использовать float числа при записи. Смотрим:
Ну и напоследок, при присваивании float числа целочисленному типу данных дробная часть отсекается. Если хотите математическое округление – его нужно использовать отдельно:
Математические функции и константы
Математических функций Arduino поддерживает очень много, малая часть из них являются макро функциями, идущими в комплекте с Arduino.h, все остальные же наследуются из мощной C++ библиотеки math.h
Константа | Значение |
UINT8_MAX | 255 |
INT8_MAX | 127 |
UINT16_MAX | 65535 |
INT16_MAX | 32767 |
UINT32_MAX | 4294967295 |
INT32_MAX | 2147483647 |
Функция | Значение |
min(a, b) | Возвращает меньшее из чисел a и b |
max(a, b) | Возвращает большее из чисел |
abs(x) | Модуль числа |
constrain(val, low, high) | Ограничить диапазон числа val между low и high |
map(val, min, max, outMin, outMax) | Перевести диапазон числа val (от min до max) в новый диапазон (от outMin до outMax). val = map(analogRead(0), 0, 1023, 0, 100); – получить с аналогового входа значения 0-100 вместо 0-1023. Работает только с целыми числами! |
round(x) | Математическое округление |
radians(deg) | Перевод градусов в радианы |
degrees(rad) | Перевод радиан в градусы |
sq(x) | Квадрат числа |
Константа | Значение | Описание |
INT8_MAX | 127 | Максимальное значение для char, int8_t |
UINT8_MAX | 255 | Максимальное значение для byte, uint8_t |
INT16_MAX | 32767 | Максимальное значение для int, int16_t |
UINT16_MAX | 65535 | Максимальное значение для unsigned int, uint16_t |
INT32_MAX | 2147483647 | Максимальное значение для long, int32_t |
UINT32_MAX | 4294967295 | Максимальное значение для unsigned long, uint32_t |
M_E | 2.718281828 | Число e |
M_LOG2E | 1.442695041 | log_2 e |
M_LOG10E | 0.434294482 | log_10 e |
M_LN2 | 0.693147181 | log_e 2 |
M_LN10 | 2.302585093 | log_e 10 |
M_PI | 3.141592654 | pi |
M_PI_2 | 1.570796327 | pi/2 |
M_PI_4 | 0.785398163 | pi/4 |
M_1_PI | 0.318309886 | 1/pi |
M_2_PI | 0.636619772 | 2/pi |
M_2_SQRTPI | 1.128379167 | 2/корень(pi) |
M_SQRT2 | 1.414213562 | корень(2) |
M_SQRT1_2 | 0.707106781 | 1/корень(2) |
NAN | __builtin_nan(“”) | nan |
INFINITY | __builtin_inf() | infinity |
PI | 3.141592654 | Пи |
HALF_PI | 1.570796326 | пол Пи |
TWO_PI | 6.283185307 | два Пи |
EULER | 2.718281828 | Число Эйлера е |
DEG_TO_RAD | 0.01745329 | Константа перевода град в рад |
RAD_TO_DEG | 57.2957786 | Константа перевода рад в град |
Псевдослучайные числа
Биты и байты
Битовые операции – подробнее читай в отдельном уроке.
Ввод-вывод
Цифровые пины
Устанавливает режим работы пина pin (ATmega 328: D0-D13, A0-A5) на режим mode:
Читает состояние пина pin и возвращает :
Подаёт на пин pin сигнал value:
Запускает генерацию ШИМ сигнала (отдельный урок про ШИМ) на пине pin со значением value. Для стандартного 8-ми битного режима это значение 0-255, соответствует скважности 0-100%. Подробнее о смене частоты и разрядности ШИМ смотрите в этом уроке. ШИМ пины:
Аналоговые пины
Читает и возвращает оцифрованное напряжение с пина pin. АЦП на большинстве плат Arduino имеет разрядность 10 бит, так что возвращаемое значение 0 – 1023 при напряжении 0 – опорное на пине. Урок про аналоговые пины.
Устанавливает режим работы АЦП согласно mode:
Как это влияет на работу? Значение 1023 функции analogRead() будет соответствовать опорному напряжению или выше его, соответственно поставив INTERNAL можно измерять напряжение от 0 до 1.1V с точностью (1.1 / 1023
1.2 мВ), напряжение выше 1.1V будет всегда 1023. После изменения источника опорного напряжения (вызова analogReference) первые несколько измерений могут быть нестабильными.
Нельзя использовать напряжение меньше 0V или выше 5V в качестве внешнего опорного в пин AREF. Также при использовании режима EXTERNAL нужно вызвать analogReference(EXTERNAL) до вызова функции analogRead(), иначе можно повредить микроконтроллер. Также можно подключить опорное в пин AREF через резистор на
5 кОм, но так как вход AREF имеет собственное сопротивление в 32 кОм, реальное опорное будет например 2.5 * 32 / (32 + 5) =
Аппаратные прерывания
Подключить прерывание (читай урок про прерывания) на номер прерывания pin, назначить функцию ISR как обработчик и установить режим прерывания mode: