Синтаксис скетча Arduino
Комментарии - это пояснительные инструкции, которые можно включить в код C++, чтобы объяснить, что делает этот код.
Компилятор игнорирует все, что появляется в комментарии, поэтому ни одно из этих сведений не отображается в результате.
- Однострочный комментарий.
Комментарий, начинающийся с двух косых черт ( // ), называется однострочным. Косые черты говорят компилятору игнорировать все, что следует, вплоть до конца строки.
#include <iostream>
using namespace std;
int main()
{
cout << "Hello world!"; // Выводит на печать "Hello world" Это однострочный
// комментарий
return 0;
}
- Многострочный комментарий.
Комментарии, требующие нескольких строк, начинаются с /* и заканчиваются на */.
Их можно разместить на одной линии или вставить между ними одну или несколько строк.
/* Это комментарий */
/* Комментарии на языке C++
могут занимать несколько строк
*/
Обязательные функции
- void setup() {}
Скетч начинается с void setup.
Функция setup() вызывается, когда стартует скетч. Используется для инициализации переменных, определения режимов работы выводов, запуска используемых библиотек и т.д. Функция setup запускает только один раз, после каждой подачи питания или сброса платы Arduino.
Пример
int buttonPin = 3;
void setup()
{
Serial.begin(9600);
pinMode(buttonPin, INPUT);
}
void loop()
{
// ...
}
- void loop() {}
Функция loop() крутится в бесконечном цикле, позволяя программе совершать вычисления и реагировать на них.
int buttonPin = 3;
// setup инициализирует последовательный порт и кнопку
void setup(){
beginSerial(9600);
pinMode(buttonPin, INPUT);
}
// в цикле проверяется состояние кнопки,
// и на последовательный порт будет отправлено сообщение, если она нажата
void loop(){
if (digitalRead(buttonPin) == HIGH)
serialWrite('H');
else
serialWrite('L');
delay(1000);
}
Директивы
- #define
Директива позволяет дать имя константе перед тем как программа будет скомпилирована.
#define ledPin 3
// компилятор заменит любое упоминание ledPin
//на значение 3 во время компиляции
#define ledPin 3;
// это ошибка, ; здесь не нужна
#define ledPin = 3
// это тоже ошибка, знак = не нужен
***Стоит упомянуть о некотором нежелательном эффекте, который может иметь место при использовании директивы #define. Например, если имя константы, заданное с помощью директивы #define включить в имя другой константы или переменной, то оно будет заменено на свое значение.
- #include
Директива используется для включения сторонних библиотек в скетч
#include <Servo.h>
// подключает библиотеку. Ищет в папке с библиотеками
#include "Servo.h"
// ищет в папке со скетчем, а потом в папке с библиотеками
- #if, #else, #elif и #endif
§
Если после \(\#if\) константное выражение принимает истинное значение, то код между #if и #endif компилируется, в противном случае код пропускается. Директива #endif используется для обозначения конца блока #if.
Стандартный вид #if следующий:
//Например:
/* простой пример с #if */
#include <stdio.h>
#define MAX 100
void loop() {
#if MAX>99
Serial.println("Скомпилировано для массива больше 99.\n");
#endif
return 0;
}
Данная программа выводит сообщение на экран, поскольку, как определено в программе, МАХ имеет значение больше 99. Данный пример демонстрирует очень важный момент: выражение, следующее зa #if, вычисляется на этапе компиляции, следовательно, оно должно содержать ранее определенные идентификаторы и константы, а не переменные.
§
Работа \(\#else\) во многом похожа на работу оператора else — она предоставляет альтернативный вариант, если #if содержит ложное состояние. Предыдущий пример можно расширить следующим образом:
/* простой пример с #if / #else */
#include <stdio.h>
#def ine MAX 10
void loop(){
# if MAX>99
printf("Скомпилировано для массива больше 99.\n");
#else
printf("Скомпилировано для небольшого массива.\n");
#endif
return 0;
}
В данном случае MAX определяется так, чтобы значение было меньше 99, в результате чего компилируется не код, соответствующий #if, а код, соответствующий #else. Следовательно, выводится сообщение «Скомпилировано для небольшого массива».
Обратим внимание, что #else используется для обозначения конца блока #if и начала блока #else. Это делается потому, что может быть только один #endif, связанный c #if.
§
\(\#elif\) означает «иначе если» и используется для построения лесенки if-else-if с целью определения различных опций компиляции. За #elif следует константное выражение. Если выражение истинно, то блок кода компилируется и остальные выражения не проверяются. В противном случае рассматривается следующий блок.
#define US 0
#define ENGLAND 1
#define FRANCE 2
#define ACTIVE_COUNTRY US
#if ACTIVE_COUNTRY==US
char currency[] = "dollar";
#elif ACTIVE_COUNTRY==ENGLAND
char currency[] = "pound";
#else
char currency[] = "franc";
#endif
- #ifdef, #ifndef
Другой метод условной компиляции состоит в использовании директив \(\#ifdef\) и \(\#ifndef\), что соответственно означает «если определено» и «если не определено».
Стандартный вид #ifdef следующий:
#ifdef имя_макроса
последовательность операторов
#endif
Если имя макроса определено ранее в операторе #define, то последовательность операторов, стоящих между #ifdef и #endif, будет компилироваться.
Стандартный вид #ifndef следующий:
#ifndef имя_макроса
последовательность операторов
#endif
Если имя макроса не определено ранее в операторе #define, то последовательность операторов, стоящих между #ifdef и #endif, будет компилироваться.
Kaк #ifdef, так и #ifndef могут использовать оператор #else, но нe #elif. Например:
#include <stdio.h>
#define TED 10
void setup (){
#ifdef TED
Serial.println("Привет тед\n");
#else
Serial.println("Привет всем\n");
#endif
#ifndef RALPH
Serial.println("РАЛЬФ не определен\n");
#endif
return 0;
}
выводит «Привет тед» и «РАЛЬФ не определен». Если TED не определен, то выведется «Привет всем», a за ним «РАЛЬФ не определен».
- goto
Оператор перехода в другую часть кода по метке. Не рекомендуется к использованию, всегда можно обойтись без него. Как пример использования – выход из кучи условий
for (byte r = 0; r < 255; r++) {
for (byte g = 255; g > -1; g--) {
for (byte b = 0; b < 255; b++) {
if (analogRead(0) > 250) {
// уйти из сравнений
goto bailout;
}
// еще код
}
}
}
bailout:
// перенеслись сюда
- return
Оператор прерывания функции, он же оператор возврата значения из функции.