Projektantem świateł do biegania z Aliexpress jest płytka drukowana oraz zestaw komponentów radiowych. Wystarczy przylutować elementy do płytki.

Ale z tego możesz uzyskać więcej ciekawe efektyświatła do jazdy. Na przykład do kierunkowskazów samochodowych lub w sygnale stopu lub po prostu na girlandach na wakacje.


Obwód ten może pracować w zakresie napięcia zasilania 3-15 woltów. Generator impulsów jest montowany na układzie NE555, a następnie impulsy są podawane do licznika dziesiętnego z dekoderem - układem CD4017 (lub K561IE8), do którego wyjść diody LED są podłączone przez rezystory ograniczające prąd.

Prędkość przełączania świateł do jazdy jest regulowana przez rezystor dostrajający. Dodaj obwód z przerzutnikami i wyjściowymi przełącznikami tranzystorowymi. Nie wymaga programowania itp. W rezultacie ciekawsze efekty świetlneświatła do jazdy. Musisz wykonać kolejną płytkę drukowaną z wyzwalaczami K561TM2 i klawiszami zasilania na KT815. Impuls z każdego wyjścia K561IE8 jest podawany na wejście wyzwalające zgodnie z zasadą „zatrzasku”, to znaczy sygnał na wyjściu wyzwalającym pozostaje stały, dopóki impuls resetujący nie nadejdzie z pinu 11 układu CD4017 (K561IE8). 9 kanałów jest włączanych na cykl.


Witam wszystkich majsterkowiczów! Dziś przyjrzymy się jednej z wielu aplikacji Pasek ledowy typ WS2812B na adresowalnych diodach LED RGB. Takie taśmy (a także oddzielnie montowane diody LED WS2812B) można wykorzystać do oświetlania tła „Ambilight” monitorów komputerowych i telewizorów, dynamicznego oświetlenia w samochodzie, obrazu, ramki na zdjęcia, akwarium i tak dalej. Są szeroko stosowane w projektowaniu dowolnych pomieszczeń, w postaci iluminacji noworocznych lub pokazów świetlnych. Zastosowanie taśmy LED typu WS2812B daje możliwość uzyskania dużej ilości ciekawych projektów.

WS2812B LED to dioda LED RGB osadzona w tej samej obudowie z chipem WS2801.


Sama dioda WS2812B jest elementem SMD przeznaczonym do montażu natynkowego. Wewnątrz dioda LED składa się z kryształów światła czerwonego (czerwonego), światła zielonego (zielona) i kryształów światła niebieskiego (niebieskiego) w jednym opakowaniu. Dzięki tej diodzie LED można uzyskać szeroką gamę odcieni kolorów promieniowania świetlnego.

Dioda LED RGB jest sterowana za pomocą płytki mikrokontrolera Arduino.
Otrzymałem od Chińczyków taśmę LED WS2812B, jest to odcinek o długości 1 metra ze 144 diodami. Od dawna chciałem spróbować różnych eksperymentów. Z pomocą bibliotek dla Arduino - Adafruit Neopixel i Fast led można uzyskać wiele bardzo nietypowych efektów świetlnych. Ale potem postanowiłem spróbować dynamiczne kierunkowskazy na samochód w tak zwanym „stylu Audi”. Jeszcze nie zacząłem wcielać tego schematu w życie (jak przyjmą to nasi gibbdesznicy?), Ale efekt oczywiście okazał się bardzo atrakcyjny.

Płytka służy jako kontroler do sterowania paskiem LED. Arduino Uno Możesz użyć innych płytek - Arduino Nano, Arduino Pro mini).
Obejrzyj cały proces na filmie:


Lista narzędzi i materiałów.
-Płytka Arduino ONZ;
- płytka obniżająca napięcie 12V\5V przy 3A;
- rezystory 100Kom-4szt;
-rezystory 47Kom-4szt;
- rezystory 500 Ohm-1szt;
-przyciski (symulujące włączenie sygnałów) -4szt;
- deska chlebowa
-Śrubokręt;
blok laboratoryjny jedzenie
- lutownica;
- kambrowy;
-próbnik.
- przewody łączące.

Krok pierwszy. Montaż schematu.


Układ zmontowałem za pomocą płytki stykowej (bradboard). Rezystory podłączone do wejść cyfrowych Arduino są potrzebne do konwersji sygnałów wejściowych samochodu z 12 na 5 woltów. Rezystor 500 omów do ochrony linii sterującej taśmy LED WS2812B.
Zdjęcie tablicy


