Давайте и мы создадим свой почти настоящий светофор.
Вам понадобится:
-
Плата Arduino Uno или Nano.
-
Три светодиода. Естественно, что лучше всего красного, желтого и зеленого цветов.
-
Три резистора номиналом 220 Ом.
-
Соединительные провода.
Схема подключения
Давайте начнем проект со сборки электрической цепи. Схема достаточно проста – соединяем три светодиода. Плюс к цифровому пину, минус – к земле. Обратите внимание, что мы объединили три контакта в один с помощью общей шины макетной платы. Красный свет светофора мы соединим с пином 11, желтый – с 10, зеленый – с 9. Не забывайте про полярность.
Узнать полярность светодиода можно по нескольким признакам:
-
Если присмотреться то внутри пластика можно увидеть 2 части светодиода. Анод (+) обычно меньше
-
Можно использовать мультиметр в режиме прозвонки. Светодиод пропускает ток только от анода (+) к катоду (-)
На этом вопрос со схемой можно считать решенным.
Программирование светофора
Прежде чем писать программу, нужно составить общий алгоритм действий, описать задачу на привычном языке. Попробуйте это сделать самостоятельно, заодно и проверьте, так ли уж точно вы знаете алгоритм работы светофора?
Алгоритм работы
Вот этот алгоритм трехсекционного светофора для водителей, принятый за стандарт в Казахстане:
-
Начинается все с зеленого света. Включаем его.
-
Спустя определенное количество времени зеленый начинает мигать. Водители и пешеходы завершают движение (или, как это часто бывает, ускоряются).
-
Зеленый выключается и включается желтый.
-
Спустя какое-то время выключается и желтый – загорается красный.
-
Эпоха красного цвета заканчивается не миганием, как у зеленого, а параллельным включением красного и желтого.
-
Спустя какое-то время красный и желтый выключаются, включается зеленый и все начинается сначала.
Если вы разобрались с алгоритмом, то написать скетч для Ардуино будет совсем не сложно. Надо лишь заменить каждое слово “включить” на 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); } |
Загрузите скетч в контроллер и убедитесь, что все работает правильно.
Заключение
В этой статье мы узнали, как собрать вместе на одной макетной плате три светодиода и подключить их к ардуино уно или нано. Разобрались с алгоритмом работы настоящего светофора и смогли написать свой скетч на языке C++. Мы еще раз убедились, что писать программы со светодиодами – это просто, нужно понять лишь несколько базовых принципов. Будем надеяться, что статья оказалась вам полезной и вы продолжите знакомство с платформой Arduino.