Освой Arduino играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Цветомузыка и светофор

Цветомузыка

Продолжим наши опыты со светодиодами и усложним схему, добавив пару разноцветных светодиодов. У нас будут три светодиода: красный, синий и зелёный. Схема будет выглядеть так.

Схема с тремя светодиодами

Собираем в следующем порядке. Берем три одинаковых резистора и вставляем их ножки в выводы 10, 11 и 12 на плате. Другие ножки резисторов вставляем в отверстия на макетной плате, например, в A11, A12, A13. Далее берём три светодиода и вставляем длинные ножки в отверстия E11, E12, E13. Короткие ножки светодиодов необходимо разместить вдоль одной линии (F13, G13, H13). Завершает конструкцию перемычка, которая вставляется в отверстие I13 и соединяется с выводом GND на плате Arduino UNO.

Код для цветомузыки

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


int redPin = 10;                  // красный светодиод на выводе 10
int greenPin = 11;                // зелёный светодиод на выводе 11
int bluePin = 12;                 // синий светодиод на выводе 12

void setup()                      // запускается один раз при старте скетча
{
  pinMode(redPin, OUTPUT);        // вывод 10 в режиме вывода
  pinMode(greenPin, OUTPUT);      // вывод 11 в режиме вывода
  pinMode(bluePin, OUTPUT);       // вывод 12 в режиме вывода
}

void loop()                       // повторяется постоянно
{
  digitalWrite(redPin, HIGH);     // включаем красный светодиод
  delay(1000);                    // делаем паузу на 1 секунду
  digitalWrite(greenPin, HIGH);   // включаем зелёный светодиод
  delay(1000);                    // делаем паузу
  digitalWrite(bluePin, HIGH);    // включаем синий светодиод
  delay(1000);                    // снова пауза
  
  // выключаем все светодиоды одновременно
  digitalWrite(redPin, LOW);      
  digitalWrite(greenPin, LOW);
  digitalWrite(bluePin, LOW);
  delay(500);                     // пауза на полсекунды
}

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

При подготовке урока использовались материалы с сайта Arduino Tutorial - Lesson 3 - Breadboards and LEDs.

Светофор

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

Для начала определимся, что будем использовать выводы Arduino под номерами 8, 10 и 12. Вставляем в них провода. Вторые концы проводов вставляем в макетную плату. Затем на соседних местах сажаем резисторы. После них опять на соседних местах сажаем светодиоды. Далее на одной линии от короткой ножки вставляем новые провода и соединяем их с синей рельсой. И, наконец, берём ещё один провод, который будет выходит из синей рельсы и входить в вывод GND.

Смотрим как работает схема. Из вывода 8 выходит ток, проходит через резистор, далее проходит через красный светодиод, потом по проводу попадает на минус и через провод уходит в землю. Цепь замкнута. Остальные два участка цепи с светодиодами работает таким же образом.

Теперь напишем код. Напишем код построчно, имея перед глазами предыдущие примеры.


/*
  Светофор - мигаем светодиодами по очереди, как в реальности
 */
 
int redLed = 8;
int yellowLed = 10;
int greenLed = 12;

void setup() {                
  // initialize the digital pin as an output.
  pinMode(redLed, OUTPUT);  
  pinMode(yellowLed, OUTPUT);  
  pinMode(greenLed, OUTPUT);
}

void loop() {
  digitalWrite(redLed, HIGH);   // включаем красный цвет
  delay(3000);               // красный цвет горит три секунды
  digitalWrite(redLed, LOW);    // выключаем красный цвет
  delay(500);               // на полсекунды
  // Повторяем три раза включение/выключение для мигания по полсекунды
  digitalWrite(redLed, HIGH);
  delay(500);
  digitalWrite(redLed, LOW);
  delay(500);
  digitalWrite(redLed, HIGH);
  delay(500);
  digitalWrite(redLed, LOW);
  delay(500);
  digitalWrite(redLed, HIGH);
  delay(500);
  digitalWrite(redLed, LOW);
  
  // Аналогично для жёлтого цвета
  digitalWrite(yellowLed, HIGH);
  delay(1500); 
  digitalWrite(yellowLed, LOW); 
  delay(500); 
  digitalWrite(yellowLed, HIGH);
  delay(500);
  digitalWrite(yellowLed, LOW);
  delay(500);
  digitalWrite(yellowLed, HIGH);
  delay(500);
  digitalWrite(yellowLed, LOW);
  delay(500);
  digitalWrite(yellowLed, HIGH);
  delay(500);
  digitalWrite(yellowLed, LOW);
  
  // Аналогично для зелёного цвета
  digitalWrite(greenLed, HIGH);
  delay(3000);  
  digitalWrite(greenLed, LOW);   
  delay(500);         
  digitalWrite(greenLed, HIGH);
  delay(500);
  digitalWrite(greenLed, LOW);
  delay(500);
  digitalWrite(greenLed, HIGH);
  delay(500);
  digitalWrite(greenLed, LOW);
  delay(500);
  digitalWrite(greenLed, HIGH);
  delay(500);
  digitalWrite(greenLed, LOW);
}

