Курс Arduino — Прерывания, создание функций, советы

Функции и точность показаний

Помнишь свой первый эксперимент? А помнишь, как я учил делать его компактнее с помощью for? К чему я это. В этом уроке я покажу, как можно проще выполнять однотипные действия. Сильно доставляет, когда в коде нужно много раз выполнять одно и то же действие. Чтобы облегчить жизнь, я познакомлю тебя с созданием функций.

Ещё мы рассмотрим такую полезную штуку, как прерывания. Чем она полезна, рассмотрим ниже.

Что понадобится?

  • Светодиоды
  • Резисторы на 220 Ом и на 10 кОм
  • Соединительные провода «ПАПА- ПАПА»
  • Фоторезистор
  • Тактовая кнопка

Функции

Соберем светофор из первого эксперимента.

Код

// Основная часть
#define RED 13
#define YELLOW 12
#define GREEN 11

void setup()
{
// Объявление пинов.
for (int i = 0; i < 3; ++i)
pinMode(i + GREEN, OUTPUT);
}

void loop()
{
//Вызов функций.
riy_light();
green();
yellow();
}

// Началось описание функций.

void riy_light()
{
int main_delay = 5000;
int mini_delay = 1000;

digitalWrite(RED, HIGH);
delay(main_delay);

digitalWrite(YELLOW, HIGH);
delay(mini_delay);
}

void green()
{
int main_delay = 5000;
int blink_delay = 800;

digitalWrite(RED, LOW);
digitalWrite(YELLOW, LOW);
digitalWrite(GREEN, HIGH);
delay(main_delay);
digitalWrite(GREEN, LOW);

for(int i = 0; i < 3; i = i+1)
{
delay(blink_delay);
digitalWrite(GREEN, HIGH);
delay(blink_delay);
digitalWrite(GREEN, LOW);
}
}

void yellow()
{
int mini_delay = 1000;

digitalWrite(YELLOW, HIGH);
delay(mini_delay);
digitalWrite(YELLOW, LOW);
delay(mini_delay);
}

Пояснения

Функции – чтобы создать функцию, мы должны дать ей название, определить ее тип, передать или не передать параметры, определиться с возвращаемыми значениями.

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

После этих действий, описываем, что будет выполнять функция.

А чтобы вызвать функцию, мы должны написать ее имя с круглыми скобками вот так: function();

Внимательный товарищ заметит, что самодельные функции вызываются так же, как и стандартные функции среды Arduino IDE и функции из подключенных библиотек. Отсюда можно судить, что и библиотека, и стандартные функции – это набор сделанных кем-то функций. Логично, да?

«А могу ли я сделать собственную библиотеку из созданных мною функций?» — спросишь ты. Конечно. Эту задачу мы будем пробовать выполнить в третьей части курса. Сейчас нам это не пригодится. Есть ещё много более нужной сейчас информации, не стоит забивать голову.

Прерывания

Чем полезны прерывания? Они позволяют приостановить выполнение основного кода для выполнения какого-нибудь действия. Это бывает полезно в считывании показаний с датчиков. Так как показания считываются лишь один раз за проход loopa. А если в нем есть паузы, то показания становятся неточными. Это важно в подсчете оборотов колеса, например.

Сейчас я докажу важность прерываний простым экспериментом.

 

Код

#define FOT A2
#define BUT 2

// Для работы с прерываниями нужно создать переменную volatile

volatile int val;

void setup()
{
pinMode(BUT, INPUT_PULLUP);
pinMode(FOT, INPUT);

// Когда значение изменяется с HIGH на LOW
// Обращаемся к функции out
attachInterrupt(0, out, FALLING);

Serial.begin(9600);
}

void loop()
{
Serial.println(«Value»);
Serial.println(analogRead(FOT));

// Вместо задержки могут выполняться разные действия
// Она создает имитацию большого кода
delay(5000);
}
// Функция, вызываемая прерываниями
void out()
{
val = analogRead(FOT);
Serial.println(«Extra value»);
Serial.println(val);
}

Пояснения

