Каталог
Светофор на Arduino

Светофор на Arduino

Давайте и мы создадим свой почти настоящий светофор.

 

Вам понадобится:

  • Плата 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.

Комментарии
Отзывов еще никто не оставлял
Предзаказ
Предзаказ успешно отправлен!
Имя *
Телефон *
Добавить в корзину
Название товара
100 тг
1 шт.
Перейти в корзину
Обратный звонок
Запрос успешно отправлен!
Имя *
Телефон *
Заказ в один клик
С помощью уведомлений о заказе можно не только получать актуальную информацию по заказу, но и иметь быстрый канал связи с магазином