Jako konwerter z 12V na 5V użyłem gotowej płytki z Aliexpress. Można zastosować dowolny konwerter o odpowiednich parametrach. Konwerter jest potrzebny do stabilnego zasilania Arduino i taśmy LED WS2812B.


Krok drugi. Programowanie Arduino.

Wejścia cyfrowe płytki Arduino nr 3,4 służą do włączania skrętu lewego i prawego. Pin nr 5 - włącz światło hamowania, pin nr 6 - włącz bieg wsteczny. Numer pinu 8 - taśma sygnału sterującego WS2812B.

W Arduino IDE wgraj szkic (link powyżej). Dwie opcje szkicu - jedna na przód samochodu, druga na tył. Użyj tego, czego potrzebujesz. Na początku szkicu możesz ustawić liczbę potrzebnych diod LED. Możesz również dostosować prędkość kierunkowskazów do swojego samochodu. Możesz również zmienić jasność diod LED za pomocą paska. Parametr Kolor(103,31,0) - zmień pierwsze dwie cyfry z 0 na 255. Czyli możesz trochę poeksperymentować.

Po naciśnięciu żądanego przycisku dajemy sygnał, aby włączyć żądany parametr. Przy prawidłowym montażu obwodu zwykle zaczyna działać natychmiast.

Zdjęcie w toku.






W ten weekendowy projekt okazał się niezłym eksperymentem. To było ciekawe

Powiedział w zeszłym roku "Gop" - czas skakać :)
A raczej zrobić obiecany przegląd włączonych kierunkowskazów.
Zamówiłem 1 metr czarnej taśmy WS2812B (144 diody) w silikonowej tubie, przy zamówieniu wybrałem „Czarny 1m 144led IP67” (może komuś spodoba się biały kolor podłoża, jest taki wybór).

Małe zastrzeżenie

Otrzymałem taśmę lutowaną z dwóch półmetrowych kawałków. Minusem tego jest słaby punkt lutowania (z czasem styki mogą pękać) oraz zwiększona szczelina między diodami.
Skontaktuj się ze sprzedawcą przed zakupem

Przewody jezdne zostały przylutowane do taśmy z obu stron do szeregowego połączenia kilku sztuk, ponieważ Nie potrzebowałem go, potem odlutowałem go z jednej strony drutu, zapieczętowałem neutralnym uszczelniaczem i nawinąłem jeszcze trochę czarnej taśmy elektrycznej.



Mocowana do szkła za pomocą dwustronnej przezroczystej taśmy klejącej np.

Szczegóły instalacji

Odtłuściłem powierzchnie, najpierw przykleiłem taśmę samoprzylepną do rurki (nazwę to tak, mimo że przekrój jest prostokątny), odciąłem wystający nadmiar szerszej taśmy, włożyłem krawędzie rurki w szczelinę między sufit i górne części paneli ozdobnych słupków tylnych (przewody stykowe ze złączem schowałem za jednym panelem ), wycentrowałem i zacząłem dociskać do szyby, powoli wyciągając warstwę ochronną taśmy.
Niestety nie ma wideo - nie było wolnych rąk do strzelania, a samochody każdego są inne.
Jeśli coś nie jest jasne - zapytaj w komentarzach.
Letni test upałów wypadł pomyślnie - nic się nie odkleiło ani nie unosiło.
Jedynym minusem jest to, że kąt nachylenia szkła jest łagodny, diody świecą bardziej do góry. W słoneczny dzień trudno to zobaczyć, ale ponieważ są to zduplikowane sygnały, to

Przejdźmy teraz do farszu elektronicznego.
Użyłem, ale niedawno odkryłem

Za mniej więcej ten sam koszt dostajemy więcej bułek

Szkic będzie działał bez żadnych modyfikacji na Wemos podczas programowania w Arduino IDE, a jeśli zaimplementujesz mały serwer WWW, to po połączeniu się z nim przez Wi-Fi możesz zmienić wartości zmiennych, takich jak czas opóźnienia między mrugnięciami, wielkość opóźnienia podczas hamowania awaryjnego itp.
Tutaj w przyszłości, jeśli ktoś jest zainteresowany realizacją projektu na ESP8266, to mogę zamieścić przykład zmiany ustawień przez interfejs webowy, zapisania ich do EEPROM, a następnie odczytania.
Uruchomienie serwera WWW można zrealizować np. poprzez włączenie kierunkowskazów i wciśnięcie pedału hamulca przy włączonym zapłonie (w procedurze konfiguracji odpytywanie stanów odpowiednich wejść).

