Освой 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);
}
}
Если нужно что-то изменить в программе, то достаточно в нашей функции указать число миганий, новые продолжительности работы и т.д. Всё в этом месте. Чем больше гибкости, тем удобнее работать над проектом.