Arduino
В отличии от программы на языке C++ с обязательной функцией main(int argc, char *argv[]) , скетч для Arduino содержит две другие обязательные функции.
Как видно из все того же примера мигания светодиодом, это функции setup() и loop() .
Функция setup() вызывается лишь один раз при первом запуске программы. Ее стандартное использование: первичная настройка. Обычно это установка режима работы пинов, инициализация переменных и объектов. Функция должна обязательно присутствовать в программе, даже если она пустая. В нашем примере в ней задается режим работы пина 13.
Функция loop() содержит код, который повторяется бесконечное число раз в цикле. Весь основной код обычно размещается здесь. В примере это строчки с 8 по 11, в которых происходит повторение функции digitalWrite() , которая зажигает и гасит светодиод. Между ее вызовами стоит функция задержки delay() .
Функция loop() также должна обязательно присутствовать в скетче. Хотя обычно она содержит код, бывают случаи, когда программа должна выполниться лишь один раз, после чего завершиться. В этом случае удобнее весь код разместить в функции setup() , а loop() останется пустой.
Arduino Void Setup and Void Loop Functions [Explained]
When you open a new program in the Arduino IDE, you immediately get empty void setup and void loop functions written for you.
What are those void setup and void loop functions in Arduino?
In this tutorial I’ll explain to you the role of those functions and how to use them. At the end I’ll also give you some best practices to improve your Arduino programs.
Here is a quick video you can watch as an additional resource to this article:
If you like this video, subscribe to the Robotics Back-End Youtube channel so you don’t miss the next tutorials!
You are learning how to use Arduino to build your own projects?
Check out Arduino For Beginners and learn step by step.
Table of Contents
Void setup and void loop: mandatory functions in Arduino
The Arduino void setup and void loop functions are mandatory. Try to compile a code with one of those functions missing, and you’ll get an error.
When you run a “standard” C/C++ program, you have to write a “main” function. This main function will be called first, and from there, you will call other functions and execute the functionalities of your program.
In Arduino, there is no main function. This is replaced by setup and loop. Instead of one mandatory function, you have 2.
All your Arduino program must include those functions. On top of them, you can add any number of functions, variables, and create as many files as you want. You just need to make sure that the void setup and void loop are present.
How void setup and void loop work
Principle
As the “main” function is called when you run a C/C++ program, the setup and loop functions will be automatically called.
As soon as the program starts:
- Variables that you create on top of the program will be declared/initialized.
- The setup function will be called once.
- All the code you’ve written inside this function will be executed. After that, the setup function exits.
- Now the loop function will be called, so all the code inside the loop will be executed.
- When the loop function exists, go back to step 4.
The code inside the void setup will be executed once, and only once, at the beginning of the program.
Then, the code inside the void loop will be executed again and again (hence the name “loop”), until you:
- Power off the Arduino board.
- or Restart the Arduino program – by pressing the reset button / uploading a new sketch / re-opening the Serial Monitor on some Arduino boards.
After you start or restart the program, all the data – variable states and execution step – from the previous run will be lost. If you want to keep some data between different program runs, one easy way is to use the EEPROM memory if available.
Code Example
Let’s write a code example to see how the Arduino void setup and void loop work in detail.
And here’s the result when you compile the code, upload it to your Arduino board, and open the Serial Monitor.
Great, now let’s analyze this by breaking down the code line by line.
Init and void setup
First we create a global variable, so we can modify it inside a function and still be able to get its value in another function.
Note: even if you declare a variable without initializing it in Arduino, it will automatically get the value “0” (more info about the Arduino language). So, at this point of the program, the counter variable contains the value “0”.
This is the beginning of the void setup function. The execution will start with Serial.begin(9600); .
Still in the setup function, we set a new value (10) for the counter variable. And just after that we print the value in the Serial Monitor. In the output you get, this is where the line “Counter: 10” comes from.
And as you can notice, in line 9 we close the curly brackets for the void setup function. So, what’s happening now?
void loop
The void loop function is now called and every instruction you’ve provided here will be executed.
In this case, we increase the counter by 1 (so the first time we enter the loop, the counter goes from 10 to 11). Just after that, we print the value for the counter – this will be “Counter: 11”.
And finally, we add a 1 second pause to the program, so the output on the Serial Monitor will not be displayed to fast for our human eyes.
What happens when the void loop function exits?
Well, just after, it is called again. So, it means the line that comes after line 15 is line 12. The instruction just after delay(1000); is counter++; .
As the counter variable is a global variable, its value is not lost when we go out and enter the loop function again. So, now we increment it, it goes from 11 to 12.
And the cycle continues. Every time we enter the loop, we add 1 to the counter, print the value, and wait for 1 second.
Now, if you power off the Arduino, the program will stop. If you restart the program, any progress for the variables will be lost, and the entire program will start from the beginning.
Writing Arduino programs – best practices for void loop and void setup
Great, now that you understand how things work, I’m going to give you a few best practices you can implement right now in your Arduino programs, regarding those void setup and void loop functions.
Arduino void setup
As the void setup function is called only once at the very beginning of the program, this will be the place to:
- Initialize variables’ values.
- Setup communications (ex: Serial).
- Setup modes for digital pins (input/output).
- Initialize any hardware component (sensor/actuator) plugged to the Arduino.
- Etc.
The void setup, as its name suggest, is made for you to do any setup required at the beginning of the program. Don’t write the core functionalities here, just the initialization code.
Depending on the complexity of your program, you may have a lot of instructions to write in that void function. You can create new functions that you call from the void setup, no problem with that.
Also, in general it’s better to avoid using delay(), but there’s no problem in the void setup: if a component needs 2 seconds to be initialized after being powered on, then wait 2 seconds!
Arduino void loop
Now, in the void loop you’ll write your main program, knowing that the initialization is already done. In this function, always keep in mind that the last line is followed by the first line!
Also, any variable you’ve declared inside the void loop will be lost when the program exits and enters the function again. So, if you want to be able to keep data between 2 void loop, make sure to declare variables in a more global scope.
As for void setup, there’s no need to write all the code directly in the function. You can create as many other functions as you want (and classes too), and call those functions in the void loop. Ideally, the void loop should contain just a few lines calling other functions. Don’t bloat your void loop, just as you don’t bloat your “main” in a standard C/C++ program.
Finally, pay attention to delay(). In the void loop (and any function called from the void loop) you don’t want to block the execution of the code too long, especially if you plan to do some kind of multi-threading with your Arduino.
Conclusion
Now you should have a better idea of the concept behind Arduino void setup and loop functions.
For now, focus on creating programs that work, and try to follow the best practices from this guide. As you progress with Arduino, you’ll get more understanding from your own experience. This experience will help you decide what you can/can’t do in your void setup and void loop functions – because in the end, every program is different.
Did you find this tutorial useful?
Do you want to learn Arduino from scratch?
If yes, this course is for you:
LEARN HOW TO PROGRAM ROBOTS
Did you find this tutorial useful?
Do you want to become better at programming robots, with Arduino, Raspberry Pi, or ROS2?
If yes, subscribe to receive exclusive content and special offers!
Arduino для начинающих. Часть 1
Доброго времени суток, Хабр. Запускаю цикл статей, которые помогут Вам в знакомстве с Arduino. Но это не значит, что, если Вы не новичок в этом деле – Вы не найдёте ничего для себя интересного.
Введение
Было бы не плохо начать со знакомства с Arduino. Arduino – аппаратно-программные средства для построения систем автоматики и робототехники. Главным достоинством есть то, что платформа ориентирована на непрофессиональных пользователей. То есть любой может создать своего робота вне зависимости от знаний программирования и собственных навыков.
Начало
Создание проекта на Arduino состоит из 3 главных этапов: написание кода, прототипирование (макетирование) и прошивка. Для того, чтоб написать код а потом прошить плату нам необходима среда разработки. На самом деле их есть немало, но мы будем программировать в оригинальной среде – Arduino IDE. Сам код будем писать на С++, адаптированным под Arduino. Скачать можно на официальном сайте. Скетч (набросок) – программа, написанная на Arduino. Давайте посмотрим на структуру кода:
Важно заметить, что обязательную в С++ функцию main() процессор Arduino создаёт сам. И результатом того, что видит программист есть:
Давайте разберёмся с двумя обязательными функциями. Функция setup() вызывается только один раз при старте микроконтроллера. Именно она выставляет все базовые настройки. Функция loop() — циклическая. Она вызывается в бесконечном цикле на протяжении всего времени работы микроконтроллера.
Первая программа
Для того, чтоб лучше понять принцип работы платформы, давайте напишем первую программу. Эту простейшую программу (Blink) мы выполним в двух вариантах. Разница между ними только в сборке.
Принцип работы этой программы достаточно простой: светодиод загорается на 1 секунду и тухнет на 1 секунду. Для первого варианта нам не понадобиться собирать макет. Так как в платформе Arduino к 13 пину подключён встроенный светодиод.
Прошивка Arduino
Для того, чтоб залить скетч на Arduino нам необходимо сначала просто сохранить его. Далее, во избежание проблем при загрузке, необходимо проверить настройки программатора. Для этого на верхней панели выбираем вкладку «Инструменты». В разделе «Плата», выберете Вашу плату. Это может быть Arduino Uno, Arduino Nano, Arduino Mega, Arduino Leonardo или другие. Также в разделе «Порт» необходимо выбрать Ваш порт подключения (тот порт, к которому вы подключили Вашу платформу). После этих действий, можете загружать скетч. Для этого нажмите на стрелочку или во вкладке «Скетч» выберете «Загрузка» (также можно воспользоваться сочетанием клавиш “Ctrl + U”). Прошивка платы завершена успешно.
Прототипирование/макетирование
Для сборки макета нам необходимы следующие элементы: светодиод, резистор, проводки (перемычки), макетная плата(Breadboard). Для того, чтоб ничего не спалить, и для того, чтоб всё успешно работало, надо разобраться со светодиодом. У него есть две «лапки». Короткая – минус, длинная – плюс. На короткую мы будем подключать «землю» (GND) и резистор (для того, чтоб уменьшить силу тока, которая поступает на светодиод, чтоб не спалить его), а на длинную мы будем подавать питание (подключим к 13 пину). После подключения, загрузите на плату скетч, если вы ранее этого не сделали. Код остаётся тот же самый.
Урок 2. Программируем Arduino: структура кода
В прошлой статье мы разобрали устройство платы Arduino, научились подключать ее к компьютеру и загрузили свой первый скетч! Называется он Blink и отвечает за мигание встроенного светодиода в плату с определенной частотой. Если вы начинающий, и только начали изучать мир Arduino, то вам некоторые функции в коде могут быть непонятны. Поэтому давайте разберем все по порядку. Структура кода в Arduino IDE – начинаем!

