В этом проекте мы рассмотрим, как построить схему светофора с микроконтроллером Arduino.
Сделать светофор на Arduino для начинающих изучать микроконтроллер — это отличное занятие, которое позволит лучше разобраться в среде программирования Arduino IDE и понять принцип работы цифровых пинов общего назначения. Рассмотрим схему сборки светофора на Arduino Uno с помощью макетной платы и представим простой проект, который можно использовать на занятиях робототехники с детьми.
Схема светофора — это схема, имитирующая работу реального светофора.
Есть зеленый светодиод, который представляет собой зеленый свет. Желтый светодиод, который представляет собой желтый свет. И красный светодиод, который представляет собой красный свет.
В нашей схеме мы сделаем так, что зеленый светодиод горит 15 секунд, затем желтый светодиод включается на 2 секунды, а затем красный светодиод включается на 15 секунд. И это повторяется снова и снова.
Рассмотрим все аппаратные соединения и программное обеспечение, которое нужно для этой работы.
Что необходимо:
Микроконтроллер Arduino.
Зеленый светодиод.
Жёлтый светодиод.
Красный светодиод.
Резистор 470 Ом – 3 шт.
Схема светофора
На рисунке показано схематично, как всё подключено и работает.
Макетная схема
Подключение
Итак, чтобы эта схема работала, у нас есть 3 светодиода. Аноды, положительные клеммы светодиодов, все подключаются к цифровому выводу на Arduino через токоограничивающий резистор 470 Ом:
Зеленый светодиод подключается к цифровому выводу D12 на Arduino.
Желтый светодиод подключается к цифровому выводу D11 на Arduino.
Красный светодиод подключается к цифровому выводу D10 на Arduino.
Катоды или отрицательные клеммы светодиодов подключаются к земле.
Как работает схема, так это то, что мы можем контролировать, какой светодиод горит, потому что каждый светодиод подключен к отдельному цифровому выводу на Arduino. Если мы сделаем цифровой вывод HIGH, то этот светодиод будет гореть, а остальные будут записаны LOW и, следовательно, выключены.
Код.
const int greenLED= 12; //the code will flash the LED connected to pin 13
const int yellowLED= 11; //the yellow LED is connected to digital pin 11
const int redLED= 10; //the red LED is connected to digital pin 10
void setup() {
//makes all the LEDs outputs
pinMode (greenLED, OUTPUT);
pinMode (yellowLED, OUTPUT);
pinMode (redLED, OUTPUT);
}
void loop(){
digitalWrite (greenLED, HIGH);//включает зелёный светодиод
digitalWrite (yellowLED, LOW);//выключает жёлтый светодиод
digitalWrite (redLED, LOW);//выключает красный светодиод
delay(15000);
digitalWrite (greenLED, LOW); //выключает зелёный светодиод
digitalWrite (yellowLED, HIGH);//включает жёлтый светодиод
digitalWrite (redLED, LOW);//выключает красный светодиод
delay(2000);
digitalWrite (greenLED, LOW); //выключает зелёный светодиод
digitalWrite (yellowLED, LOW);//выключает жёлтый светодиод
digitalWrite (redLED, HIGH);//включает красный светодиод
delay(15000);
}
Рассмотрим код
Устанавливаем светодиоды по их цифровым выходам. То есть: зелёный – 12; жёлтый – 11; красный 10;
Следующий блок строк, функция setup(), объявляет все светодиоды выходами. Мы не считываем никаких значений со светодиода. Мы записываем либо ВЫСОКОЕ, либо НИЗКОЕ значение на светодиод. Следовательно, светодиоды должны быть выходами, а не входами.
Следующая функция, функция loop(), является сердцем нашего кода. Этот блок кода повторяется снова и снова, снова и снова, без конца.
Вы можете изменить время, в течение которого светодиоды горят, изменив значение в функции delay(). Поскольку параметр в функции delay() измеряется в миллисекундах, задержка (1000) равна 1 секунде. Так что, если вы хотите, чтобы светодиод горел в течение, например, 10 секунд, параметр будет 1000 * 10 = 10000.
Двойной светофор
Рассмотрим ещё один вариант светофора, но уже на перекрёстке. Всё будет работать как в жизни: у одной дороги трафик будет меньше, чем у другой.
Что нам нужно:
- Плата Arduino
- Красный светодиод – 2шт.
- Жёлтый светодиод – 2 шт.
- Зелёный светодиод – 2 шт.
- Резистор на 330 Ом – 6 шт.
Ещё на необходимы провода перемычки для соединения всех деталей.
Схема проекта
Как работает наш светофор
У нас в проекте светофора будет, как будто, две улицы. У них свой различный трафик, поэтому время работы будет разным.
Трафик одной из улиц будет активней, чем у второй. Зелёный свет для первой улицы будет составлять 12 секунд времени. На второй улице, где трафик меньше, нужно будет установить зелёный свет на более короткий промежуток времени. Возьмём за это значение 1/3 от времени первой улицы и получиться 4 секунды зелёного светофора.
Сделаем ещё небольшую паузу движения на нашем перекрёстке. То есть мы сделаем период времени, когда будет везде гореть красный свет. Всё как на реальном перекрёстке.
Код для Arduino
// Постоянные
const int TRAFFIC_LIGHT_STYLE = 1; // Используется для выбора стиля светофора
const int GREEN_LIGHT = 12; // Время зеленого света в секундах
const int AMBER_LIGHT = 3; // Время янтарного (желтого) света в секундах
const int DEAD_LIGHT = 2; // Время «перекрытия» в секундах
const int RED_AMBER_LIGHT = 1; // Красный/Янтарный свет в секундах
// Выходы:
int greenBusyBunnyLane = 30;
int amberBusyBunnyLane = 32;
int redBusyBunnyLane = 34;
int greenBusyBunnyLaneGnd = 31;
int amberBusyBunnyLaneGnd = 33;
int redBusyBunnyLaneGnd = 35;
int greenLazyTortoiseAve = 48;
int amberLazyTortoiseAve = 50;
int redLazyTortoiseAve = 52;
int greenLazyTortoiseAveGnd = 49;
int amberLazyTortoiseAveGnd = 51;
int redLazyTortoiseAveGnd = 53;
// Инициализация
void setup()
{
// Установка соответствующих выходов светодиодов для первой улицы
pinMode(greenBusyBunnyLane, OUTPUT);
pinMode(amberBusyBunnyLane, OUTPUT);
pinMode(redBusyBunnyLane, OUTPUT);
pinMode(greenBusyBunnyLaneGnd, OUTPUT);
pinMode(amberBusyBunnyLaneGnd, OUTPUT);
pinMode(redBusyBunnyLaneGnd, OUTPUT);
// Установка соответствующих выходов светодиодов для второй улицы
pinMode(greenLazyTortoiseAve, OUTPUT);
pinMode(amberLazyTortoiseAve, OUTPUT);
pinMode(redLazyTortoiseAve, OUTPUT);
pinMode(greenLazyTortoiseAveGnd, OUTPUT);
pinMode(amberLazyTortoiseAveGnd, OUTPUT);
pinMode(redLazyTortoiseAveGnd, OUTPUT);
digitalWrite(greenBusyBunnyLane,LOW);
digitalWrite(amberBusyBunnyLane,LOW);
digitalWrite(redBusyBunnyLane,LOW);
digitalWrite(greenBusyBunnyLaneGnd,LOW);
digitalWrite(amberBusyBunnyLaneGnd,LOW);
digitalWrite(redBusyBunnyLaneGnd,LOW);
digitalWrite(greenLazyTortoiseAve,LOW);
digitalWrite(amberLazyTortoiseAve,LOW);
digitalWrite(redLazyTortoiseAve,LOW);
digitalWrite(greenLazyTortoiseAveGnd,LOW);
digitalWrite(amberLazyTortoiseAveGnd,LOW);
digitalWrite(redLazyTortoiseAveGnd,LOW);
}
// Главный блок
void loop()
{
switch (TRAFFIC_LIGHT_STYLE)
{
case 0:
usaTrafficLight();
break;
case 1:
ukTrafficLight();
break;
default:
break;
}
}
void usaTrafficLight()
{
for (int seconds = 0; seconds < GREEN_LIGHT; seconds++)
{
digitalWrite(greenBusyBunnyLane,HIGH);
digitalWrite(redLazyTortoiseAve,HIGH);
delay(1000);
}
digitalWrite(greenBusyBunnyLane,LOW);
digitalWrite(redLazyTortoiseAve,LOW);
for (int seconds = 0; seconds < AMBER_LIGHT; seconds++)
{
digitalWrite(amberBusyBunnyLane,HIGH);
digitalWrite(redLazyTortoiseAve,HIGH);
delay(1000);
}
digitalWrite(amberBusyBunnyLane,LOW);
digitalWrite(redLazyTortoiseAve,LOW);
for (int seconds = 0; seconds < DEAD_LIGHT; seconds++)
{
digitalWrite(redBusyBunnyLane,HIGH);
digitalWrite(redLazyTortoiseAve,HIGH);
delay(1000);
}
digitalWrite(redBusyBunnyLane,LOW);
digitalWrite(redLazyTortoiseAve,LOW);
for (int seconds = 0; seconds < (GREEN_LIGHT / 3); seconds++)
{
digitalWrite(redBusyBunnyLane,HIGH);
digitalWrite(greenLazyTortoiseAve,HIGH);
delay(1000);
}
digitalWrite(redBusyBunnyLane,LOW);
digitalWrite(greenLazyTortoiseAve,LOW);
// Lazy Tortoise Ave now goes into amber light.
for (int seconds = 0; seconds < AMBER_LIGHT; seconds++)
{
digitalWrite(redBusyBunnyLane,HIGH);
digitalWrite(amberLazyTortoiseAve,HIGH);
delay(1000);
}
digitalWrite(redBusyBunnyLane,LOW);
digitalWrite(amberLazyTortoiseAve,LOW);
// Once again, a dead zone
for (int seconds = 0; seconds < DEAD_LIGHT; seconds++)
{
digitalWrite(redBusyBunnyLane,HIGH);
digitalWrite(redLazyTortoiseAve,HIGH);
delay(1000);
}
digitalWrite(redBusyBunnyLane,LOW);
digitalWrite(redLazyTortoiseAve,LOW);
}
void ukTrafficLight()
{
for (int seconds = 0; seconds < GREEN_LIGHT; seconds++)
{
digitalWrite(greenBusyBunnyLane,HIGH);
digitalWrite(redLazyTortoiseAve,HIGH);
delay(1000);
}
digitalWrite(greenBusyBunnyLane,LOW);
digitalWrite(redLazyTortoiseAve,LOW);
for (int seconds = 0; seconds < AMBER_LIGHT; seconds++)
{
digitalWrite(amberBusyBunnyLane,HIGH);
digitalWrite(redLazyTortoiseAve,HIGH);
delay(1000);
}
digitalWrite(amberBusyBunnyLane,LOW);
digitalWrite(redLazyTortoiseAve,LOW);
for (int seconds = 0; seconds < DEAD_LIGHT; seconds++)
{
digitalWrite(redBusyBunnyLane,HIGH);
digitalWrite(redLazyTortoiseAve,HIGH);
delay(1000);
}
digitalWrite(redBusyBunnyLane,LOW);
digitalWrite(redLazyTortoiseAve,LOW);
for (int seconds = 0; seconds < RED_AMBER_LIGHT; seconds++)
{
digitalWrite(redBusyBunnyLane,HIGH);
digitalWrite(redLazyTortoiseAve,HIGH);
digitalWrite(amberLazyTortoiseAve,HIGH);
delay(1000);
}
digitalWrite(redBusyBunnyLane,LOW);
digitalWrite(redLazyTortoiseAve,LOW);
digitalWrite(amberLazyTortoiseAve,LOW);
for (int seconds = 0; seconds < (GREEN_LIGHT / 3); seconds++)
{
digitalWrite(redBusyBunnyLane,HIGH);
digitalWrite(greenLazyTortoiseAve,HIGH);
delay(1000);
}
digitalWrite(redBusyBunnyLane,LOW);
digitalWrite(greenLazyTortoiseAve,LOW);
for (int seconds = 0; seconds < AMBER_LIGHT; seconds++)
{
digitalWrite(redBusyBunnyLane,HIGH);
digitalWrite(amberLazyTortoiseAve,HIGH);
delay(1000);
}
digitalWrite(redBusyBunnyLane,LOW);
digitalWrite(amberLazyTortoiseAve,LOW);
for (int seconds = 0; seconds < DEAD_LIGHT; seconds++)
{
digitalWrite(redBusyBunnyLane,HIGH);
digitalWrite(redLazyTortoiseAve,HIGH);
delay(1000);
}
digitalWrite(redBusyBunnyLane,LOW);
digitalWrite(redLazyTortoiseAve,LOW);
for (int seconds = 0; seconds < RED_AMBER_LIGHT; seconds++)
{
digitalWrite(redBusyBunnyLane,HIGH);
digitalWrite(amberBusyBunnyLane,HIGH);
digitalWrite(redLazyTortoiseAve,HIGH);
delay(1000);
}
digitalWrite(redBusyBunnyLane,LOW);
digitalWrite(amberBusyBunnyLane,LOW);
digitalWrite(redLazyTortoiseAve,LOW);
}
Итог
Теперь вы научились создавать светофор на Ардуино. Это прекрасный проект для начинающих программистов на платах Arduino. Ещё этот проект можно использовать, чтобы научить детей переходить дорогу и пользоваться светофором правильно.