Привет, друзья, и с Новым годом! Праздничные дни — отличное время для экспериментов. Чтобы скоротать время, я решил попробовать создать бегущий поворотник на макетной плате с использованием SMD-светодиодов и платы Arduino Leonardo. Давно хотел реализовать проект на Arduino, и этот показался идеальным: минимум компонентов, максимум возможностей для экспериментов.
Что понадобилось для проекта
Для сборки бегущего поворотника я использовал:
- 6 светодиодов SMD на 3 вольта.
- 6 резисторов на 150 Ом.
- 3 кнопки.
- Плату Arduino Leonardo.
Принцип работы
Идея проста:
- Четыре светодиода имитируют дневные ходовые огни (ДХО).
- Два светодиода выполняют роль тормозов.
- Правая и левая кнопки включают соответствующие поворотники.
- Центральная кнопка активирует тормоза.
Сборка
Собрать всё это на макетной плате оказалось проще, чем я думал. Я подключил светодиоды через резисторы, добавил кнопки и соединил всё с платой Arduino.
Настройка и программирование
Код оказался более сложной частью работы. Сначала у меня возникли проблемы:
1. После срабатывания поворотников ДХО не включались обратно:
- // Пины светодиодов
- const int white1 = 2;
- const int white2 = 3;
- const int yellow1 = 4;
- const int yellow2 = 5;
- const int red1 = 6;
- const int red2 = 7;
- // Пины кнопок
- const int leftButton = 8;
- const int rightButton = 9;
- const int centerButton = 10;
- // Задержка для бегущих огней
- const int delayTime = 200;
- void setup() {
- // Настраиваем пины светодиодов как выходы
- pinMode(white1, OUTPUT);
- pinMode(white2, OUTPUT);
- pinMode(yellow1, OUTPUT);
- pinMode(yellow2, OUTPUT);
- pinMode(red1, OUTPUT);
- pinMode(red2, OUTPUT);
- // Настраиваем пины кнопок как входы с подтягивающими резисторами
- pinMode(leftButton, INPUT_PULLUP);
- pinMode(rightButton, INPUT_PULLUP);
- pinMode(centerButton, INPUT_PULLUP);
- // Включаем белые светодиоды при старте
- digitalWrite(white1, HIGH);
- digitalWrite(white2, HIGH);
- }
- void loop() {
- // Считываем состояния кнопок
- bool leftState = !digitalRead(leftButton);
- bool rightState = !digitalRead(rightButton);
- bool centerState = !digitalRead(centerButton);
- if (centerState) {
- blinkRedFast();
- } else if (leftState) {
- runningLightLeft();
- } else if (rightState) {
- runningLightRight();
- }
- }
- // Бегущая дорожка влево
- void runningLightLeft() {
- int sequence[] = {yellow1, white1, white2, yellow2};
- for (int i = 0; i < 4; i++) {
- digitalWrite(sequence[i], HIGH);
- delay(delayTime);
- digitalWrite(sequence[i], LOW);
- }
- }
- // Бегущая дорожка вправо
- void runningLightRight() {
- int sequence[] = {yellow2, white2, white1, yellow1};
- for (int i = 0; i < 4; i++) {
- digitalWrite(sequence[i], HIGH);
- delay(delayTime);
- digitalWrite(sequence[i], LOW);
- }
- }
- // Быстрое мигание красных светодиодов
- void blinkRedFast() {
- for (int i = 0; i < 10; i++) {
- digitalWrite(red1, HIGH);
- digitalWrite(red2, HIGH);
- delay(100);
- digitalWrite(red1, LOW);
- digitalWrite(red2, LOW);
- delay(100);
- }
- }
2. С этим кодом режим ДХО стал автоматически включаться после завершения работы в режиме поворотника, мне не нравится что последний светодиод не тухнет:
- // Пины светодиодов
- const int white1 = 2;
- const int white2 = 3;
- const int yellow1 = 4;
- const int yellow2 = 5;
- const int red1 = 6;
- const int red2 = 7;
- // Пины кнопок
- const int leftButton = 8;
- const int rightButton = 9;
- const int centerButton = 10;
- // Задержка для бегущих огней
- const int delayTime = 200;
- void setup() {
- // Настраиваем пины светодиодов как выходы
- pinMode(white1, OUTPUT);
- pinMode(white2, OUTPUT);
- pinMode(yellow1, OUTPUT);
- pinMode(yellow2, OUTPUT);
- pinMode(red1, OUTPUT);
- pinMode(red2, OUTPUT);
- // Настраиваем пины кнопок как входы с подтягивающими резисторами
- pinMode(leftButton, INPUT_PULLUP);
- pinMode(rightButton, INPUT_PULLUP);
- pinMode(centerButton, INPUT_PULLUP);
- // Включаем все белые и желтые светодиоды при старте
- resetLights();
- }
- void loop() {
- // Считываем состояния кнопок
- bool leftState = !digitalRead(leftButton);
- bool rightState = !digitalRead(rightButton);
- bool centerState = !digitalRead(centerButton);
- if (centerState) {
- blinkRedFast();
- resetLights();
- } else if (leftState) {
- runningLightLeft();
- resetLights();
- } else if (rightState) {
- runningLightRight();
- resetLights();
- }
- }
- // Бегущая дорожка влево
- void runningLightLeft() {
- int sequence[] = {yellow1, white1, white2, yellow2};
- for (int i = 0; i < 4; i++) {
- digitalWrite(sequence[i], HIGH);
- delay(delayTime);
- digitalWrite(sequence[i], LOW);
- }
- }
- // Бегущая дорожка вправо
- void runningLightRight() {
- int sequence[] = {yellow2, white2, white1, yellow1};
- for (int i = 0; i < 4; i++) {
- digitalWrite(sequence[i], HIGH);
- delay(delayTime);
- digitalWrite(sequence[i], LOW);
- }
- }
- // Быстрое мигание красных светодиодов
- void blinkRedFast() {
- for (int i = 0; i < 10; i++) {
- digitalWrite(red1, HIGH);
- digitalWrite(red2, HIGH);
- delay(100);
- digitalWrite(red1, LOW);
- digitalWrite(red2, LOW);
- delay(100);
- }
- }
- // Включение всех белых и желтых светодиодов
- void resetLights() {
- digitalWrite(white1, HIGH);
- digitalWrite(white2, HIGH);
- digitalWrite(yellow1, HIGH);
- digitalWrite(yellow2, HIGH);
- }
3. С третьей попытки всё заработало, как надо:
- // Пины светодиодов
- const int white1 = 2;
- const int white2 = 3;
- const int yellow1 = 4;
- const int yellow2 = 5;
- const int red1 = 6;
- const int red2 = 7;
- // Пины кнопок
- const int leftButton = 8;
- const int rightButton = 9;
- const int centerButton = 10;
- // Задержка для бегущих огней (чем меньше, тем быстрее)
- const int delayTime = 100;
- void setup() {
- // Настраиваем пины светодиодов как выходы
- pinMode(white1, OUTPUT);
- pinMode(white2, OUTPUT);
- pinMode(yellow1, OUTPUT);
- pinMode(yellow2, OUTPUT);
- pinMode(red1, OUTPUT);
- pinMode(red2, OUTPUT);
- // Настраиваем пины кнопок как входы с подтягивающими резисторами
- pinMode(leftButton, INPUT_PULLUP);
- pinMode(rightButton, INPUT_PULLUP);
- pinMode(centerButton, INPUT_PULLUP);
- // Включаем все белые и желтые светодиоды при старте
- resetLights();
- }
- void loop() {
- // Считываем состояния кнопок
- bool leftState = !digitalRead(leftButton);
- bool rightState = !digitalRead(rightButton);
- bool centerState = !digitalRead(centerButton);
- if (centerState) {
- blinkRedFast();
- resetLights();
- } else if (leftState) {
- runningLightLeftContinuous();
- } else if (rightState) {
- runningLightRightContinuous();
- }
- }
- // Бегущая дорожка влево (непрерывная)
- void runningLightLeftContinuous() {
- int sequence[] = {yellow1, white1, white2, yellow2};
- int size = 4;
- while (!digitalRead(leftButton)) { // Выполняем, пока кнопка удерживается
- for (int i = 0; i < size; i++) {
- digitalWrite(sequence[i], HIGH);
- delay(delayTime);
- digitalWrite(sequence[i], LOW);
- }
- }
- resetLights(); // Возвращаемся к исходному состоянию
- }
- // Бегущая дорожка вправо (непрерывная)
- void runningLightRightContinuous() {
- int sequence[] = {yellow2, white2, white1, yellow1};
- int size = 4;
- while (!digitalRead(rightButton)) { // Выполняем, пока кнопка удерживается
- for (int i = 0; i < size; i++) {
- digitalWrite(sequence[i], HIGH);
- delay(delayTime);
- digitalWrite(sequence[i], LOW);
- }
- }
- resetLights(); // Возвращаемся к исходному состоянию
- }
- // Быстрое мигание красных светодиодов
- void blinkRedFast() {
- for (int i = 0; i < 10; i++) {
- digitalWrite(red1, HIGH);
- digitalWrite(red2, HIGH);
- delay(100);
- digitalWrite(red1, LOW);
- digitalWrite(red2, LOW);
- delay(100);
- }
- }
- // Включение всех белых и желтых светодиодов
- void resetLights() {
- digitalWrite(white1, HIGH);
- digitalWrite(white2, HIGH);
- digitalWrite(yellow1, HIGH);
- digitalWrite(yellow2, HIGH);
- }
Видео того как всё работает можно посмотреть здесь
Что дальше?
Теперь у меня появилась новая цель — реализовать управление поворотниками со смартфона. Это добавит больше возможностей для настройки и сделает проект ещё интереснее. Но, увы, выходные заканчиваются, и опять приходится возвращаться к работе.
Почему вам стоит попробовать?
Arduino — это отличный способ попробовать себя в программировании и создании электроники. Этот проект:
- Подходит для новичков, так как требует минимум компонентов.
- Даёт простор для экспериментов с кодом.
- Позволяет визуально наблюдать результат вашей работы.
💡 Подписывайтесь на канал и ставьте лайк, если вам понравилась идея! Пишите в комментариях, хотите ли вы увидеть, как я буду добавлять управление со смартфона. Может, у вас есть интересные идеи для Arduino-проектов? Делитесь ими — буду рад попробовать что-то новое! 😊