Некоторые команды утомительно набирать снова и снова. Нам повезло, что светодиоды мигают по три раза. А если по 50 раз? Некоторые участки кода можно заменить циклами for:


/*
  Светофор - мигаем светодиодами по очереди, как в реальности
 */
 
int redLed = 8;
int yellowLed = 10;
int greenLed = 12;

void setup() {                
  pinMode(redLed, OUTPUT);  
  pinMode(yellowLed, OUTPUT);  
  pinMode(greenLed, OUTPUT);
}

void loop() {
  digitalWrite(redLed, HIGH);   // включаем красный цвет
  delay(3000);               // красный цвет горит три секунды
  digitalWrite(redLed, LOW);    // выключаем красный цвет
  delay(500);               // на полсекунды
  // Повторяем три раза включение/выключение для мигания по полсекунды
  for(int i = 0; i < 3; i++){
    digitalWrite(redLed, HIGH);
    delay(500);
    digitalWrite(redLed, LOW);
    delay(500);
  }
  
  // Аналогично для желтого цвета
  digitalWrite(yellowLed, HIGH);
  delay(1500); 
  digitalWrite(yellowLed, LOW); 
  delay(500); 
  
  for(int i = 0; i < 3; i++){
    digitalWrite(yellowLed, HIGH);
    delay(500);
    digitalWrite(yellowLed, LOW);
    delay(500);
  }

  // Аналогично для зелёного цвета
  digitalWrite(greenLed, HIGH);
  delay(3000);  
  digitalWrite(greenLed, LOW);   
  delay(500); 

  for(int i = 0; i < 3; i++){
    digitalWrite(greenLed, HIGH);
    delay(500);
    digitalWrite(greenLed, LOW);
    delay(500);
  }  
}

Код сократился, размер программы уменьшился. Всё работает. Впрочем и это не предел. Циклы выполняют одну и ту же работу, меняется только используемый светодиод. Мы можем создать свою собственную функцию и вынести общий цикл в неё, указав в качестве аргумента номер вывода.


/*
  Светофор - мигаем светодиодами по очереди, как в реальности
 */
 

int redLed = 8;
int yellowLed = 10;
int greenLed = 12;

// the setup routine runs once when you press reset:
void setup() {                
  // initialize the digital pin as an output.
  pinMode(redLed, OUTPUT);  
  pinMode(yellowLed, OUTPUT);  
  pinMode(greenLed, OUTPUT);
}

// the loop routine runs over and over again forever:
void loop() {
  digitalWrite(redLed, HIGH);   // включаем красный цвет
  delay(3000);               // красный цвет горит три секунды
  digitalWrite(redLed, LOW);    // выключаем красный цвет
  delay(500);               // на полсекунды
  // Повторяем три раза включени/выключение для мигания по полсекунды
  blink(redLed);
  
  // Аналогично для желтого цвета
  digitalWrite(yellowLed, HIGH);
  delay(1500); 
  digitalWrite(yellowLed, LOW); 
  delay(500); 
  blink(yellowLed);

  // Аналогично для зелёного цвета
  digitalWrite(greenLed, HIGH);
  delay(3000);  
  digitalWrite(greenLed, LOW);   
  delay(500); 
  blink(greenLed);
}

void blink(int led){
  for(int i = 0; i < 3; i++){
    digitalWrite(led, HIGH);
    delay(500);
    digitalWrite(led, LOW);
    delay(500);
  } 
}

Если нужно что-то изменить в программе, то достаточно в нашей функции указать число миганий, новые продолжительности работы и т.д. Всё в этом месте. Чем больше гибкости, тем удобнее работать над проектом.

Реклама