Running turn signals on the WS2812 and Arduino tape. Lazy (polite) turn signal on Arduino with your own hands (video) Arduino connection diagram for a running turn signal

Consider the creation of a running turn signal like an Audi, using the example of a headlight from a Renault Clio car. Let's make turn signals and DRL in one device.

What you need for this: LED strip consisting of ws2812b LEDs Arduino nano controller(can be used in any other form factor) Car charger for mobile phones with USB output. Since the Arduino controller needs a voltage of 5V, we will use this charger as a voltage converter from 12V to 5V. Voltage stabilizer for 5V KR142EN5V (KREN5V) or any other imported analogue. 3 resistors 10 kOhm, as pull-up resistance.

Connection diagram

The arduino controller must be connected to the car network through a 12V -> 5V converter so that the voltage is supplied to the circuit from turning on the "ignition". The positive wire from the current turn signal must be connected to the voltage regulator KREN5V. This article discusses the connection and firmware of only one turn signal, in order to make a second turn signal, you need to similarly connect the second LED strip to any free digital output of the Arduino (for example 7), as well as add the code for it in the firmware according to our example.

Controller firmware

To work with pixel LEDs, you will need a library ... You can install it as follows: Sketch -> Connect library -> Manage libraries. Next, in the search menu, enter the name of the Adafruit_NeoPixel.h library and click the install button. After that, insert the sketch into the program and replace the number of LEDs in the code (we use 22 diodes):

