Arduino string

Общая информация об Arduino

Arduino обрели особенно сильную популярность среди людей, которые только начинают заниматься электроникой. На то есть несколько причин. В отличие от большинства предшественников, Arduino не требует дополнительного оборудования (программатора) для загрузки кода на плату — используется простой USB-кабель. Оболочка для программирования — Arduino IDE использует упрощенную версию C++, что облегчает процесс обучения для новичков. Кроме того, Arduino использует стандартизированный форм фактор для большинства своих плат, благодаря чему появился целый комплект дополнительных «шилдов».

Arduino Uno показана на рисунке ниже:

Arduino Uno — одна из самых популярных плат в линейке и является отличным выбором для начинающих. Технические характеристики этой модели будут рассмотрены ниже.

Оболочка Arduino IDE:

Поверите или нет, но показанные на рисунке выше 10 строчек кода достаточно, чтобы заставить мигать встроенный на плату светодиод. Возможно, сам код для вас сейчас не очень понятен, но поверьте, он предельно логичен и лаконичен. После этой статьи и нескольких туториалов, вам не составит труда его реализовать самостоятельно.

В этой статье мы остановимся на следующих основных моментах:

  • Какие проекты можно реализовать с Arduino
  • Основные узлы плат Arduino
  • Номенклатура самых удачных моделей Arduino
  • Дополнительные (периферийные) устройства для Arduino

Рекомендуем также дополнительно почитать

Arduino предназначена не только для узкоспециализированных специалистов. При этом процесс их освоения будет гораздо легче и приятнее, если у вас за плечами базовые знания схемотехники и электротехники. Рекомендуем получить хотя бы общее понимание перечисленных ниже вещей прежде чем углубляться в удивительный мир Arduino:

  • Что такое электричество?
  • Закон Ома
  • Электрическая цепь
  • Интегральная схема (микросхема)
  • Аналоговый сигнал
  • Цифровой сигнал

Нам понадобится

  • Отладочная плата AVR. Предпочтительно Arduino UNO/Piranha UNO или любая другая плата AVR, совместимая с Ethernet шилдом. Если Ваша панель использует большое количество переменных и/или Ваш скетч использует большое количество библиотек, необходимо использовать отладочную плату на базе микроконтроллера с большей статической и динамической памятью, такую как Arduino MEGA или Piranha ULTRA
  • Ethernet шилд W5500 (если Вы используете шилд на базе чипа ENC28J60, необходимо использовать отладочную плату на базе микроконтроллера с большей статической и динамической памятью, такую как Arduino MEGA или Piranha ULTRA, при этом необходимо скачать и установить последнюю версию библиотеки UIPEthernet и изменить в скетче Ethernet.h на UIPEthernet.h).
  • Провод RJ45-RJ45 категории cat5e.
  • Маршрутизатор со свободным гнездом RJ-45 LAN.
  • Подключение к сети Интернет.

Создание переменной на сайте iocontrol.ru

Подробнее о создании переменных и работе с API на сайте Вы можете узнать по этой ссылке

  1. Если у Вас уже есть созданная панель, пропустите этот шаг, если у Вас ещё не создано ни одной панели, создайте её руководствуясь нашей инструкцией.
  2. Теперь зайдите в одну из созданных ранее панелей сначала нажав на вкладку «ПАНЕЛИ» (сверху, если Вы находитесь на десктоповом сайте, или снизу, если Вы используете мобильное приложение или мобильную версию сайта) и, затем, на название созданной Вами ранее панели.
  3. Внутри панели нажмите «Создать переменную». Введите название переменной, например myString, выберите тип переменной «Текстовая» Нажмите создать. В Вашей панели появится новая карточка с названием переменной.

How to program Arduino

The basic Arduino code logic is an  “if-then” structure and can be divided into 4 blocks:

Setup — will usually be written in the setup section of the Arduino code, and performs things that need to be done only once, such as sensor calibration.

Input — at the beginning of the loop, read the inputs. These values will be used as conditions (“if”) such as the ambient light reading from an LDR using analogRead().