Volatile – для работы с прерываниями мы должны создать переменную с квалификатором. Этот квалификатор объявляется, когда переменная будет изменяться за пределами того участка, где она была объявлена.

attachInterrupt(№, Function, Mode); — Объявляем о создании прерывания.

№ — определяет номер прерывания. На Arduino Uno могут обрабатываться всего два прерывания. Прерывание 0 считывается со 2 пина, прерывание 1 – с 3.

Ко второму мы и подключили кнопку.

Function – Это функция, которая будет выполняться, когда произошло прерывание.

Она не должна иметь параметров и не должна возвращать значение. Кроме того, в функции, вызываемой прерываниями не работает delay(), значение millis() не изменяется и может быть потеря данных с Serial Monitor. А переменные, используемые в функции, должны быть volatile.

Mode – Это условие, при котором будет выполняться прерывание. Всего таких условий четыре:

LOW – когда на порту LOW.

CHANGE – когда значение меняется с LOW на HIGH и наоборот.

RISING – когда значение изменяется с LOW на HIGH.

FALLING – когда значение изменяется с HIGH на LOW.

Конец?

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

Советы

У тебя есть интернет, если ты читаешь эту статью. А интернет – это кладезь полезной информации. Нужно лишь знать, как ее оттуда извлечь.

Ты уже научился, как обращаться с незнакомыми микросхемами. Таким образом, можно и даже нужно, обращаться и с остальными незнакомыми штуками. Если ты чего- то не понял, не стесняйся писать мне или искать в других источниках.

Главное – захотеть. А дальше разберешься.

Подготовка

Решил собрать свою схему? Похвально! С чего начать? Начни с бумаги! Сначала определись с тем, что ты хочешь от своего устройства. После этого, придумай алгоритм выполнения поставленной задачи и запиши, а лучше – зарисуй его. Когда все продумано, определись с компонентами, необходимыми для сборки. После этого, приступай к написанию кода и сборке схемы.

Ошибки

А что делать, если код не работает?

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

Ещё нужно перестать бояться выскакивающих ошибок.

Рассмотрим пример ошибки.

Это ошибка выскакивает, когда пропущена точка с запятой, о чем и говорит «expected ‘;’ before ‘}’ token»

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

А эта, когда ты не объявил переменную.

Если перевести текст ошибки, будет « ‘Val’ не был объявлен в этой области видимости. Ещё хорошо, что не объявленная переменная подсвечивается, и нет надобности ее искать.

А такая ошибка возникает, если пропущена фигурная скобка.

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

Вгрузил. Не работает

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

В таких случаях нужно определить, где код выполняется как надо, а где что-то уже не так. Для этого можно воспользоваться индикаторами. К примеру, пищалкой или Serial monitor. Для этого, вставляем tone куда-либо в программу. Если звук произошел, то эта часть программы работает как надо. А если его не было, нужно вставить звук раньше или определить, что не так. Serial может передавать мини- отчеты о выполнении тех или иных частей программы.

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

Ещё проблема может быть на поверхности – забыл подключить к земле. Или поставил светодиод анодом к минусу и прочие неприятные оказии. Чтобы их избежать, проводи осмотр своих схем перед запуском. И да, если что-то не так, лучше вынуть кабель питания, и лишь после этого, менять схему.

Отдыхай!

Хватит на сегодня, пожалуй. Можешь быть горд, что познал основы Arduino. До скорого!

Список радиоэлементовОбозначение
Тип
Номинал
Количество
ПримечаниеМагазинМой блокнот

Плата ArduinoArduino Uno1

СветодиодАЛ307В1

СветодиодАЛ102Б1

СветодиодАЛ307Д1

Резистор10 кОм1

Резистор220 Ом3

Переменный резисторФоторезистор VT90N21

Макетная платаBreadboard-half1

Соединительные провода"Папа-Папа"1

Кнопка тактоваяБез фиксатора1
Добавить все

Скачать список элементов (PDF)

Прикрепленные файлы:

Добавить комментарий

Ваш адрес email не будет опубликован.