Синтаксис скетча Arduino
0.0/5 оценка (0 голосов)

Синтаксис скетча 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

Оператор прерывания функции, он же оператор возврата значения из функции.