Manipulate Data — this section is used to transform the data into a more convenient form or perform calculations. For instance, the AnalogRead() gives a reading of 0-1023 which can be mapped to a range of 0-255 to be used for PWM.(see analogWrite())

Output —  this section defines the final outcome of the logic (“then”) according to the data calculated in the previous step. Looking at our example of the LDR and PWM, turn on an LED only when the ambient light level goes below a certain threshold.

Преобразование String в массив char

Тип данных Char позволяет объявлять текстовые строки несколькими способами:

  • char myStr1; – в данном случае объявлен массив определенного размера.
  • char myStr2 = {‘a’, b, ‘c’, ‘d’, ‘e’}; – объявлен сам массив. Конечный символ не записанявно, его прибавит сам компилятор.
  • char myStr3 = {‘a’, b, ‘c’, ‘d’, ‘e’’/0’}; – объявлен массив, при этом в конце прописан признак окончания строки.
  • char myStr4 = “abcde”; – инициализация массива строковой постоянной. Размер и завершающий символ добавляются автоматически компилятором.
  • char myStr5 = “abcde”; – инициализация массива с точным указанием его размера.
  • char myStr 6 = “abcde”; – аналогично, но размер указан больше для возможности использования строк большей длины.

Еще раз напомним, что в типе данных char строковые константы нужно записывать в двойные кавычки «Abcde», а одиночные символы – в одинарные ‘a’.

Конвертировать строку в массив сhar array можно при помощи следующего кода:

String stringVar = “111”;

char charBufVar;

stringVar.toCharArray(charBufVar, 20);

Можно сделать обратное преобразование – char to string.

char[] chArray = “start”;

String str(chArray);

Пример преобразования String to const char*. Указание звездочкой char*означает, что это массив указателей.

