Викладу схему, фото, вихідний код.
Хто розбирається в електроніці, то для нього не буде проблем. В схемі можливі помилки, так, як в принципі робив відразу друковану плату, а схему малював потім.
По правильному потрібно було намалювати схему, а потім по ній робити друковану плату. Тоді б програма для розробки не дала допустити помилки в друкованій платі.
В першій ревізії я ставив два DC/DC перетворювачі. Один діжурний для живлення схеми, а другий силовий для живлення світлодіодів.
Вихідний код:
/*Програма для керування платою OoWoO для автомобілів
Volkswagen Passat B6 або аналогічних
by VetallRX https://driver.top/car/19832
на адресних світлодіодах WS2812
Початок розробки 02.2022
*/
// -------- НАЛАШТУВАННЯ ---------
#define _PowUP 5 // Пін, вихід для керування силовим DC/DC
#define _Stop 8 // Пін, вхід для СТОП
#define _Gabarit 9 // Пін, вхід для ГАБАРИТИ
#define _LeftPov 10 // Пін, вхід для ЛІВИЙ ПОВОРОТ
#define _RightPov 11 // Пін, вхід для ПРАВИЙ ПОВОРОТ
#define _ZadHod 12 // Пін, вхід для ЗАДНІЙ ХІД
#include <FastLED.h> //бібліотека для роботи з адресними світлодіодами
#include <GyverTimer.h> // бібліотека для роботи з таймерами
#include <GyverPower.h> // бібліотека для роботи з режимом енергозбереження
#define NUM_LEDS_PER_STRIP 20 //задаємо кількість світлодіодів у ліхтарі 20 штук
CRGB LeftLamp[NUM_LEDS_PER_STRIP]; //створюємо масив кольорів для лівого ліхтаря
CRGB RightLamp[NUM_LEDS_PER_STRIP]; //створюємо масив кольорів для правого ліхтаря
int mode = 0; //змінна вибору режиму роботи
GTimer myTimer(MS); // створюємо мілісекундний таймер
void setup() {
FastLED.addLeds<WS2812, A0, GRB>(LeftLamp, NUM_LEDS_PER_STRIP); //конфігуруємо пін А0 для лівого ліхтаря
FastLED.addLeds<WS2812, A1, GRB>(RightLamp, NUM_LEDS_PER_STRIP); //конфігуруємо пін А1 для правого ліхтаря
pinMode (_PowUP, OUTPUT); //пін 5 як вихід для керування силовим DC/DC
pinMode (_Stop, INPUT); //пін 8 як вхід сигналу СТОП
pinMode (_Gabarit, INPUT); //пін 9 як вхід сигналу ГАБАРИТИ
pinMode (_LeftPov, INPUT); //пін 10 як вхід сигналу ЛІВИЙ ПОВОРОТ
pinMode (_RightPov, INPUT); //пін 11 як вхід сигналу ПРАВИЙ ПОВОРОТ
pinMode (_ZadHod, INPUT); //пін 12 як вхід сигналу ЗАДНІЙ ХІД
pinMode (2, INPUT); //пін 2 як вхід сигналу переривань
myTimer.setInterval(900000); //запуск таймера в режимі інтервалу 15 хвилин (час через який прилад перейде в режим сну для економії 15*60*1000 мс)
power.autoCalibrate(); //для калібровки таймера енергозбереження
power.setSleepMode(POWERDOWN_SLEEP); //режим енергозбереження (самий економний)
attachInterrupt(0, isr, RISING); //налаштування переривань по INT0, преривання спрацює, коли рівень зміниться с низького рівня на високий
}
// ---------- ПРЕРИВАННЯ ----------
void isr() {
//
power.wakeUp(); //смикаємо за функцію "прокинутися" без неї проснемся чуть пізніше (через 0-8 секунд)
}
// ---------- ЦИКЛ ----------
void loop() {
digitalWrite (_PowUP, HIGH); //вмикаємо силовий DC/DC
if (digitalRead (_ZadHod) == HIGH) { //якщо на вході ЗАДНІЙ ХІД лог.1
mode = 1; //то присвоїть mode 1
}
else if (digitalRead (_LeftPov) == HIGH && digitalRead (_RightPov) == HIGH ) { //якщо на входах ЛІВИЙ ПОВОРОТ и ПРАВИЙ ПОВОРОТ лог.1
mode = 2; //то присвоїть mode 2
}
else if (digitalRead (_LeftPov) == HIGH && digitalRead (_Gabarit) == HIGH ) { //якщо на входах ЛІВИЙ ПОВОРОТ и ГАБАРИТ лог.1
mode = 3; //то присвоїть mode 3
}
else if (digitalRead (_RightPov) == HIGH && digitalRead (_Gabarit) == HIGH ) { //якщо на входах ПРАВИЙ ПОВОРОТ и ГАБАРИТ лог.1
mode = 4; //то присвоїть mode 4
}
else if (digitalRead (_RightPov) == HIGH) { //якщо на вході ПРАВИЙ ПОВОРОТ лог.1
mode = 5; //то присвоїть mode 5
}
else if (digitalRead (_LeftPov) == HIGH) { //якщо на вході ЛІВИЙ ПОВОРОТ лог.1
mode = 6; //то присвоїть mode 6
}
else if (digitalRead (_Stop) == HIGH) { //якщо на вході СТОП лог.1
mode = 7; //то присвоїть mode 7
}
else if (digitalRead (_Gabarit) == HIGH) { //якщо на вході ГАБАРИТИ лог.1
mode = 8; //то присвоїть mode 8
}
else { //якщо на всіх входах 0,
mode = 0; //то присвоїть mode 0
}
switch (mode) { //виконання функцій в залежності від значення mode
case 0: //якщо mode 0
Clear_Func (); //то виконати функцію очистки (гашення) світлодіодів
break;
case 1: //якщо mode 1
Zad_Hod_Func(); //то виконати функцію засвічування ЗАДНЬОГО ХОДУ
break;
case 2: //якщо mode 2
Avar_Func(); //то виконати функцію засвічування АВАРІЙКИ
break;
case 3: //якщо mode 3
Left_Pov_Gab_Func(); //то виконати функцію засвічування ЛІВОГО ПОВОРОТА и ГАБАРИТА
break;
case 4: //якщо mode 4
Right_Pov_Gab_Func(); //то виконати функцію засвічування ПРАВОГО ПОВОРОТА и ГАБАРИТА
break;
case 5: //якщо mode 5
Right_Pov_Func(); //то виконати функцію засвічування ПРАВОГО ПОВОРОТА
break;
case 6: //якщо mode 6
Left_Pov_Func(); //то виконати функцію засвічування ЛІВОГО ПОВОРОТА
break;
case 7: //якщо mode 7
Stop_Func(); //то виконати функцію засвічування СТОПІВ
break;
case 8: //якщо mode 8
Gabar_Func(); //то виконати функцію засвічування ГАБАРИТІВ
break;
}
if (myTimer.isReady()) Sleep_Func(); //коли таймер відрахує заданий час, то запускаємо функцію сну
}
// --------- ФУНКЦІЇ --------
void Sleep_Func () { //функція сну
digitalWrite (_PowUP, LOW); //вимикаємо силовий DC/DC
power.sleep(SLEEP_FOREVER); //команда спати завжди
}
void Clear_Func() { //функція гашення світлодіодів
FastLED.clear(); //очищаємо масив кольорів (світлодіоди не світять)
FastLED.show(); //виводимо масив на ліхтарі
}
void Gabar_Func() { //функція засвічування ГАБАРИТІВ
FastLED.clear(); //очищаємо масив кольорів (світлодіоди не світять)
FastLED.setBrightness(20); //задаємо яскравість для габаритів, підбирати так, щоб світили приблизно, як і рідні
FastLED.showColor(0xF50000); //виставляємо колір 617nm Amber LAYT67B-T2V1-1-1+U2V2-45 https://wavepalette.com/ua
myTimer.reset(); //скидаємо таймер, поки виконується ця функція
}
void Stop_Func() { //функція засвічування СТОПІВ
FastLED.clear(); //очищаємо масив кольорів (світлодіоди не світять)
FastLED.setBrightness(255); //задаємо яскравість для стопів, підбирати так, щоб світили приблизно, як і рідні
FastLED.showColor(0xF50000); //виставляємо колір 617nm Amber LAYT67B-T2V1-1-1+U2V2-45 https://wavepalette.com/ua
myTimer.reset(); //скидаємо таймер, поки виконується ця функція
}
void Zad_Hod_Func() { //функція засвічування ЗАДНЬОГО ХОДУ
FastLED.clear(); //очищаємо масив кольорів (світлодіоди не світять)
FastLED.setBrightness(255); //задаємо яскравість для заднього ходу (255 максимальна)
FastLED.showColor(0xFFFFFF); //виставляємо білий колір
myTimer.reset(); //скидаємо таймер, поки виконується ця функція
}
void Left_Pov_Func() { //функція засвічування ЛІВОГО ПОВОРОТУ
FastLED.clear(); //очищаємо масив кольорів (світлодіоди не світять)
FastLED.setBrightness(150); //задаємо яскравість для поворотів, підбирати так, щоб світили приблизно, як і рідні
for (int i = 0; i < NUM_LEDS_PER_STRIP; i++) { //заповнюємо масив світлодіодів від 0 до 20
LeftLamp[i] = (0xEA7B00); //виставляємо колір 587nm Yellow LAYT67B-T2V1-1-1+U2V2-45 https://wavepalette.com/ua
}
FastLED.show(); //виводимо массив на ліхтар
myTimer.reset(); //скидаємо таймер, поки виконується ця функція
}
void Right_Pov_Func() { //функція засвічування ПРАВОГО ПОВОРОТУ
FastLED.clear(); //очищаємо масив кольорів (світлодіоди не світять)
FastLED.setBrightness(150); //задаємо яскравість для поворотів, підбирати так, щоб світили приблизно, як і рідні
for (int i = 0; i < NUM_LEDS_PER_STRIP; i++) { //заповнюємо масив світлодіодів від 0 до 20
RightLamp[i] = (0xEA7B00); //виставляємо колір 587nm Yellow LAYT67B-T2V1-1-1+U2V2-45 https://wavepalette.com/ua
}
FastLED.show(); //виводимо массив на ліхтар
myTimer.reset(); //скидаємо таймер, поки виконується ця функція
}
void Avar_Func() { //функція засвічування АВАРІЙКИ
FastLED.clear(); //очищаємо масив кольорів (світлодіоди не світять)
FastLED.setBrightness(150); //задаємо яскравість для поворотів, підбирати так, щоб світили приблизно, як і рідні
for (int i = 0; i < NUM_LEDS_PER_STRIP; i++) { //заповнюємо масив світлодіодів від 0 до 20
LeftLamp[i] = (0xEA7B00); //виставляємо колір 587nm Yellow LAYT67B-T2V1-1-1+U2V2-45 https://wavepalette.com/ua
RightLamp[i] = (0xEA7B00); //виставляємо колір 587nm Yellow LAYT67B-T2V1-1-1+U2V2-45 https://wavepalette.com/ua
}
FastLED.show(); //виводимо масив на ліхтар
myTimer.reset(); //скидаємо таймер, поки виконується ця функція
}
void Right_Pov_Gab_Func() { //функція засвічування ПРАВОГО ПОВОРОТУ при працюючих ГАБАРИТАХ
FastLED.clear(); //очищаємо масив кольорів (світлодіоди не світять)
FastLED.setBrightness(150); //задаємо яскравість для поворотів, підбирати так, щоб світили приблизно, як і рідні
for (int i = 0; i < NUM_LEDS_PER_STRIP; i++) { //заповнюємо масив світлодіодів від 0 до 20
RightLamp[i] = (0xEA7B00); //виставляємо колір 587nm Yellow LAYT67B-T2V1-1-1+U2V2-45 https://wavepalette.com/ua
}
FastLED.show(); //виводимо масив на ліхтар
FastLED.setBrightness(20); //задаємо яскравість для поворотів, підбирати так, щоб світили приблизно, як і рідні
for (int i = 0; i < NUM_LEDS_PER_STRIP; i++) { //заповнюємо масив світлодіодів від 0 до 20
LeftLamp[i] = (0xF50000); //виставляємо колір 617nm Amber LAYT67B-T2V1-1-1+U2V2-45 https://wavepalette.com/ua
}
FastLED.show(); //виводимо масив на ліхтар
myTimer.reset(); //скидаємо таймер, поки виконується ця функція
}
void Left_Pov_Gab_Func() { //функція засвічування ЛІВОГО ПОВОРОТУ при працюючихх ГАБАРИТАХ
FastLED.clear(); //очищаємо масив кольорів (світлодіоди не світять)
FastLED.setBrightness(150); //задаємо яскравість для поворотів, підбирати так, щоб світили приблизно, як і рідні
for (int i = 0; i < NUM_LEDS_PER_STRIP; i++) { //заповнюємо масив світлодіодів від 0 до 20
LeftLamp[i] = (0xEA7B00); //виставляєм колір 587nm Yellow LAYT67B-T2V1-1-1+U2V2-45 https://wavepalette.com/ua
}
FastLED.show(); //выводим масив на ленту
FastLED.setBrightness(20); //задаємо яскравість для поворотів, підбирати так, щоб світили приблизно, як і рідні
for (int i = 0; i < NUM_LEDS_PER_STRIP; i++) { //заповнюємо масив світлодіодів від 0 до 20
RightLamp[i] = (0xF50000); //виставляємо колір 617nm Amber LAYT67B-T2V1-1-1+U2V2-45 https://wavepalette.com/ua
}
FastLED.show();
myTimer.reset(); //скидаємо таймер, поки виконується ця функція
}