Программный код состоит из двух обязательных частей – функций. Первая часть называется void setup() (в переводе на русский – установка) и в ней прописывается код, который отработает всего один раз. Во второй обязательной функции void loop() прописывается код, работающий в бесконечном цикле. Сюда прописывается то, что будет происходить циклично (то есть с определенной частотой в определенный промежуток времени). Еще перед этими двумя функциями, то есть в самом начале кода, иногда прописываются различные директивы или переменные, которые будут необходимы для дальнейшей работы кода. Они будут постоянны на протяжении всего кода (это различные библиотеки, введенные названия устройств и т.д.)
Если перенестись на минутку в реальный мир, то эту структуру легко можно представить на простых вещах. Например, вы включаете свет в комнате, когда темно. Для этого, вы нажали на выключатель и лампочка загорелась. Также и в коде: сначала мы задаем постоянные данные, которые нам необходимы, то есть прописываем, что существует некое устройство (лампочка), прописываем для нее низкой значение
Таким образом, структура кода будет всегда одна и та же, вы ее сейчас видите ниже (от нее уже и нужно будет отталкиваться в дальнейшем, в зависимости от того, что вы хотите сделать и запрограммировать)
В нашем первом коде Blink есть некая функция PinMode(), а также delay() и digitalWrite()
Разберемся с каждой из них в отдельности.
В нашем коде встроенный светодиод мигает с частотой в одну секунду. Он подключается к выводу 13. В прошлом статье мы уже говорили, что на плате Arduino имеются выводы для подключения различных устройств и периферии – они делятся на цифровые и аналоговые. По отдельности их мы разберём чуть позднее, а пока скажем, что у каждого вывода есть номер. На плате Arduino Uno вверху расположены выводы, пронумерованные от 0 до 13. Это цифровые выводы, к ним подключают обычно различные светодиоды. Однако, вывод номер 13 отвечает за работу встроенного светодиода на плате и служит, чаще всего, для проверки ее работоспособности. Указав в скетче номер вывода, мы можем работать с устройством, которое подключено к нему.
Функция PinMode() служит для настройки этого самого вывода. Все выводы на плате могут работать, как входы, так и выходы. Потому пользователь это также должен учитывать. По умолчанию, все контакты являются входами, но для светодиода нужен выходной сигнал, так как на него идет рабочая команда и подается напряжение.
Функция PinMode(pin, mode); состоит из двух значений. Это pin — номер вывода (например у нас светодиод подключен к выводу 13) и mode — режим входа/выхода (INPUT/OUTPUT)
PinMode(13,OUTPUT);
Дальше в функции void loop() прописывается сам цикл. После определения контакта, как выход — можно устанавливать ей высокое или низкое состояние, это 0 или 5 вольт напряжения (иногда бывает и 3,3 вольт, но об этом тоже позднее)
Изменять состояние выходного сигнала можно с помощью функции digitalWrite(pin, level); Она тоже состоит из двух значений. Это pin — номер вывода (например у нас светодиод подключен к выводу 13) и level — уровень выходного сигнала: он может быть низкий(HIGH) или высокий(LOW)
digitalWrite(13, HIGH); // подается высокое напряжение и светодиод включается.
digitalWrite(13, LOW); // напряжение не подается, светодиод выключен.
Функция delay() служит для установки задержки в программном коде между выполнением различных действий (так как контроллер не может одновременно выполнять несколько действий, а выполняет их последовательно). В самой функции прописывается время этой самой задержки в миллисекундах (1000мс=1с)
delay(1000); //устанавливаем задержку в 1 секунду
Пример кода Blink:
void setup()
<
pinMode(13, OUTPUT);
>
void loop()
<
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13, LOW);
delay(1000);
>
На этом наш второй урок по программированию на Arduino подходит к концу. Сегодня мы познакомились со структурой кода на примере Blink, узнали о новых функциях и как их использовать, а впереди нас ожидает еще много всего интересного и познавательного. Всем удачной компиляции и отличного настроения!
Данная статья — является собственностью интернет-магазина РОБОТОТЕХНИКА