String stringVar=string (`start);

Char charVar;

stringVar.toCharArray(charVar, sizeof(charVar));

Defining Data Types

The Arduino environment is really just C++ with library support and built-in assumptions about the target environment to simplify the coding process. C++ defines a number of different data types; here we’ll talk only about those used in Arduino with an emphasis on traps awaiting the unwary Arduino programmer.

Below is a list of the data types commonly seen in Arduino, with the memory size of each in parentheses after the type name. Note: signed variables allow both positive and negative numbers, while unsigned variables allow only positive values.

  • boolean (8 bit) — simple logical true/false
  • byte (8 bit) — unsigned number from 0-255
  • char (8 bit) — signed number from -128 to 127. The compiler will attempt to interpret this data type as a character in some circumstances, which may yield unexpected results
  • unsigned char (8 bit) — same as ‘byte’; if this is what you’re after, you should use ‘byte’ instead, for reasons of clarity
  • word (16 bit) — unsigned number from 0-65535
  • unsigned int (16 bit)- the same as ‘word’. Use ‘word’ instead for clarity and brevity
  • int (16 bit) — signed number from -32768 to 32767. This is most commonly what you see used for general purpose variables in Arduino example code provided with the IDE
  • unsigned long (32 bit) — unsigned number from 0-4,294,967,295. The most common usage of this is to store the result of the function, which returns the number of milliseconds the current code has been running
  • long (32 bit) — signed number from -2,147,483,648 to 2,147,483,647
  • float (32 bit) — signed number from -3.4028235E38 to 3.4028235E38. Floating point on the Arduino is not native; the compiler has to jump through hoops to make it work. If you can avoid it, you should. We’ll touch on this later.

Resources and Going Further

I’m going to leave it here for now. I hope I’ve demonstrated clearly the benefits of using appropriate data types for your variables. The next tutorial will go into some of the really ugly pitfalls that are hiding in mixing data types and using INAPPROPRIATE data types — for instance, data types that are too small for the largest number that you may encounter.

All of the context for these operations comes from the compiler, and the directions for the context get to the compiler from the user. You, the programmer, tell the compiler that THIS value is an integer and THAT value is a floating point number. The compiler, then, is left trying to figure out what I mean when I say «add this integer to that floating point». Sometimes that’s easy, but sometimes it’s not. And sometimes it SEEMS like it SHOULD be easy, but it turns out to yield results you might not anticipate.

Here’s some further reading you may want to explore with your new knowledge of data types:

  • Digital Logic
  • How to read a schematic
  • Logic Levels
  • Binary

Локальные переменные

Локальные переменные – это переменные, область видимости которых ограничена текущим, «локальным», блоком. Например, мы можем определить переменную в блоке, ограниченном операторами if (условия) и переменная будет видна только внутри. Примеры локальных блоков:

  • Внутри цикла (for, while)
  • Внутри функции
  • Внутри блока условия (if, else).

Ограниченность означает следующее: компилятор позволит использовать название переменной внутри блока, но «не узнает» ее, если мы обратимся извне. Давайте посмотрим пример:

В этом примере мы создали переменную internalSum и сохранили в нее результат арифметической операции суммирования двух значений, переданных нам в аргументах функции.

Представьте, если мы захотим использовать  эту переменную для вывода значений в монитор порта. Никаких проблем это не вызовет:

Мы обратились к переменной, взяли ее значение и отправили в монитор порта в функции Serial.println.

А давайте попробуем написать другую функцию и попробуем вывести это значение оттуда. Получится ли у нас это?

Конечно же, нет. В функции calculator компилятор попытается найти  определение переменной internalSum внутри функции, но не найдет его (мы же определили internalSum совсем в другой функции, sum()). Расстроившись от этого, компилятор выдаст ошибку (на самом деле, возможность ее избежать и есть использование глобальных переменных – об этом как раз и расскажем позже). Таким образом, мы можем что угодно делать с переменной в своем блоке, но ничего не можем сделать в другом.

Такое поведение компилятора не случайно и легко объяснимо. Зачем нам использовать переменную и данные в области, где их не нужно обрабатывать? Если мы в другом месте случайно изменим значение переменной (глобальной переменной), которую используем в этом месте, то можем создать множество трудноуловимых ошибок. Компилятор защищает нас от этого, просто запрещая использование название переменной из другой области, если это не требуется. К тому же фантазия человека ограничена и нам будет трудно придумать множество названий глобальных переменных так, чтобы они были понятны и не пересекались.

Синтаксис

Ниже приведены варианты объявления и присвоения строк:

1 char Str115]; // Объявление массива символов без присваивания значений
2 char Str28 = {'a', 'r', 'd', 'u', 'i', 'n', 'o'}; //  Объявление массива символов и присвоение значений всем элементам, кроме последнего, компилятор Arduino автоматически добавит символ конца строки
3 char Str38 = {'a', 'r', 'd', 'u', 'i', 'n', 'o', '\0'}; // Явно объявлен завершающий символ
4 char Str4  = "arduino"; // Инициализирование массива строковой константой в двойных кавычках. Компилятор автоматически задаст требуемый размер на массив, равный количеству символов плюс завершающий символ
5 char Str58 = "arduino"; // Инициализирование массива с явным заданием размера и присвоением строковой константы
6 char Str615 = "arduino"; // Инициализирование массива с явным заданием дополнительного размера (с запасом), фактически превышающего размер строковой константы при начальном присвоении

What is inside of an enum

This code example illustrates the simplicity of an enum. We will print out the values for each of our states.

enum blinkStates {
  BLINK_DIS, // blink disable
  BLINK_EN, // blink enable
  LED_ON, // we want the led to be on for interval
  LED_OFF // we want the led to be off for interval
};

enum blinkStates ledState;

void setup() {
  delay(1000);
  Serial.begin(9600);
  Serial.println(F("---------"));
  Serial.print(F("BLINK_DIS = "));
  Serial.println(BLINK_DIS);

  Serial.print(F("BLINK_EN = "));
  Serial.println(BLINK_EN);

  Serial.print(F("LED_ON = "));
  Serial.println(LED_ON);

  Serial.print(F("LED_OFF = "));
  Serial.println(LED_OFF);
}

void loop() { }
// Code by 
// More at: https://www.baldengineer.com/state-machine-with-enum-tutorial.html

When I run it on my Arduino Uno and my MSP430 based Launchpad, I get the following results.

---------
BLINK_DIS = 0
BLINK_EN = 1
LED_ON = 2
LED_OFF = 3

So what you can see with this example is that C is using integers to represent our simple to use names.

Функции с возвращаемыми значениями

До сих пор мы использовали только переменные, которые так или иначе зависели
только от номера вызова функции , т.е. так или иначе зависящие от
времени, прошедшего с момента старта Arduino.

Это интересно, но не даёт таких возможностей к написанию программ, как
получение значений из-вне. Допустим, к Arduino подключён какой-то сенсор:
датчик освещённости, датчик газа, простой потенциометр или что-то ещё. Как
получить его показания и использовать их в программе для чего-то полезного?

Если говорить о сенсорах с аналоговым сигналом, для
получения показаний с них существует встроенная функция .
Давайте воспользуемся ей, чтобы сделать программу для устройства, которое
изменяет яркость свечения светодиода, подключённого к 5-му пину в зависимости
от поворота ручки потенциометра, подключённого к пину .

#define LED_PIN  5
#define POT_PIN  A0
 
void setup()
{
    pinMode(LED_PIN, OUTPUT);
}
 
void loop()
{
    int value = analogRead(POT_PIN);
    analogWrite(LED_PIN, value  4);
}

Первое, что мы видим — это макроопределение пина с потенциометром:

#define POT_PIN  A0

В качестве значения используется не просто число, а нечто с именем . Оно
написано большими буквами, поэтому можно предположить, что это встроенное
макроопределение. И это действительно так! для Arduino Uno, например,
определено как . Для других плат значение может быть другим. Мы не
хотим помнить об этих тонкостях, поэтому просто использовали . Это
всегда означает «нулевой аналоговый вход».

Таким образом в качестве значения макроопределения мы использовали другое
макроопределение. Так делать можно и это довольно распространённая практика.

Теперь рассмотрим . В первой строке определяется переменная ,
а в качестве значения ей присваивается значения выражения
. Но ведь это вызов функции, а не арифметическое
выражение!

Совершенно верно. Некоторые функции помимо того, что делают что-то полезное
умеют так же возвращать значение обратно, в вызывающий код. Функции вроде
или не возвращают ничего, по задумке их автора, а
вот возвращает некоторое целочисленное значение.

Чтобы понять какие аргументы функция принимает, возвращает ли она что-нибудь и
если возвращает, то что, следует обращаться к документации на эту функцию.

Что касается , она принимает один аргумент: номер пина, с
которого необходимо считать значение аналогового сигнала. А возвращает эта
функция значение от 0 до 1023, где:

  • Входное напряжение в 0 В возвращается как

  • 2 В возвращается как

  • 2,5 В возвращается как

  • И так далее, до напряжения в 5 В, которому ставится в соответствие

Таким образом в первой строке мы просто считываем сигнал с
потенциометра, получая угол поворота его ручки в виде целого числа в пределах
от 0 до 1023.

Как мы помним, функция , которой мы пользуемся для управления
яркостью светодиода ожидает целое число от 0 до 255 в качестве второго
аргумента. Но у нас оказалась переменная с другим диапазоном. Что делать?
Просто поделить значение на 4. Так наш диапазон будет смасштабирован до того,
который подходит для . Максимуму из одного диапазона равному 1023
станет соответствовать максимум из другого диапазона: 1023 / 4 = 255.

Вспоминая о компактной записи, мы можем сделать наш чуть лаконичнее:

void loop()
{
    analogWrite(LED_PIN, analogRead(POT_PIN)  4);
}

Итак, вы научились работать со сложными выражениями, макроопределениями и
переменными. Использовать функции с возвращаемыми значениями и встраивать
вычисления. Этих знаний уже достаточно для создания нехитрых устройств.
Пробуйте, экспериментируйте, учитесь!

Номенклатура плат Arduino

Arduino производит разные платы, каждая из который имеет собственные особенности. Кроме того, Arduino придерживаются модели open source, благодаря чему другие могут модифицировать и производить клоны Arduino, расширять и изменять их функционал и форм-фактор. Ниже приведены короткие сведения о различных моделях Arduino.

Arduino Uno (R3)

Arduino Uno — отличный выбор для начинающих. Очень сбалансированная плата, на которой есть, все, что вам может понадобиться и минимум лишнего. На плате 14 цифровых пинов, которые работаю на вход и на выход (6 из них поддерживают ШИМ-модуляцию), 6 аналоговых входов. Подключается плата с помощью USB. Есть джек для отдельного источника питания, кнопка сброса и т.п. Для начала работы с микроконтроллером достаточно подключить плату к компьютеру с помощью USB кабеля.

LilyPad Arduino

Основная плата в линейки LilyPad Arduino! LilyPad разработана в первую очередь для использования на одежде. Пины соединяются с периферийными устройствами с помощью токопроводящей нити. Есть куча дополнительных плат расширений для LilyPad. Большинство из них спроектированы таким образом, что не боятся влаги.

RedBoard

Разработка SparkFun, которая программируется с помощью USB Mini-B кабеля в оболочке Arduino IDE. Основными преимуществами производитель называет: стабильность работы под ОС Windows 8 благодаря драйверам с необходимой цифровой подписью. На плате используется чип USB/FTDI, который меньше по габаритам по сравнению с чипом на Arduino UNO. Для заливки скетча на плату в IDE выбирается модель Arduino UNO. Регулятор напряжения рассчитан на питание в диапазоне от 7 до 15 вольт.

Arduino Mega (R3)

Arduino Mega — словно старший брат Uno. На плате много (54!) цифровых входов/выходов (14 из них поддерживают ШИМ-модуляцию). Благодаря большому количеству пинов, плата используется для комплексных проектов, в которых подключается большое количество периферии (например, сведодиодов или кнопок). Подключение к компьютеру реализуется таким же кабелем как и на Arduino Uno. Естественно, предусмотрен джек для адаптера.

Arduino Leonardo

Leonardo — первая разработка Arduino, в которой используется один микроконтроллер со встроенным USB. Это значит, что плата становится проще и дешевле. Так как плата подключается непосредственно к USB без конвертера, есть библиотеки, которые позволяют эмулировать компьютерную мышь, клавиатуру и многое другое!

Макроопределения

Мы можем единожды указать, что левый светодиод — это пин 13, правый — пин 12,
а переключать состояния нужно каждые X миллисекунд. Для этого каждому значению
назначается понятное имя, которое затем и используется для обращения:

#define LEFT_LED      13
#define RIGHT_LED     12
#define SWITCH_TIME   2000
 
void setup()
{
    pinMode(LEFT_LED, OUTPUT);
    pinMode(RIGHT_LED, OUTPUT);
}
 
void loop()
{
    digitalWrite(LEFT_LED, HIGH);
    digitalWrite(RIGHT_LED, LOW);
    delay(SWITCH_TIME);
 
    digitalWrite(LEFT_LED, LOW);
    digitalWrite(RIGHT_LED, HIGH);
    delay(SWITCH_TIME);
}

Всё, теперь для изменения параметров устройства достаточно изменить нужные
значения в начале программы и не думать об изменениях в самой логике. Кроме
того выражение вроде гораздо более
информативно нежели и даёт чёткое понимание того,
что имел в виду автор.

Конструкция называется макроопределением. Она говорит
компилятору о том, что всякий раз, когда он видит указанное имя, стоит
использовать на этом месте указанное значение.

Обратите внимание: макроопределения не завершаются точкой с
запятой в конце строки. Дело в том, что — это не обычное
выражение, а так называемая препроцессорная директива

Подстановка
конкретных значений вместо имён происходит ещё до компиляции, на стадии
предварительной обработки исходного файла. На этой стадии, по сути, компилятор
проделывает операцию как в текстовом редакторе: «Найти все и заменить». Просто
результат этой операции не сохраняется в файл, а тут же им используется для
непосредственной компиляции.

Если бы вы поставили после , в результате обработки компилятор
увидел бы такой код:

// Если завершать директивы точками с запятой…
#define LEFT_LED      13;
#define RIGHT_LED     12;
#define SWITCH_TIME   2000;
 
// …они появятся в самом неподходящем месте
void setup()
{
    pinMode(12;, OUTPUT);
    pinMode(13;, OUTPUT);
}
 
void loop()
{
    digitalWrite(12;, HIGH);
    digitalWrite(13;, LOW);
    delay(2000;);
 
    digitalWrite(12;, LOW);
    digitalWrite(13;, HIGH);
    delay(2000;);
}

Попытка скомпилировать такой скетч приведёт к ошибке.

Встроенные макроопределения

Вы могли догадаться, что уже знакомые нам значения , ,
— это также не что иное как макроопределения. Просто
для них написан в некотором другом месте и мы можем просто сразу ими
пользоваться.

На самом деле код мигания светодиодом:

void setup()
{
    pinMode(13, OUTPUT);
}
 
void loop()
{
    digitalWrite(13, HIGH);
    delay(100);
    digitalWrite(13, LOW);
    delay(900);
}

с точки зрения компилятора есть ни что иное как:

void setup()
{
    pinMode(13, 1);
}
 
void loop()
{
    digitalWrite(13, 1);
    delay(100);
    digitalWrite(13, );
    delay(900);
}

Если вы откроете файл в вашем
дистрибутиве Arduino IDE, вы сможете увидеть, что — это
макроопределение , — , OUTPUT — и т.д. Эти значения
используются настолько часто, что они встроены таким образом.

Использование понятных имён вместо магических чисел — это один из признаков
профессионализма. Это делает код более понятным и простым для изменений, что
всегда уважается.

Об именах макроопределений

По негласному соглашению все макроопределения должны иметь имена, написанные
заглавными буквами с символом нижнего прочерка на месте пробелов.

// плохо
#define ledpin  13
#define led_pin 13
#define LedPin  13
 
// хорошо
#define LED_PIN 13

Это настолько привычное правило, что вы можете ввести в заблуждение других,
если не будете его придерживаться. Опять же, следование общепринятым канонам —
признак профи.

Стоит отметить, что язык C++, как и многие другие считает строчные и заглавные
буквы различными, поэтому если к макроопределению вы затем
попытаетесь обратиться, написав будет выдана ошибка компилятора о
том, что он не понимает что такое . То же самое касается имён
функций и всего остального.

Характеристика основных типов данных в Arduino IDE

Оболочка для программирования Arduino по сути представляет из себя язык C++ с поддержкой большого количества библиотек для облегчения процесса написания программ. C++ предлагает широкий выбор различных типов данных. В этой статье мы рассмотрим только о тех, которые используются для работы с Arduino и сделаем акценты на основных ловушках, которые ожидают начинающего программиста Arduino.

Ниже представлен список основных типов данных, которые используются в скетчах Arduino. Рядом с каждым типом данных указан его размер

Обратите внимание, сто переменные типа signed дают возможность оперировать положительными и отрицательными числами, а переменные типа unsigned допускают только работу с позитивными значениями

  • boolean (8 бит) — простое логическое true/false (правда/ложь)
  • byte (8 бит) — unsigned число в диапазоне от 0-255
  • char (8 бит) — signed число в диапазоне от -128 до 127. В некоторых случаях компилятор будет интерпретировать этот тип данных как символ, что может привести к неожиданным результатам.
  • unsigned char (8 бит) — то же что и ‘byte’; для ясности кода рекомендуется вместо этого типа данных использовать ‘byte’.
  • word (16 бит) — unsigned число в диапазоне от 0 до 65535
  • unsigned int (16 бит)- то же, что и ‘word’. Рекомендуется заменять типом данных ‘word’ для сокращения кода и ясности
  • int (16 бит) — signed число в диапазоне от -32768 до 32767. Один из самых распространенных типов данных, который очень часто используется для объявления переменных в скетчах-примерах для Arduino, встроенных в Arduino IDE
  • unsigned long (32 бита) — unsigned число в диапазоне от 0-4,294,967,295. Чаще всего этот тип данных используется для хранения результатов функции millis( ), которая возвращает количество миллисекунд, на протяжении которого работал ваш код.
  • long (32 бита) — signed число в диапазоне от -2,147,483,648 до 2,147,483,647
  • float (32 бита) — signed число в диапазоне от -3.4028235E38 до 3.4028235E38. Числа с плавающей запятой не характерны для Arduino и компилятору придется прилично попотеть, чтобы их обработать. Так что рекомендуется по возможности их избегать. Более детально мы затронем этот вопрос позже.

В этой статье не рассматриваются arrays (массивы), pointers (указатели) и strings (строки); это специальные типы данных, с более сложной концепцией, которую надо рассматривать отдельно.

Константы, директива define

Если значение глобальной или локальной переменной не задано, то присваивается значение 0. Переменные, которые нельзя изменять в программе после объявления — называются константы. Для задания константы — перед типом данных переменной добавляют const. В следующей таблице приведены типы данных Ардуино, которые можно использовать при написании скетчей для микроконтроллера.

В языке программирования Ардуино дополнительно еще существует директива define, которая объявляется в скетче до процедуры void setup. Формат записи директивы следующий: #define <имя> <значение>. Главное отличие директивы от константы в том, что она не занимает памяти в Ардуино. Директива define используется в программе для назначения имен пинов или хранения констант (постоянных величин).

Arduino Code libraries

Library Structure

A library is a folder comprised of files with C++ (.cpp) code files and C++ (.h) header files.

The .h file describes the structure of the library and declares all its variables and functions.

The .cpp file holds the function implementation.

Importing Libraries

The first thing you need to do is find the library you want to use out of the many libraries available online. After downloading it to your computer, you just need to open Arduino IDE and click on Sketch > Include Library > Manage Libraries. You can then select the library that you want to import into the IDE. Once the process is complete the library will be available in the sketch menu.

In the code provided by circuito.io instead of adding external libraries like mentioned before, we provide them with the firmware folder. In this case, the IDE knows how to find them when using #include.

From Software to Hardware

There is a lot to be said of Arduino’s software capabilities, but it’s important to remember that the platform is comprised of both software and hardware. The two work in tandem to run a complex operating system.

Code →  Compile → Upload →  Run

At the core of Arduino, is the ability to compile and run the code.

After writing the code in the IDE you need to upload it to the Arduino. Clicking the Upload button (the right-facing arrow icon), will compile the code and upload it if it passed compilation. Once your upload is complete, the program will start running automatically.

You can also do this step by step:

  1. First, compile the code. To do this simply click the check icon (or click on sketch > Verify / Compile in the menu bar.

As you can see, the check icon is located in the top left underneath the “File” tag in the menu section.

Once you’ve done this, Arduino will start to compile. Once it’s finished, you’ll receive a completion message that looks like this:

As you can see, the green line at the bottom of the page tells you that you’re “done compiling”. If your code fails to run, you’ll be notified in the same section, and the problematic code will be highlighted for editing.

Once you’ve compiled your sketch, it’s time to upload it.

  1. Choose the serial port your Arduino is currently connected to. To do this click on Tools > Serial port in the menu to designate your chosen serial port (as shown earlier above). You can then upload the compiled sketch.
  2. To upload the sketch, click on the upload icon next to the tick. Alternatively you can go the the menu and click File> upload. Your Arduino LEDS will flicker once the data is being transferred.

Once complete, you’ll be greeted with a completion message that tells you Arduino has finished uploading.

Setting Up Your IDE

In order to connect an Arduino board to your computer you need a USB cable. When using the Arduino UNO, the USB transfers the data in the program directly to your board. The USB cable is used to power your arduino. You can also run your Arduino through an external power source.

Before you can upload the code, there are some settings that you need to configure.

Choose your board — You need to designate which Arduino board you’re going to be using. Do this by click Tools > Board > Your Board.

Choose your processor- there are certain boards (for example Arduino pro-mini) for which you need to specify which processor model you have. Under tools > processor > select the model you have.

Choose your port — to select the port to which your board is connected, go to tools > Port > COMX Arduino (This is Arduino’s serial port).

How to Install Non-Native Boards (e.g. NodeMCU)

Some board models are not pre-installed in the Arduino IDE, therefore you’ll need to install them before you can upload code.

 To install a non-native board such as NodeMCU, you need to:

  1. Click on tools > Boards > Boards Manager
  2. Search for the board you want to add in the search bar and click “install”.

Some boards cannot be found through the Board Manager. In this case, you’ll need to add them manually. In order to do this:

  1. Click on Files > Preferences
  2. In the Additional Boards Manager field, paste the URL of the installation package of your board. For instance, for nodeMCU, add the following URL: http://arduino.esp8266.com/stable/package_esp8266com_index.json
  3. Click OK
  4. Go to tools > Boards > Boards Manager
  5. Search for the board you want to add in the search bar and click “install”.

Once you’ve completed this step, you will see the installed boards in the boards’ list under tools.

Note: the process may differ slightly for different boards.

Объединение строк Arduino

Объединить две строки в одну можно различными способами. Эта операция также называется конкатенацией. В ее результате получается новый объект String, состоящий из двух соединенных строк. Добавить к строке можно различные символы:

  • String3 = string1 + 111; // позволяет прибавить к строке числовую константу. Число должно быть целым.
  • String3 = string1 + 111111111; // добавляет к строке длинное целое число
  • String3 = string1 + ‘А’; // добавляет символ к строке
  • String3 = string1 +  “aaa”;// добавляет строковую постоянную.
  • String3 = string1 + string2; // объединяет две строки вместе.

Важно осторожно объединять две строки из разных типов данных, так как это может привести к ошибке или неправильному результату

Тестируем разные типы данных (Сумма)

Давайте двигаться дальше и проведем тестирование других типов данных. Если вы захотите проделать подобный эксперимент с использованием своей Arduino IDE, измените скетч как это показано на рисунке ниже:

Теперь загрузите новый скетч на ваш Arduino. Проверьте размер после компиляции: 2488 байт при использовании типа данных int. Напомним, что при использовании byte у нас было 2458 байта. Не намного больше, но это всего лишь три переменные! Напомним, что тип данных int занимает 16 байт, а не 8 как, например, byte. Теперь откройте окно серийного монитора, на котором вы должны увидеть что вроде:

Следующее: в этот раз данные отобразились корректно. Это из-за того, что новый тип данных, который мы использовали, int, корректно интерпретируется компилятором как числовой тип и функция Serial.print( ) правильно отображает данные в консоли. Итак, второй урок при работе с разными типами данных Arduino: если вы хотите отправить бинарный эквивалент данных типа числового, скажем, для передачи данных на другой компьютер, а не для отображения в консоли, используйте функцию Serial.write( ).

Теперь давайте посмотрим на строку “Elapsed time”. Мы потратили 12 микросекунд — в три раза больше времени! Почему такая разница? Как мы уже упоминали выше, у нас 8-ми битный процессор, а это значит, что для математических операций с 16-ти битными числами, нам потребуются дополнительная обработка данных.

Теперь давайте займемся типом данных long. Повторите код, заменив тип данных int на long. Загрузите скетч на Arduino и откройте ваш серийный монитор:

Смотрим на размер скетча: 2516 байт, на 28 байт больше, чем при использовании int и на 58 больше, чем с использованием типа данных byte.

Смотрим дальше. Время, которое была затрачено на обработку данных уменьшилось! С 12 до 8 секунд! Почему? Это не логично! Это третий урок, который надо вынести: не всегда то, что вы предполагаете на самом деле происходит. Вероятно, подобное происходит благодаря оптимизации самого компилятора.

Итак, последнее, что мы должны рассмотреть — типы данных с плавающей запятой. Для этого замените тип данных long на float

Загрузите скетч на Arduino и обратите внимание на размер: 3864 байта! Используя тип данных с плавающей запятой вы заставили компилятор обрабатывать значения после запятой. А это дополнительный большой кусок кода

Урок четвертый — не используйте значения с плавающей запятой, если только вы на 60% не уверены, что без этого типа данных вам не обойтись. Например, если вы подключили сенсор и получаете значение с аналогового входа вроде 536, гораздо информативнее будет преобразовать это значение в вольты и отобразить пользователю что-то вроде 2.26 В.

Теперь взгляните на время обработки данной программы: опять 12 миллисекунд. Кстати, заметьте, что значения x, y, z отобразились с двумя нулями в десятичной части. Если вам надо больше (или меньше) значков после запятой, вы можете добавить их с помощью команды:

Serial.print(x, 3); // отображает x с тремя знаками в дробной части.