Arduino:Примеры/MultipleBlinks

Материал из Онлайн справочника
Версия от 22:17, 13 декабря 2016; Myagkij (обсуждение | вклад) (Замена текста — «<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">» на «<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">»)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Мигание несколькими светодиодами[1]

Библиотека Scheduler позволяет плате Arduino Due выполнять несколько задач одновременно. В этом примере мы настроим несколько функций таким образом, чтобы они выполнялись одновременно с loop(), благодаря чему у нас будет несколько отдельных loop-функций, не требующих отдельного таймера.

Необходимое оборудование

  • Плата Arduino Due
  • Три светодиода
  • Три резистора на 220 Ом

Цепь

Аноды светодиодов нужно подключить последовательно при помощи 220-Омовых резисторов к 11-ому, 12-ому и 13-ому контактам на Due. Катоды светодиодов нужно подключить к «земле».

Код

// раз мы хотим выполнить несколько задач одновременно, то подключаем библиотеку Scheduler:
#include <Scheduler.h>

int led1 = 13;
int led2 = 12;
int led3 = 11;

void setup() {
  Serial.begin(9600);

  // выставляем три светодиодных контакта в положение OUTPUT:
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);

  // добавляем в планировщик функции loop2 и loop3;
  // loop() всегда запускается по умолчанию:
  Scheduler.startLoop(loop2);
  Scheduler.startLoop(loop3);
}

// Задача номер 1 – мигать светодиодом с секундной задержкой:
void loop() {
  digitalWrite(led1, HIGH);

  // ВАЖНО:
  // когда запущено несколько задач, delay() переводит задачу в
  // состояние ожидания и передает управление другим задачам, тем
  // самым гарантируя, что они будут выполняться:
  delay(1000);

  digitalWrite(led1, LOW);
  delay(1000);
}

// Задача номер 2 – мигать светодиодом с 0,1-секундной задержкой:
void loop2() {
  digitalWrite(led2, HIGH);
  delay(100);
  digitalWrite(led2, LOW);
  delay(100);
}

// Задача номер 3 – прием команд через последовательный порт; 
// «0» выключает светодиод,
// «1» включает светодиод:
void loop3() {
  if (Serial.available()) {
    char c = Serial.read();
    if (c=='0') {
      digitalWrite(led3, LOW);
      Serial.println("Led turned off!");  //  "Светодиод выключен!"    }
    if (c=='1') {
      digitalWrite(led3, HIGH);
      Serial.println("Led turned on!");  //  "Светодиод выключен!"
    }
  }

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

См.также

Внешние ссылки