#include // connect the library
Adafruit_NeoPixel strip = Adafruit_NeoPixel (22, 8, NEO_GRB + NEO_KHZ800);
int t, t1, t2, t3, t4, p2, p1 = 0; // time variable
void setup () (
pinMode (2, INPUT);
pinMode (3, INPUT);
pinMode (4, INPUT);
digitalWrite (2, LOW);
digitalWrite (3, LOW);
digitalWrite (4, LOW);

strip.begin ();
strip.show ();

}
void loop () (
if (digitalRead (2) == LOW) (// If the turn signal is off
for (int i = 0; i< 23; i++) {
strip.setPixelColor (i, strip.Color (255,255,255)); // R = 255, G = 255, B = 255 - white color of the LED, when turned on, we light the running lights
}
strip.show ();
}

if ((digitalRead (2) == HIGH) & (t == 1)) (// check if the turn signal is on
for (int i = 0; i< 23; i++) {
strip.setPixelColor (i, strip.Color (0, 0, 0)); // extinguish all diodes
}
strip.show ();
for (int k = 0; k< 3; k++){ // цикл до трех - сигнал «перестроения» , при кратковременном включении мигает 3 раза,

for (int i = 0; i< 23; i++){

if (digitalRead (2) == HIGH) (k = 0;) // if during the blinking of the turn signal we get another key signal, then reset the counter so that the turn signal blinks at least 3 more times
strip.setPixelColor (i, strip.Color (255, 69, 0)); // R = 255, G = 69, B = 0 - LED color

delay ((t4) / 22);
strip.show ();

}
if (digitalRead (2) == HIGH) (t4 = t4 + 20;) // if all diodes are lit yellow, but the signal from the relay is still on, then we increase the burning time
if (digitalRead (2) == LOW) (t4 = t4-20;) // if all diodes are lit yellow, but the signal from the relay is still on, then we increase the burning time

for (int i = 0; i< 23; i++){

strip.setPixelColor (i, strip.Color (0, 0, 0)); // R = 0, G = 0, B = 0 - LED color

delay ((t3) / 22);
strip.show ();

}
if ((digitalRead (2) == LOW)) (t3 = t3 + 20;)
if ((digitalRead (2) == HIGH)) (t3 = t3-20;)
}

if ((digitalRead (2) == HIGH) & (t == 0)) (// check if the turn signal is on

t1 = millis (); // remember what time you turned on
for (int i = 0; i< 22; i++) {
strip.setPixelColor (i, strip.Color (255, 69, 0)); // when you turn on the turn signal for the first time, light all the diodes yellow
}
strip.show ();
while (digitalRead (2) == HIGH) ()
t2 = millis (); // remember what time the turn signal turned off
t4 = t2-t1;

for (int i = 0; i< 22; i++) {
strip.setPixelColor (i, strip.Color (0, 0, 0)); // extinguish the diodes when the signal from the turn relay disappears
}
strip.show ();
while (digitalRead (2) == LOW) (
if ((millis () - t2)> 2000) (break;)
}
if ((millis () - t2)<2000) {
t3 = millis () - t2; // time for which turn signals go out
t = 1; // flag, we know that the time value has been saved.
}
}

if (digitalRead (4) == HIGH) (// special signals
for (int j = 0; j< 16; j++) {
for (int i = 0; i< 22; i++) {
strip.setPixelColor (i, strip.Color (255, 0, 0)); // R = 255, G = 0, B = 0 - LED color
}
strip.show ();
delay (20);
for (int i = 0; i< 22; i++){

}
strip.show ();
delay (20);
}

for (int j = 0; j< 16; j++) {
for (int i = 0; i< 22; i++) {
strip.setPixelColor (i, strip.Color (0, 0, 255)); // R = 0, G = 0, B = 255 - LED color
}
strip.show ();
delay (20);
for (int i = 0; i< 22; i++){
strip.setPixelColor (i, strip.Color (0, 0, 0)); // R = 0, G = 0, B = 0 - LED color
}
strip.show ();
delay (20);
}
}

if (digitalRead (3) == HIGH) (// strobe
for (int j = 0; j< 24; j++) {
for (int i = 0; i< 22; i++) {
strip.setPixelColor (i, strip.Color (255, 255, 255)); // R = 255, G = 255, B = 255 - LED color
}
strip.show ();

delay (15);
for (int i = 0; i< 22; i++){
strip.setPixelColor (i, strip.Color (0, 0, 0)); // R = 0, G = 0, B = 0 - LED color
}
strip.show ();
delay (15);
}
delay (500);

Do the same for the second turn signal using the code.

Video how our headlight works


Hello to all DIYers! Today we will consider one of the many applications for the WS2812B LED strip on addressable RGB LEDs. Such strips (as well as separately mounted WS2812B LEDs) can be used to illuminate the Ambilight background of computer monitors and televisions, dynamic LED lighting in a car, paintings, photo frames, an aquarium, and so on. They are widely used in the development of the design of any premises, in the form of New Year's illuminations or light shows. The use of LED strip type WS2812B makes it possible to obtain a large number of interesting projects.

The WS2812B LED is an RGB LED housed in one package with the WS2801 chip.


The WS2812B LED itself is an SMD element designed for surface mounting. Internally, the LED is made up of red, green, and blue crystals in a single package. With this LED, a wide variety of light colors can be obtained.

The RGB LED is controlled through the Arduino microcontroller board.
I received a WS2812B LED strip from the Chinese. It is a piece of 1 meter long with the number of LEDs -144 pieces. I have long wanted to try for different experiments. With the help of libraries for Arduino - Adafruit Neopixel and Fast led, you can get a lot of very unusual lighting effects. But then I decided to try to make dynamic turn signals for a car in the so-called "Audi style."

The Arduino Uno board serves as a controller for controlling the LED strip, you can also use other boards - Arduino Nano, Arduino Pro mini).
Watch the whole process in the video:


List of tools and materials.
- Arduino Uno board;
- step-down board 12V \ 5V at 3A;
- resistors 100KΩ-4pcs;
- resistors 47Kom-4pcs;
- resistors 500 Ohm-1 piece;
-buttons (to simulate turning on signals) -4 pcs;
-bread board
-screwdriver;
laboratory power supply
-soldering iron;
-cambric;
-tester.
-connecting wires.

Step one. Assembling the circuit.


I assembled the circuit using a breadboard (bradboard). The resistors connected to the digital inputs of the Arduino are needed to convert the vehicle's input signals from 12 to 5 volts. 500 ohm resistor to protect the WS2812B LED strip control line.
Photo of the board


As a converter from 12V to 5V, I used a ready-made board from Aliexpress. Any transducer with suitable parameters can be used. The converter is needed for a stable power supply of the Arduino and the WS2812B LED strip.


Step two. Arduino programming.

The digital inputs of the Arduino board No. 3,4 are used to turn on the left and right turn. Pin number 5 - enable the stop signal, pin number 6 - enable reverse gear. Pin number 8 - the control signal of the WS2812B tape.

In the Arduino IDE, upload the sketch (link above). Two options for the sketch - one for the front of the car, the other for the back. Use whichever you need. At the beginning of the sketch, you can set the number of LEDs you need. You can also adjust the speed of the turn signals according to your car. You can also change the brightness of the LEDs with the strip.Color parameter (103,31,0) - change the first two digits from 0 to 255. That is, you can experiment a little.

When you press the desired button, we give a signal to turn on the desired parameter. With the correct assembly of the circuit, it usually starts working immediately.

Photo in work.






Nice experiment turned out with this weekend construction. It was interesting

I said last year "Gop" - it's time to jump :)
Rather, make the promised review of the running turn signals.
I ordered 1 meter of black tape WS2812B (144 LEDs) in a silicone tube, when ordering I chose "Black 1m 144led IP67" (perhaps someone will like the white color of the substrate, there is such a choice).

A little caveat

I received a tape welded from two half-meter pieces. The disadvantage of this is the vulnerable spot of the solder (contacts may be broken over time) and the increased gap between the LEDs.
Before buying, check with the seller for this moment

Contact wires were soldered to the tape on both sides for serial connection of several pieces, since I did not need this, then I sealed off the wires on one side, sealed everything with a neutral sealant and wound a little more black electrical tape.



Attached to glass with double-sided transparent adhesive tape, for example.

Installation details

He degreased the surfaces, first glued adhesive tape to the tube (I will call it that, even though the cross-section is rectangular), cut off the protruding excess of a wider tape, pushed the edges of the tube into the slots between the ceiling and the upper parts of the decorative panels of the rear pillars (I hid the contact wires with a connector behind one panel ), centered it and began to press it against the glass, slowly pulling out the protective layer of the tape.
Unfortunately, there is no video - there were no free hands for shooting, and everyone's cars are different.
If something is not clear - ask in the comments.
The summer heat test was successful - nothing came off or floated.
The only negative is that the angle of inclination of the glass is shallow, the LEDs shine more upward. On a sunny day it is difficult to see, but since these are duplicate signals, then

Now let's move on to the electronic stuffing.
I have used, but not so long ago discovered

For about the same cost, we get more buns

The sketch will work on Wemos without any special alterations when programming in the Arduino IDE, and if you implement a small web server, then when connected to it via Wi-Fi, you can change the values ​​of variables such as the delay time between flashes, the amount of deceleration during emergency braking etc.
Here in the future, if someone is interested in implementing a project on the ESP8266, I can post an example for changing the settings via the web interface, saving them to EEPROM, and then reading them.
The web server can be launched, for example, through a turned on turn signal and pressing the brake pedal when the ignition is turned on (in the setup procedure, interrogate the state of the corresponding inputs).

To implement the flashing mode with sharp braking, a
The sketch tracks the level of deceleration when the brake pedal is pressed, if it exceeds 0.5G (sharp deceleration, but without squealing brakes), then a flashing mode is turned on for a few seconds to attract additional attention.
Control signals to the Arduino inputs from the "plus" of stops, turn signals and reverse are fed through galvanic isolators - optocouplers with current-limiting resistors, which ultimately form a LOW level at the Arduino inputs (they are constantly pulled to positive through 10kΩ resistors).
Power supply - 5 volts via a DC-DC buck converter.
The whole thing is folded as a sandwich and packed in a suitable box, on which an arrow marked the direction of installation for the correct orientation of the gravity sensor

Scheme and photo



The rating of the pull-up (to positive) resistors is standard - 10 kOhm, the optocoupler current limiting resistors are 1 kOhm. I dropped the optocouplers from the old boards, two got PC123, two - PC817.


In the first photo you can see two additional conclusions, I made them for the turn signals. Since in my car, when the steering column lever is turned on, a short to ground occurs, I connected the wires to the lever block and the Arduino inputs. If the steering column lever commutes plus or you take the signal from the "+" bulbs of the left / right turn signals, then connect them through a galvanic isolation.



Well, now the sketch itself (Arduino IDE)

#include #include // some general comments // I turned off one edge LED at a time. they shone on the decorative panels of the racks // seen in the example of this for loop (int i = 1; i<143; i++) //если отключать не нужно, заменяем на for (int i=0; i<144; i++) //задний ход и аварийка у меня не используются, т.к. в первом случае яркость никакая, во втором надо подключать входы к лампам поворотников //поворотники и стоп-сигнал одновременно не включаются, чтобы это реализовать, нужно переписывать соответствующий код скетча (делить ленту на три секции, подбирать тайминги миганий, менять диапазон переменных циклов). //Дерзайте - все в ваших руках // Пин для подключения управляющего сигнала светодной ленты const int PinLS = 2; //Пины для подключения датчиков //если более удобно будет подключать контакты в другом порядке - просто поменяйте значения переменных const int buttonPinL = 3; const int buttonPinR = 4; const int buttonPinS = 6; const int buttonPinD = 5; //начальные статусы входов (подтянуты к плюсу) int buttonStateS = HIGH; int buttonStateD = HIGH; int buttonStateL = HIGH; int buttonStateR = HIGH; // пауза pause_pov1 (в миллисекундах) нужна, чтобы синхронизировать циклы "пробегания" полоски и включения лампочки поворотника // такое может быть, если используется меньше половины светодиодов // в моем случае паузы нет (pause_pov1 = 0) int pause_pov1 = 1; // этой паузой регулируем длительность состояния, когда все светодиоды выключены //я определял опытным путем - включал поворотник, засекал по отдельности время ста мыргов лампочкой и ста беганий полоски, разницу делил на 100, на полученное время увеличивал или уменьшал значение переменной (в зависимости от того, отставали или убегали вперед лампочки) int pause_pov2 = 62; // переменная для получения значения ускорения int ix; Adafruit_NeoPixel strip = Adafruit_NeoPixel(144, PinLS, NEO_GRB + NEO_KHZ800); Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(12345); void setup() { pinMode(buttonPinS, INPUT); pinMode(buttonPinD, INPUT); pinMode(buttonPinL, INPUT); pinMode(buttonPinR, INPUT); strip.begin(); // гасим ленту for (int i=0; i<144; i++) strip.setPixelColor(i, strip.Color(0,0,0)); strip.show(); accel.begin(); // ограничиваем измеряемый диапазон четырьмя G (этого хватит с большим запасом) accel.setRange(ADXL345_RANGE_4_G); accel.setDataRate(ADXL345_DATARATE_100_HZ); } void loop() { // СТОПЫ: если включены - высший приоритет //Чтобы сделать меняющуюся по ширине полоску в зависимости от интенсивности торможения //(уточнение - никакой светомузыки, ширина полосы после нажатия на тормоз не меняется!) //от плавного торможения до тапки в пол. //Добавляем еще одну переменную, например, ix2, //присваиваем ей значение ix с коэффициентом умножения, //заодно инвертируем и округляем до целого //ix = event.acceleration.x; //ix2 = -round(ix*10); //ограничиваем для плавного торможения в пробках //(чтобы не менялась при каждом продвижении на 5 метров) //if (ix2<10) ix2 = 0; //и для резкого торможения. //Реальный диапазон изменения переменной ix - от 0 до -5 //для максимальной ширины полосы при G равном или большем 0.5 //if (ix2 >50) ix2 = 50; // then change the loops in the STOP block for (int i = 1; i<143; i++) на for (int i=51-ix2; i<93+ix2; i++) //Получаем минимальную ширину полоски ~30 см (для стояния в пробке) и максимальную для резкого торможения //конец комментария buttonStateS = digitalRead(buttonPinS); if (buttonStateS == LOW) { sensors_event_t event; accel.getEvent(&event); ix = event.acceleration.x; // проверка резкого торможения - мигающий режим // значение 5 - это 0,5G, минус - торможение if (ix < -5) { for (int is=0; is<15; is++) { for (int i=1; i<143; i++) strip.setPixelColor(i, strip.Color(240,0,0)); strip.show(); delay(10 + is*10); for (int i=1; i<143; i++) strip.setPixelColor(i, strip.Color(0,0,0)); strip.show(); delay(10 + is*3); buttonStateS = digitalRead(buttonPinS); if (buttonStateS == HIGH) return; } } // помигали - и хватит, включаем постоянный режим, если педаль тормоза еще нажата // или если не было резкого торможения и предыдущее условие не сработало if (buttonStateS == LOW) { for (int i=1; i<143; i++) strip.setPixelColor(i, strip.Color(200,0,0)); strip.show(); while(buttonStateS == LOW){ buttonStateS = digitalRead(buttonPinS); delay(50); } // плавно гасим for (int is=0; is<20; is++) { for (int i=1; i<143; i++) strip.setPixelColor(i, strip.Color(190 - is*10,0,0)); strip.show(); delay(10); } // СТОПЫ конец } } else // если СТОПЫ выключены { // ЗАДНИЙ ХОД: если включен - средний приоритет buttonStateD = digitalRead(buttonPinD); if (buttonStateD == LOW) { for (int i=1; i<37; i++) strip.setPixelColor(i, strip.Color(63,63,63)); for (int i=107; i<143; i++) strip.setPixelColor(i, strip.Color(63,63,63)); strip.show(); while(buttonStateD == LOW){ buttonStateD = digitalRead(buttonPinD); delay(50); } //плавно гасим for (int is=0; is<16; is++) { for (int i=1; i<37; i++) strip.setPixelColor(i, strip.Color(60 - is*4,60 - is*4,60 - is*4)); for (int i=107; i<143; i++) strip.setPixelColor(i, strip.Color(60 - is*4,60 - is*4,60 - is*4)); strip.show(); delay(10); } } buttonStateL = digitalRead(buttonPinL); buttonStateR = digitalRead(buttonPinR); // если включена аварийка if (buttonStateL == LOW && buttonStateR == LOW) { for (int il=0; il<71; il++) { strip.setPixelColor(71-il, strip.Color(63,31,0)); strip.setPixelColor(il+72, strip.Color(63,31,0)); strip.show(); delay(pause_pov1); } for (int il=0; il<71; il++) { strip.setPixelColor(71-il, strip.Color(0,0,0)); strip.setPixelColor(il+72, strip.Color(0,0,0)); strip.show(); delay(pause_pov1); } delay(pause_pov2); } // если включен ЛЕВЫЙ ПОВОРОТНИК if (buttonStateL == LOW && buttonStateR == HIGH) { for (int il=0; il<71; il++) { strip.setPixelColor(il+72, strip.Color(220,120,0)); strip.show(); delay(pause_pov1); } for (int il=0; il<71; il++) { strip.setPixelColor(il+72, strip.Color(0,0,0)); strip.show(); delay(pause_pov1); } delay(pause_pov2); } // если включен ПРАВЫЙ ПОВОРОТНИК if (buttonStateL == HIGH && buttonStateR == LOW) { for (int il=0; il<71; il++) { strip.setPixelColor(71-il, strip.Color(220,120,0)); strip.show(); delay(pause_pov1); } for (int il=0; il<71; il++) { strip.setPixelColor(71-il, strip.Color(0,0,0)); strip.show(); delay(pause_pov1); } delay(pause_pov2); } //правый поворотник конец } //конец условия else Стоп // задержка для следующего опроса датчиков delay(10); }

I tried to comment on it as much as possible, but if you have any questions, I will try to add comments (therefore, I place it in the text of the review, and not in the attached file). By the way, this also applies to other points of the review - I will also supplement it if there are significant questions in the comments.

And finally, a demonstration of work (for the video I used a sketch with a demo mode).

Upd. The sketch with the demo mode was made specially to fit everything into one short video.
The brake light flashes only when braking sharply (as described above), when smoothly and standing in traffic jams, it simply lights up, without irritating the drivers behind.
The brightness in the dark is not excessive. because of the tilt of the glass, the lights are directed more upward than backward.
Standard lights work as usual, this strip duplicates them.

Running lights constructor from Aliexpress is a printed circuit board and a set of radio components. All you need to do is solder the components to the board.

But from it you can get more interesting effects of running lights. For example, for turn signals of a car or for a stop signal, or just for garlands for a holiday.


This circuit can operate in the supply voltage range of 3-15 Volts. The pulse generator is assembled on a NE555 microcircuit, then the pulses are fed to a decimal counter with a decoder - a CD4017 microcircuit (or K561IE8), to the outputs of which LEDs are connected through current-limiting resistors.

The switching speed of the running lights is regulated by a trimmer. Add a circuit with triggers and output transistor switches. You don't need to program anything, etc. As a result, you can get more interesting lighting effects of running lights. We need to make another printed circuit board with K561TM2 triggers and power keys on KT815. A pulse from each K561IE8 output is fed to the trigger input according to the "latch" principle, that is, at the trigger output, the signal remains constant until a reset pulse arrives from pin 11 of the CD4017 microcircuit (K561IE8). 9 channels are switched on per cycle.

Did you like the article? To share with friends: