Працюємо з 09:00 до 19:00 Пн-Пт
Київ біля ТЦ Квадрат бул.Перова

Переменные в Arduino IDE разделяются на глобальные и локальные. Глобальные переменные доступны для чтения и записи в любом месте программы, в любой её функции. А к локальным переменным можно обращаться только в той функции, где они объявлены.



Глобальные переменные объявляются в тексте программы вне функций и перед всеми выражениями и функциями, внутри которых к ним планируется обращение. 


int pin1 = 13;
int pin2 = pin1 +2;
void setup() {
  pinMode(pin1, OUTPUT);
}
void loop() {
  digitalWrite(pin1, HIGH);
  delay(pin2);
  digitalWrite(pin1, LOW);
  delay(pin2);
}

Если объявить переменную в тексте программы после функции, где к ней есть обращение, то компилятор выдаст ошибку. В данном случае функция loop ничего не знает о существовании переменной g, так как она объявлена ниже по тексту программы.

void loop() {
  digitalWrite(LED_BUILTIN, HIGH);
  delay(1000);
  digitalWrite(LED_BUILTIN, LOW);    
  delay(g);                       
}
int g;

В процессе программирования может возникнуть накладка, когда будут объявлены две переменные с одинаковым именем глобальная и локальная. При этом компилятор не будет выдавать ошибку. И переменная с таким именем, после объявления её в функции, будет хранить новые значения только до конца выполнения этой функции, а глобально оставит старое значение. Возможно, это свойство и будет кому-то полезным, но если вы не планировали таких коллизий в своей программе, то внимательно называйте свои переменные. В данном примере в функции loop переменная pin1 хранит значение 13, а в функции setup значение 12.

int pin1 = 13;
void setup() {
  int pin1 = 12;
  pinMode(pin1, OUTPUT);
}
void loop() {
  digitalWrite(pin1, HIGH);
  delay(1000);               
  digitalWrite(pin1, LOW);
  delay(1000);                    
}

Так же в Arduino IDE стоит учитывать такую особенность: переменные , объявленные в цикле for или в других циклах, заключенных между фигурными кавычками {}, будут видны только внутри этого цикла. Так что переменная j на примере будет видна только между данными фигурными кавычками.

for (int j = 0; j < 100; j++) {
  //переменная j будет видна только 
  //внутри данного цикла for
  j = j + 5; //нет ошибки
}
j = j + 5; //ошибка

Стоит так же запомнить, что локальные переменные создаются только на время каждого выполнения функции, в которой они объявлены, и уничтожаются каждый раз по окончании ее выполнения. Но, если нужна переменная, которая должна быть видна только в конкретной функции, и при этом должна сохранять свое значение между вызовами этой функции, то объявлять такую локальную переменную нужно с префиксом static перед  её типом данных.
На примере функция myfunc1 будет при каждом вызове возвращать число 1, а myfunc2 при каждом вызове возвратит число, на единицу большее чем при предыдущем вызове.

int myfunc1() {
  int myvar1;
  myvar1 = myvar1 + 1;
  return myvar1;
}
int myfunc2() {
  static int myvar2;
  myvar2 = myvar2 + 1;
  return myvar2;
}

А теперь  подведем итоги по пройденному материалу. Переменные необходимо объявлять в тексте программы не ниже выражений, в которых они участвуют, - только выше. Локальные переменные используются только внутри функций и внутри циклов FOR и подобных, а глобальные могут быть прочитаны и изменены в любой функции программы. Локальные переменные имеют краткосрочную память – только на время одиночного выполнения функции. Но локальные переменные с префиксом static сохраняют свое значение вплоть до очистки всей оперативной памяти контроллера, как и глобальные переменные.

int RELAY_PIN = 11;//глобальная
void setup()
{
  pinMode(RELAY_PIN, OUTPUT);
  pinMode(MOTOR_PIN, OUTPUT);//ошибка
  Serial.begin(SER_SPEED);//ошибка
  int SER_SPEED = 9600;//локальная
}
int MOTOR_PIN = 3;//глобальная
unsigned long last = millis();//глобальная
void loop()
{
 if (millis() - last>SER_SPEED){ //ошибка
   digitalWrite(RELAY_PIN,HIGH);
   digitalWrite(MOTOR_PIN,HIGH);//нет ошибки
   last = millis();
 }
}

Написать отзыв

Примечание: HTML разметка не поддерживается! Используйте обычный текст.
    Плохо           Хорошо
Модуль питания 5В, 3,3В для макетных плат

Модуль питания 5В, 3,3В для макетных плат

Модуль питания для удобной подачи напряжения питания на макетную плату.Внешнее питание 5В через USB ..

27.69грн.

Выключатель круглый 16мм

Выключатель круглый 16мм

Круглый выключатель питанияЦвет черныйВнешний диаметр 16 ммУстановочный диаметр 15 ммРазмеры указаны..

10.26грн.

Электромагнитное реле 24 В

Электромагнитное реле 24 В

Имеет одну группу переключающихся контактовТок коммутации при переменном напряжении 250 В - 10 А,при..

15.07грн.

Включение тиристоров переменным током. Фазовое управление

Включение тиристоров переменным током. Фазовое управление

Особенности работы с тирист-ми на переменном токеУправление тиристорами в цепях переменного тока име..

Простейший способ проверки GSM-модуля

Простейший способ проверки GSM-модуля

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

Теги arduino, arduino pro, arduino uno, arduino tutorial, ардуино, скетч, arduino projects, arduino уроки, arduino уроки программирования, arduino урок 1, arduino ide уроки, arduino первые уроки, arduino уроки для начинающих, alex gyver arduino уроки, arduino nano, arduino структура программы, микроконтроллер, arduino ide, ардуино уроки, ардуино уроки для начинающих, ардуино урок 1, arduino setup, arduino loop, программировать контроллер, arduino начало, arduino для начинающих