Главная » Arduino
Призовой фонд
на июль 2017 г.
1. Осциллограф DSO138
Паяльник
2. Регулируемый паяльник 60 Вт
Паяльник
3. 200 руб.
От пользователей

Курс 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. До скорого!

Список радиоэлементов

Обозначение Тип Номинал Количество ПримечаниеМагазинМой блокнот
Плата Arduino
Arduino Uno
1 Поиск в FivelВ блокнот
Светодиод
АЛ307В
1 Поиск в FivelВ блокнот
Светодиод
АЛ102Б
1 Поиск в FivelВ блокнот
Светодиод
АЛ307Д
1 Поиск в FivelВ блокнот
Резистор
10 кОм
1 Поиск в FivelВ блокнот
Резистор
220 Ом
3 Поиск в FivelВ блокнот
Переменный резисторФоторезистор VT90N21 Поиск в FivelВ блокнот
Макетная платаBreadboard-half1 Поиск в FivelВ блокнот
Соединительные провода"Папа-Папа"1 Поиск в FivelВ блокнот
Кнопка тактоваяБез фиксатора1 Поиск в FivelВ блокнот
Добавить все

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

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

Теги:

Опубликована: 0 0
Я собрал 0 1
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 5 Проголосовало: 1 чел.

Комментарии (0) | Я собрал (0) | Подписаться

Статью еще никто не комментировал. Вы можете стать первым.
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется напряжение?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Модуль измерения тока на ACS712 (30А)
Модуль измерения тока на ACS712 (30А)
ELM327 OBD II — адаптер с поддержкой CAN Автомобильный GPS-трекер с GSM/GPRS и дистанционным управлением
вверх