Aby wdrożyć tryb migania podczas gwałtownego hamowania został zakupiony
Szkic monitoruje poziom zwalniania po wciśnięciu pedału hamulca, jeśli przekroczy 0,5G (mocne hamowanie, ale nie pisk hamulców), to na kilka sekund aktywowany jest tryb migania, aby przyciągnąć dodatkową uwagę.
Sygnały sterujące na wejścia Arduino z "plusa" zatrzymują się, kierunkowskazy i wsteczne są podawane izolacja galwaniczna- transoptory z rezystorami ograniczającymi prąd, które ostatecznie tworzą poziom LOW na wejściach Arduino (na stałe podciągnięty do dodatniego przez rezystory 10kΩ).
Zasilanie - 5 woltów przez konwerter DC-DC buck.
Całość składana jak kanapka i pakowana w odpowiednie pudełko, na którym zaznaczyłem strzałką kierunek montażu dla poprawnej orientacji czujnika grawitacyjnego

Schemat i zdjęcie



Wartość rezystorów podciągających (do plusa) jest standardowa - 10 kOhm, rezystory ograniczające prąd - 1 kOhm. Ze starych płyt wypadły transoptory, dwie dostały PC123, dwie - PC817.


Na pierwszym zdjęciu widać dwa dodatkowe piny, zrobiłem je do kierunkowskazów. Ponieważ w moim aucie przy włączonej dźwigni kolumny kierownicy występuje zwarcie do masy, podłączyłem przewody do bloku dźwigni i wejść Arduino. Jeśli przełącznik kolumny kierownicy przełącza się na plus lub odbiera sygnał z żarówek „+” lewego / prawego kierunkowskazu, podłącz je przez izolację galwaniczną.



No to teraz sam szkic (Arduino IDE)

#włączać #włączać //kilka uwag ogólnych // Wyłączyłem jedną z zewnętrznych diod, ponieważ błyszczały na ozdobnych panelach regałów // widoczne na tym przykładzie dla pętli(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; //następnie zmień cykle w bloku STOP na (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); }

Próbowałem go maksymalnie skomentować, ale jeśli będą pytania, postaram się dodać komentarz (dlatego umieszczam go w tekście recenzji, a nie jako załączony plik). Nawiasem mówiąc, dotyczy to również innych punktów recenzji - uzupełnię ją również, jeśli w komentarzach pojawią się istotne pytania.

I na koniec demonstracja pracy (użyłem szkicu z trybem demo do wideo).

Aktualizacja Zrobiłem szkic z trybem demo specjalnie, aby zmieścić wszystko w jednym krótkim filmie.
Światło hamowania miga tylko podczas gwałtownego hamowania (tak było napisane powyżej), gdy jest płynne i stoi w korkach, po prostu pali się nie denerwując kierowców od tyłu.
Jasność w ciemności nie jest przesadna, bo. ze względu na pochylenie szyby, światła skierowane są bardziej do góry niż do tyłu.
Zwykłe światła działają jak zwykle, ten pasek je powiela.

planuję kupić +97 Dodaj do ulubionych Podobała mi się recenzja +89 +191

Powiedział w zeszłym roku "Gop" - czas skakać :)
A raczej zrobić obiecany przegląd włączonych kierunkowskazów.
Zamówiłem 1 metr czarnej taśmy WS2812B (144 diody) w silikonowej tubie, przy zamówieniu wybrałem „Czarny 1m 144led IP67” (może komuś spodoba się biały kolor podłoża, jest taki wybór).

Małe zastrzeżenie

Otrzymałem taśmę lutowaną z dwóch półmetrowych kawałków. Minusem tego jest słaby punkt lutowania (z czasem styki mogą pękać) oraz zwiększona szczelina między diodami.
Skontaktuj się ze sprzedawcą przed zakupem

Przewody jezdne zostały przylutowane do taśmy z obu stron do szeregowego połączenia kilku sztuk, ponieważ Nie potrzebowałem go, potem odlutowałem go z jednej strony drutu, zapieczętowałem neutralnym uszczelniaczem i nawinąłem jeszcze trochę czarnej taśmy elektrycznej.



Mocowana do szkła za pomocą dwustronnej przezroczystej taśmy klejącej np.

Szczegóły instalacji

