Динамические поворотники (бегущие поворотники) своими руками
Заметил что тема про динамические поворотники, довольно популярная в интернете. Вот и я решил приобщится к ней и внести свой вклад. Выбор пал на контроллер 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>
0 комментариев