Светофор на Arduino
Давайте и мы создадим свой почти настоящий светофор.
1. Необходимые компоненты
Плата Arduino Uno или Nano.
Макетная плата.
Три светодиода. Естественно, что лучше всего красного, желтого и зеленого цветов.
Три резистора номиналом 220 Ом.
Соединительные провода.
2. Схема подключения
Давайте начнем проект со сборки электрической цепи. Схема достаточно проста – соединяем три светодиода. Плюс к цифровому пину, минус – к земле. Обратите внимание, что мы объединили три контакта в один с помощью общей шины макетной платы. Красный свет светофора мы соединим с пином 11, желтый – с 10, зеленый – с 9. Не забывайте про полярность.

Схема подключения светофора на Arduino
Узнать полярность светодиода можно по нескольким признакам:
Если присмотреться то внутри пластика можно увидеть 2 части светодиода. Анод (+) обычно меньше.
Можно использовать мультиметр в режиме прозвонки. Светодиод пропускает ток только от анода (+) к катоду (-).

Схема подключения светофора на Arduino
На этом вопрос со схемой можно считать решенным.
3. Программирование светофора
Прежде чем писать программу, нужно составить общий алгоритм действий, описать задачу на привычном языке. Попробуйте это сделать самостоятельно, заодно и проверьте, так ли уж точно вы знаете алгоритм работы светофора?
Алгоритм работы
Вот этот алгоритм трехсекционного светофора для водителей, принятый за стандарт в Казахстане:
Начинается все с зеленого света. Включаем его.
Спустя определенное количество времени зеленый начинает мигать. Водители и пешеходы завершают движение (или, как это часто бывает, ускоряются).
Зеленый выключается и включается желтый.
Спустя какое-то время выключается и желтый – загорается красный.
Эпоха красного цвета заканчивается не миганием, как у зеленого, а параллельным включением красного и желтого.
Спустя какое-то время красный и желтый выключаются, включается зеленый и все начинается сначала.
Если вы разобрались с алгоритмом, то написать скетч для Ардуино будет совсем не сложно. Надо лишь заменить каждое слово “включить” на digitalWrite с атрибутом HIGH, “выключить” — на digitalWrite с атрибутом LOW, а задержку сформировать с помощью delay. Вот, например, фрагмент программы, определяющий переход с красного на зеленый цвет.
// Отключаем желтый и красный
digitalWrite(11, LOW); // Красный
digitalWrite(10, LOW); // Желтый
// Включаем зеленый
digitalWrite(9, HIGH);
// Ставим задержку 3 секунды
delay(3000);
Пример скетча
Для того, чтобы не привязываться в программе к конкретным номерам пинов можно и нужно создать константы, содержащие нужный номер пина. В коде мы будем использовать эти константы, а не номера. И если нам нужно будет поменять схему подключения, то менять номера в скетче нам придется только в одном месте. Не нужно будет делать глобальную замену по документу.
Вот так бы выглядел приведенный выше пример с использованием констант:
const int LED_RED = 11; // Порт 11, красный светодиод
const int LED_YELLOW = 10; // Порт 10, желтый светодиод
const int LED_GREEN = 9; // Порт 9, зеленый светодиод
const int TIMEOUT_GREEN = 3000;
// Отключаем желтый и красный светодиоды.
digitalWrite(LED_YELLOW, LOW);
digitalWrite(LED_RED, LOW);
// Включаем зеленый светодиод на GreenTime
digitalWrite(LED_GREEN, HIGH);
delay(TIMEOUT_GREEN);
Вот так можно заставить мигать зеленый свет. Точь в точь как обычная мигалка:
// Мигаем зеленым светодиодом
// Первый раз
digitalWrite(LED_GREEN, LOW);
delay(TIMEOUT_FLASH_GREEN);
digitalWrite(LED_GREEN, HIGH);
delay(TIMEOUT_FLASH_GREEN);
// Второй раз
digitalWrite(LED_GREEN, LOW);
delay(TIMEOUT_FLASH_GREEN);
digitalWrite(LED_GREEN, HIGH);
delay(TIMEOUT_FLASH_GREEN);
// Третий раз
digitalWrite(LED_GREEN, LOW);
delay(TIMEOUT_FLASH_GREEN)
digitalWrite(LED_GREEN, HIGH);
delay(TIMEOUT_FLASH_GREEN);
Второй и более правильный вариант мигания – использовать цикл FOR.
for (int i = 0; i < 3; i++) {
digitalWrite(LED_GREEN, LOW);
delay(TIMEOUT_FLASH_GREEN);
digitalWrite(LED_GREEN, HIGH);
delay(TIMEOUT_FLASH_GREEN);
}
Вот, в принципе, и все особенности. Давайте теперь соберем код вместе и напишем итоговую программу:
const int LED_RED = 11; // Порт 11, красный светодиод
const int LED_YELLOW = 10; // Порт 10, желтый светодиод
const int LED_GREEN = 9; // Порт 9, зеленый светодиод
const int TIMEOUT_RED = 3000; // Время горения красного светодиода
const int TIMEOUT_YEL = 1690; // Время горения желтого светодиода
const int TIMEOUT_GREEN = 2000; // Время горения зеленого светодиода
const int TIMEOUT_FLASH_GREEN = 500; // Время мигания зеленого светодиода
void setup()
{
// Все порты светодиодов будут у нас установлены в режим "внешняя нагрузка", OUTPUT
pinMode(LED_RED, OUTPUT);
pinMode(LED_YELLOW, OUTPUT);
pinMode(LED_GREEN, OUTPUT);
// Устанавливаем начальное значение светодиодов
digitalWrite(LED_RED, LOW);
digitalWrite(LED_YELLOW, LOW);
digitalWrite(LED_GREEN, LOW);
}
void loop()
{
// Включаем зеленый цвет светофора
digitalWrite(LED_GREEN, HIGH); // Включаем светодиод
delay(TIMEOUT_GREEN); // Ждем
// Мигаем зеленым светодиодом 3 раза
for (int i = 0; i < 3; i++){
digitalWrite(LED_GREEN, LOW);
delay(TIMEOUT_FLASH_GREEN);
digitalWrite(LED_GREEN, HIGH);
delay(TIMEOUT_FLASH_GREEN);
}
// Теперь отключаем зеленый и включаем желтый светодиод
digitalWrite(LED_GREEN, LOW);
digitalWrite(LED_YELLOW, HIGH);
delay(TIMEOUT_YEL);
// Отключаем желтый светодиод.
digitalWrite(LED_YELLOW, LOW);
// Теперь включаем красный цвет
digitalWrite(LED_RED, HIGH);
delay(TIMEOUT_RED);
// Включаем желтый светодиод,не выключая красный
digitalWrite(LED_YELLOW, HIGH);
delay(TIMEOUT_YEL);
// Отключаем желтый и красный светодиоды.
digitalWrite(LED_YELLOW, LOW);
digitalWrite(LED_RED, LOW);
}
4. Заключение
В этой статье мы узнали, как собрать вместе на одной макетной плате три светодиода и подключить их к arduino uno или nano. Разобрались с алгоритмом работы настоящего светофора и смогли написать свой скетч на языке C++. Мы еще раз убедились, что писать программы со светодиодами – это просто, нужно понять лишь несколько базовых принципов. Будем надеяться, что статья оказалась вам полезной и вы продолжите знакомство с платформой Arduino.