Odtłuściłem powierzchnie, najpierw przykleiłem taśmę samoprzylepną do rurki (nazwę to tak, mimo że przekrój jest prostokątny), odciąłem wystający nadmiar szerszej taśmy, włożyłem krawędzie rurki w szczelinę między sufit i górne części paneli ozdobnych słupków tylnych (przewody stykowe ze złączem schowałem za jednym panelem ), wycentrowałem i zacząłem dociskać do szyby, powoli wyciągając warstwę ochronną taśmy.
Niestety nie ma wideo - nie było wolnych rąk do strzelania, a samochody każdego są inne.
Jeśli coś nie jest jasne - zapytaj w komentarzach.
Letni test upałów wypadł pomyślnie - nic się nie odkleiło ani nie unosiło.
Jedynym minusem jest to, że kąt nachylenia szkła jest łagodny, diody świecą bardziej do góry. W słoneczny dzień trudno to zobaczyć, ale ponieważ są to zduplikowane sygnały, to

Przejdźmy teraz do farszu elektronicznego.
Użyłem, ale niedawno odkryłem

Za mniej więcej ten sam koszt dostajemy więcej bułek

Szkic będzie działał bez żadnych modyfikacji na Wemos podczas programowania w Arduino IDE, a jeśli zaimplementujesz mały serwer WWW, to po połączeniu się z nim przez Wi-Fi możesz zmienić wartości zmiennych, takich jak czas opóźnienia między mrugnięciami, wielkość opóźnienia podczas hamowania awaryjnego itp.
Tutaj w przyszłości, jeśli ktoś jest zainteresowany realizacją projektu na ESP8266, to mogę zamieścić przykład zmiany ustawień przez interfejs webowy, zapisania ich do EEPROM, a następnie odczytania.
Uruchomienie serwera WWW można zrealizować np. poprzez włączenie kierunkowskazów i wciśnięcie pedału hamulca przy włączonym zapłonie (w procedurze konfiguracji odpytywanie stanów odpowiednich wejść).

Aby wdrożyć tryb migania podczas gwałtownego hamowania został zakupiony
Szkic monitoruje poziom zwalniania po wciśnięciu pedału hamulca, jeśli przekroczy 0,5G (mocne hamowanie, ale nie pisk hamulców), to na kilka sekund aktywowany jest tryb migania, aby przyciągnąć dodatkową uwagę.
Sygnały sterujące do wejść Arduino z „plusa” ograniczników, kierunkowskazów i rewersu wyprowadzone są przez izolację galwaniczną - transoptory z rezystorami ograniczającymi prąd, które ostatecznie tworzą poziom LOW na wejściach Arduino (ciągle podciągnięty do plusa przez 10kΩ rezystory).
Zasilanie - 5 woltów przez konwerter DC-DC buck.
Całość składana jak kanapka i pakowana w odpowiednie pudełko, na którym zaznaczyłem strzałką kierunek montażu dla poprawnej orientacji czujnika grawitacyjnego

Schemat i zdjęcie



Wartość rezystorów podciągających (do plusa) jest standardowa - 10 kOhm, rezystory ograniczające prąd - 1 kOhm. Ze starych płyt wypadły transoptory, dwie dostały PC123, dwie - PC817.


Na pierwszym zdjęciu widać dwa dodatkowe piny, zrobiłem je do kierunkowskazów. Ponieważ w moim aucie przy włączonej dźwigni kolumny kierownicy występuje zwarcie do masy, podłączyłem przewody do bloku dźwigni i wejść Arduino. Jeśli przełącznik kolumny kierownicy przełącza się na plus lub odbiera sygnał z żarówek „+” lewego / prawego kierunkowskazu, podłącz je przez izolację galwaniczną.



No to teraz sam szkic (Arduino IDE)

#włączać #włączać //kilka uwag ogólnych // Wyłączyłem jedną z zewnętrznych diod, ponieważ świeciły na ozdobnych panelach stojaków //na przykładzie tej pętli for (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; //następnie zmień cykle w bloku STOP na (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); }

Próbowałem go maksymalnie skomentować, ale jeśli będą pytania, postaram się dodać komentarz (dlatego umieszczam go w tekście recenzji, a nie jako załączony plik). Nawiasem mówiąc, dotyczy to również innych punktów recenzji - uzupełnię ją również, jeśli w komentarzach pojawią się istotne pytania.

I na koniec demonstracja pracy (użyłem szkicu z trybem demo do wideo).

