Volkswagen Passat Variant (B6) ("Bender Rodriguez")

OoWoO Частина третя

Я їжджу на Volkswagen Passat Variant (B6)
Богуслав, Україна

Викладу схему, фото, вихідний код.

Хто розбирається в електроніці, то для нього не буде проблем. В схемі можливі помилки, так, як в принципі робив відразу друковану плату, а схему малював потім.

По правильному потрібно було намалювати схему, а потім по ній робити друковану плату. Тоді б програма для розробки не дала допустити помилки в друкованій платі.


Схема



Вид зверху



вид знизу


В першій ревізії я ставив два 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();      //скидаємо таймер, поки виконується ця функція
}



Ціна питання 500 UAH,
Опубліковано: 17 січня 19:29
Подія: 24 жовтня 2023р. 20:28
0 0 0

Коментарі

Щоб залишати коментарі, потрібно авторизуватись.