Динамические поворотники (бегущие поворотники) своими руками

21 октября 2021

Заметил что тема про динамические поворотники, довольно популярная в интернете. Вот и я решил приобщится к ней и внести свой вклад. Выбор пал на контроллер arduino Digispark так как он не дорого стоит, имеет маленькие габариты, минимум обвязки и не прихотлив. К тому же у меня уже есть опыт работы с Digispark ATtiny85

В качестве светодиодной ленты для тестов я использовал светодиодное кольцо на 24 пикселя, на нем установлены такие же как и на ленте светодиоды ws2812b.

Схема бегущих, динамических поворотников

Я думаю что рано или поздно, все производители автомобилей перейдут на светодиодную индикацию. Так как она имеет много преимуществ
1 – Почти не греется
2 – Мало потребляет энергии
3 – Имеет меньшие габариты
4 – Не требует специфической оптики
5 – Можно использовать один светосигнальный элемент для всех световых сигналов

Скетч для Arduino Digispark
В директивах #define можно менять настройки таймингов, если не нравятся предустановленные настройки.

#include <adafruit_neopixel.h>

/*
#define pause_dark 17 // задержка между пикселями при затухании
#define pause_light 17 // задержка между пикселями при загорании
#define delay_dark 200 // задержка затухания всей ленты
#define delay_light 200 // задержка свечения всей ленты

#define pause_dark 0 // задержка между пикселями при затухании
#define pause_light 20 // задержка между пикселями при загорании
#define delay_dark 250 // задержка затухания всей ленты
#define delay_light 100 // задержка свечения всей ленты
*/

#define pause_dark 10 // задержка между пикселями при затухании
#define pause_light 20 // задержка между пикселями при загорании
#define delay_dark 300 // задержка затухания всей ленты
#define delay_light 50 // задержка свечения всей ленты

#define num_pixel 24 // число пикселей в ленте
#define led_pin 4   // пин к которому подключена светодиодная лента
#define brightness 255 //яркость ленты
Adafruit_NeoPixel pixelink = Adafruit_NeoPixel(num_pixel, led_pin, NEO_GRB + NEO_KHZ800);

void setup()
{
  pinMode(0, INPUT_PULLUP); //Пин для подключения кнопки
  pinMode(1, INPUT_PULLUP); //Пин для подключения кнопки  
  pinMode(2, INPUT_PULLUP); //Пин для подключения кнопки

  pixelink.begin();
  pixelink.setBrightness(brightness); 
  pixelink.show(); 
}

void loop()
{
 if(digitalRead(0) == LOW) turn_light();
 if(digitalRead(1) == LOW) stop_light(); 
 if(digitalRead(2) == LOW) police_light();
 if(analogRead(3) < 30 ) parking_light();

 //test_port(analogRead(3));
}

//================================================
void turn_light()
{  
   fill_strip(255,92,0,pause_light);
        delay(delay_light); 
   fill_strip(0,0,0,pause_dark);
        delay(delay_dark);
}

//================================================
void stop_light()
{  
   set_strip(255,0,0);
     fill_strip(92,0,0,60);    
        fill_strip(255,0,0,20);
          
   if(digitalRead(1) == HIGH)
    { 
      fill_strip(0,0,0,10);
    }
}

//================================================
void police_light()
{  
  for (int j = 0; j < 4; j++)
  {
    set_strip(255,0,0);
    delay(50); 
    
   set_strip(0,0,0);
     delay(50);
  }

delay(200);
  for (int j = 0; j < 4; j++)
  {
    set_strip(0,0,255);
    delay(50); 
    
    set_strip(0,0,0);
    delay(50);
  }
delay(200);
}

//================================================
void parking_light()
{  
   fill_strip(255,255,255,30);
     while(analogRead(3) < 30){}
   fill_strip(0,0,0,30);
}

//================================================
void fill_strip(uint8_t red, uint8_t green, uint8_t blue, uint8_t pix_pause)
{  
   for (uint8_t i = 0; i < num_pixel; i++)
   {
      pixelink.setPixelColor(i, red, green, blue);
      pixelink.show();
      delay(pix_pause);
   }   
}     

//================================================
void set_strip(uint8_t red, uint8_t green,uint8_t blue)
{  
   for (uint8_t i = 0; i < num_pixel; i++)
   {
     pixelink.setPixelColor(i, red, green, blue);
   }   
   pixelink.show();
}  
/* реверс  
   for (int i = num_pixel-1; i > -1 ; i--)
    {
      pixelink.setPixelColor(i, 0, 0, 0);
      pixelink.show();
      delay(5);
    }
*/
//================================================
void test_port(int analog)
{  

 if(analog < 10) analog=1; else analog=analog/10;
   for (int i = 0; i < analog; i++)
   {
      pixelink.setPixelColor(i, 64, 64, 64);
    }
      pixelink.show();
      delay(100);
      set_strip(0,0,0);
}</adafruit_neopixel.h>