Aktualizacja Zrobiłem szkic z trybem demo specjalnie, aby zmieścić wszystko w jednym krótkim filmie.
Światło hamowania miga tylko podczas gwałtownego hamowania (tak było napisane powyżej), gdy jest płynne i stoi w korkach, po prostu pali się nie denerwując kierowców od tyłu.
Jasność w ciemności nie jest przesadna, bo. ze względu na pochylenie szyby, światła skierowane są bardziej do góry niż do tyłu.
Zwykłe światła działają jak zwykle, ten pasek je powiela.

Wszyscy, którzy widzieli samochód mniej więcej nowoczesny, a nie po raz drugi, a jeśli była to jeszcze kwestia jazdy, już dawno zauważyli dla siebie jedną z przydatnych opcji... Ludzie nazywają to leniwym kierunkowskazem lub grzecznym kierunkowskaz. Cała jego istota sprowadza się do tego, że skręcając w prawo lub w lewo, kierowca tylko raz dotyka dźwigni kierunkowskazów, nie naprawiając jej. Oznacza to, że po prostu pozwala działać obwodom kierunkowskazów, ale nie włącza tego samego przełącznika. W rezultacie po zwolnieniu dźwigni kierunkowskazy działają jeszcze 3-4 razy, a kierowca w tym czasie może już prowadzić własną działalność, czyli całkowicie poddać się drodze. Ta opcja jest bardzo przydatna, gdy musisz zmienić pas. Rzeczywiście, gdy dźwignia kierunkowskazów jest całkowicie przekręcona, automatyczne wyłączenie nie nastąpi z powodu nieznacznego kąta obrotu kierownicy, co oznacza, że ​​konieczne będzie grzebanie w przód i w tył z samym kierunkowskazem lub ciągłe podpieranie go z ręką na granicy włączenia, aby zasymulować działanie kierunkowskazu. A jeśli jest taka opcja, po prostu dotknąłem trochę dźwigni i zapomniałem. Generalnie uważamy, że istota pracy została w pełni ujawniona, ale teraz warto wspomnieć o ewentualnej implementacji takiej opcji na swoim komputerze.

Które obwody elektryczne są odpowiednie dla uprzejmego kierunkowskazu na Arduino?

Zanim wpadniesz w poważne kłopoty z produkcją uprzejmego kierunkowskazu, musisz zrozumieć, do których schematów elektrycznych jest odpowiedni bez modyfikowania obwodu elektrycznego w samochodzie.
Tutaj mamy dwie główne opcje, zasadniczo różne. Pierwszym z nich jest włączenie kierunkowskazów, gdy są one podłączone jako obciążenie. Oznacza to, że włączenie następuje z powodu przełączenia obwodu kierunkowskazów, w którym znajduje się sama dźwignia kierunkowskazów, to on zamyka obwód, po czym następuje operacja. W takim przypadku nie zadziała skorzystanie z naszej opcji, ponieważ gdy dźwignia otwiera obwód z lampkami, od razu wyłączamy możliwość sygnalizacji świetlnej, nawet jeśli sygnał dotrze do samej dźwigni, po prostu nie pojedzie dalej.
Druga opcja jest nasza, gdy są sygnały sterujące i są sygnały mocy wyjściowej. W takim przypadku zamiast zwykłego przekaźnika możesz umieścić tylko obwód, na który chcielibyśmy zwrócić Twoją uwagę.

Przekaźnikowy moduł zasilania, który można kupić w Internecie, aby kontrolować obciążenie mocy

Szkic i schemat leniwego (uprzejmego) kierunkowskazu na Arduino

Można więc polemizować z wykorzystaniem Arduino jako jednostki głównej jako leniwych kierunkowskazów, ponieważ nie jest to również idealne rozwiązanie, które ma swoje wady. Powiedzmy, że po włączeniu zapłonu konieczne będzie posiadanie stałej mocy, aby zapewnić prędkość, konieczne będzie podłączenie obwodów zasilania. Jednocześnie samo wiązanie z niepotrzebnych elementów radiowych jest tutaj w zasadzie bezużyteczne, bo w tym przypadku można po prostu zaprogramować mikrokontroler i używać tylko go. Ale ten minus to też plus, bo każdy kto go ma może sobie pozwolić na zaprogramowanie Arduino, a do mikrokontrolerów potrzebny będzie też programator.
Samo napisanie programu będzie jednym z najtrudniejszych zadań. Tutaj początkujący będzie musiał spędzić ponad godzinę wolnego czasu i studiować działanie algorytmów, ale na szczęście jest Internet i my jesteśmy. Oto szkic.

int przełącznikPinR=8; int przełącznikPinL=7; intedPinR=11; intledPinL=12; boolean ledOn = fałsz; int i=0; cal=0; void setup() ( // umieść tutaj swój kod konfiguracji, aby uruchomić raz: pinMode(switchPinR, INPUT); pinMode(switchPinL, INPUT); pinMode(ledPinR, OUTPUT); pinMode(ledPinL, OUTPUT); Serial.begin(9600) ); ) void loop() ( // umieść tutaj swój główny kod, aby uruchomić wielokrotnie: //2 label: if (digitalRead(switchPinR) == HIGH && digitalRead(switchPinL) == HIGH) ( digitalWrite(ledPinR, HIGH) ; digitalWrite(ledPinL, HIGH); i=0; while (i<7) { ledOn = !ledOn; digitalWrite(ledPinR, ledOn); digitalWrite(ledPinL, ledOn); delay(400); i++; z++; if (digitalRead(switchPinL) == LOW && digitalRead(switchPinR) == LOW && z>=7) ( break; ) ) ) else ( digitalWrite(ledPinR, LOW); digitalWrite(ledPinL, LOW; z=0; ) // Zapętl alarm, jeśli (digitalRead(switchPinR) == HIGH && digitalRead(switchPinL) = = HIGH) (etykieta goto;) //Prawy kierunkowskaz. if (digitalRead(switchPinR) == HIGH) ( digitalWrite(ledPinR, HIGH); i=0; while (i<7) { ledOn = !ledOn; digitalWrite(ledPinR, ledOn); delay(400); i++; z++; if (digitalRead(switchPinR) == LOW && z>=7) (przerwa; ) ) ) else ( digitalWrite(ledPinR, LOW); z=0; ) //Sygnał skrętu w lewo. if (digitalRead(switchPinL) == HIGH) ( digitalWrite(ledPinL, HIGH); i=0; while (i<7) { ledOn = !ledOn; digitalWrite(ledPinL, ledOn); delay(400); i++; z++; if (digitalRead(switchPinL) == LOW && z>=7) ( przerwa; ) ) ) else ( digitalWrite(ledPinL, LOW; z=0; )) ) )

Krótko mówiąc, możemy podsumować, że szkic ma 2 wejścia i 2 wyjścia. Jednocześnie na wejściu dodatnim, czyli wysokim poziomie sygnału na wejściu (8,7) otrzymujemy pewną liczbę mrugnięć (z lub i) na odpowiednim wyjściu (11,12). Krótko mówiąc, coś takiego. Oznacza to, że jeśli chcesz coś zmienić w szkicu, jeśli chodzi o liczbę mrugnięć i wyjść wejść, zwróć uwagę na te zmienne. Jeśli konieczna będzie zmiana długości mrugnięć, należy zwrócić uwagę na funkcję opóźnienia.
Kolejną cechą programu jest nieco nietypowe wyjście alarmowe. Najpierw opracowywane są lewy i prawy wskaźnik, a następnie włączany jest alarm światła awaryjnego. Wynika to z tego, że może się włączyć tylko wtedy, gdy wejście jest jednocześnie stan wysoki na wejściach 8 i 7. I ten warunek zostanie spełniony dopiero dla drugiego cyklu, ponieważ wciśnięcie dwóch przycisków jednocześnie nie zadziała tylko fizycznie. Szybkość mikrokontrolera pozwoli szybciej odczytać stan wysoki z jakiegoś przycisku i zadecydować, że nadal jest to warunek działania kierunkowskazu, a nie alarm. Chociaż nie powinieneś się tym przejmować, poza tym, że podziękowanie w drodze będzie problematyczne.

Funkcje podłączenia leniwego (uprzejmego) kierunkowskazu do Arduino w samochodzie

Nie należy używać pinu 13 jako wyjścia, ponieważ za każdym razem, gdy zasilanie jest włączane i wyłączane, wskaźniki, które będą podłączone do tego wyjścia, mogą migotać.
Przełączając się z sygnałów sterujących na sygnały zasilające, użyj odpowiednich bloków zakupionych w Internecie lub zmontowanych przez Ciebie. Mówiliśmy już o takich blokach - modułach.
Odbierając sygnał 1 z napięcia 12 woltów, przed wejściem należy umieścić rezystor 10 kΩ.

To właściwie wszystkie słowa rozstania podczas robienia leniwego kierunkowskazu dla samochodu na mikrokontrolerze Arduino, a teraz mniej więcej to samo na wideo ...