Návrhář běžících světel z Aliexpress je tištěný spoj a sadu rádiových komponent. Jediné, co musíte udělat, je připájet součástky k desce.

Ale z toho můžete získat více zajímavé efekty běžící světla. Například pro blinkry do auta nebo v návěstidle stop nebo jen tak na girlandy na dovolenou.


Tento obvod může pracovat v rozsahu napájecího napětí 3-15 voltů. Generátor pulsů je namontován na čipu NE555, poté jsou pulsy přiváděny do dekadického čítače s dekodérem - čipem CD4017 (nebo K561IE8), k jehož výstupům jsou LED připojeny přes odpory omezující proud.

Rychlost spínání návěstidel je regulována ladícím odporem. Přidejte obvod s klopnými obvody a výstupními tranzistorovými spínači. Není potřeba žádné programování atd. Ve výsledku zajímavější světelné efekty běžící světla. Potřebujete vyrobit další desku plošných spojů se spouštěči K561TM2 a vypínači na KT815. Puls z každého výstupu K561IE8 je přiveden na spouštěcí vstup podle principu „latch“, to znamená, že signál na výstupu spouště zůstává konstantní, dokud z pinu 11 čipu CD4017 (K561IE8) nepřijde resetovací impuls. Na jeden cyklus se zapne 9 kanálů.


Zdravím všechny kutily! Dnes se podíváme na jednu z mnoha aplikací led pásek typu WS2812B na adresovatelných RGB LED. Takové pásky (stejně jako samostatně namontované LED diody WS2812B) lze použít k osvětlení pozadí „Ambilight“ počítačových monitorů a televizorů, dynamického osvětlení v autě, obrazu, fotorámečku, akvária a tak dále. Jsou široce používány při navrhování jakýchkoli prostor, ve formě novoročních osvětlení nebo světelných show. Použití LED pásku typu WS2812B umožňuje získat velké množství zajímavých projektů.

WS2812B LED je RGB LED vestavěná do stejného pouzdra jako čip WS2801.


Samotná LED WS2812B je SMD prvek určený pro povrchovou montáž. Uvnitř se LED skládá z krystalů červeného světla (červená), zeleného světla (zelená) a modrého světla (modrá) v jednom balení. S touto LED můžete získat širokou škálu barevných odstínů světelného záření.

RGB LED se ovládá přes desku mikrokontroléru Arduino.
Od Číňanů jsem dostal LED pásek WS2812B.Je to 1 metr dlouhý segment se 144 LED. Už dlouho jsem chtěl zkoušet různé experimenty. S pomocí knihoven pro Arduino - Adafruit Neopixel a Fast led můžete získat spoustu velmi neobvyklých světelných efektů. Ale pak jsem se rozhodl to zkusit dynamické směrovky pro auto v tzv. „Audi stylu.“ Toto schéma jsem ještě nezačal uvádět do praxe (jak to přijmou naši gibbddeshnici?), Ale efekt se ukázal být samozřejmě velmi atraktivní.

Deska slouží jako ovladač pro ovládání LED pásku. Arduino Uno Můžete použít jiné desky - Arduino Nano, Arduino Pro mini).
Podívejte se na celý proces ve videu:


Seznam nástrojů a materiálů.
- Deska Arduino uno;
- snižovací deska 12V \ 5V při 3A;
- rezistory 100Kom-4ks;
-rezistory 47Kom-4ks;
- rezistory 500 Ohm-1ks;
-tlačítka (pro simulaci zahrnutí signálů) -4ks;
- prkénko na chleba
-šroubovák;
laboratorní blok jídlo
- páječka;
- cambric;
- tester.
- propojovací vodiče.

Krok první. Sestavení schématu.


Obvod jsem sestavil pomocí breadboardu (bradboard). Rezistory připojené k digitálním vstupům Arduino jsou potřebné pro převod vstupních signálů automobilu z 12 na 5 voltů. 500 ohmový odpor pro ochranu řídicí linky LED pásku WS2812B.
Foto desky


Jako převodník z 12V na 5V jsem použil hotovou desku z Aliexpressu. Lze použít jakýkoli převodník s vhodnými parametry. Převodník je potřebný pro stabilní napájení Arduina a LED pásku WS2812B.


Krok dva. Programování Arduina.

Digitální vstupy desky Arduino č. 3,4 slouží k zapínání levého a pravého závitu. Pin číslo 5 - rozsvícení brzdového světla, pin číslo 6 - zapnutí zpátečky. Pin číslo 8 - ovládací signální páska WS2812B.

V Arduino IDE nahrajte skicu (odkaz výše). Dvě možnosti skici - jedna pro přední část vozu, druhá pro zadní část. Použijte, co potřebujete. Na začátku náčrtu můžete nastavit počet potřebných LED diod. Rychlost směrových světel si také můžete upravit podle svého vozu. Jas LED diod můžete také změnit parametrem strip.Color(103,31,0) - změňte první dvě číslice od 0 do 255. To znamená, že můžete trochu experimentovat.

Když stisknete požadované tlačítko, dáme signál k povolení požadovaného parametru. Při správném sestavení obvodu většinou okamžitě začne fungovat.

Fotka se zpracovává.






S tímto víkendovým designem se ukázal dobrý experiment. Bylo to zajímavé

Minulý rok řekl "Gop" - je čas skočit :)
Nebo spíš udělat slibovanou recenzi běžících blinkrů.
Objednal jsem si 1 metr černé pásky WS2812B (144 LED) v silikonové trubičce, při objednávce jsem zvolil “Black 1m 144led IP67” (možná se někomu bude líbit bílá barva podkladu, takový výběr je).

Malé upozornění

Dostal jsem pásku pájenou ze dvou půlmetrových kusů. Nevýhodou je slabé místo pájení (kontakty se mohou časem zlomit) a zvětšená mezera mezi LED.
Před nákupem se informujte u prodejce

K pásce byly oboustranně připájeny troleje pro sériové spojení několika kusů, protože Nepotřeboval jsem to, pak jsem to na jedné straně drátu připájel, vše utěsnil neutrálním tmelem a navinul ještě černou elektrickou pásku.



Na sklo se připevňuje například oboustrannou průhlednou lepicí páskou.

Podrobnosti o instalaci

Plochy jsem odmastil, nejprve jsem na tubus nalepil lepicí pásku (budu tomu říkat, i když je průřez obdélníkový), odstřihl přečnívající přebytek širší pásky, okraje tuby dal do mezery mezi strop a horní části ozdobných panelů zadních sloupků (kontaktní dráty s konektorem jsem schoval za jeden panel ), vycentroval a začal tlačit na sklo a pomalu vytahoval ochrannou vrstvu pásky.
Bohužel chybí video – nebyly volné ruce pro natáčení a každý má auta jiná.
Pokud něco není jasné - zeptejte se v komentářích.
Letní tepelný test byl úspěšný - nic se neodlepovalo ani neplavalo.
Jediným negativem je mírný úhel sklonu skla, LED svítí více nahoru. Za slunečného dne je to špatně vidět, ale protože se jedná o duplicitní signály

Nyní přejděme k elektronické nádivce.
Použil jsem, ale nedávno jsem objevil

Za přibližně stejnou cenu dostaneme více buchet

Skica bez jakýchkoli úprav bude fungovat i na Wemos při programování v Arduino IDE, a pokud implementujete malý webový server, můžete po připojení k němu přes Wi-Fi měnit hodnoty proměnných, jako je např. doba zpoždění mezi bliknutími, míra zpomalení při nouzovém brzdění atd.
Zde v budoucnu, pokud by měl někdo zájem o realizaci projektu na ESP8266, mohu vložit příklad pro změnu nastavení přes webové rozhraní, uložení do EEPROM a následné čtení.
Spuštění webového serveru lze realizovat například zapnutím blinkru a sešlápnutím brzdového pedálu při zapnutém zapalování (v proceduře nastavení se dotazujte na stav příslušných vstupů).

Pro implementaci režimu blikání při prudkém brzdění byl zakoupen
Náčrt sleduje úroveň zpomalení při sešlápnutí brzdového pedálu, pokud překročí 0,5G (tvrdé zpomalení, ale žádné pískání brzd), aktivuje se na několik sekund režim blikání, aby přitáhl další pozornost.
Řídicí signály na vstupy Arduino z "plus" dorazů, směrových světel a zpátečky jsou vedeny skrz galvanická izolace- optočleny s odpory omezujícími proud, které případně tvoří LOW úroveň na vstupech Arduina (trvale taženy ke kladnému pólu přes odpory 10kΩ).
Napájení - 5 voltů přes DC-DC buck měnič.
Celé je to složené jako sendvič a zabaleno do vhodné krabice, na které jsem šipkou označil směr instalace pro správnou orientaci gravitačního čidla

Schéma a foto



Hodnota pull-up (to plus) rezistorů je standardní - 10 kOhm, proud omezující optočlenové rezistory - 1 kOhm. Ze starých desek vypadly optočleny, dva dostaly PC123, dva - PC817.


Na první fotce vidíte dva přídavné piny, dělal jsem je pro blinkry. Vzhledem k tomu, že v mém autě při zapnutí páky sloupku řízení dojde ke zkratu k zemi, zapojil jsem vodiče do bloku páky a vstupů Arduina. Pokud spínač na sloupku řízení spíná plus nebo přijímá signál z "+" žárovek levého / pravého blinkru, propojte je přes galvanické oddělení.



No a teď samotná skica (Arduino IDE)

#zahrnout #zahrnout //pár obecných poznámek // Vypnul jsem jednu z vnějších LED, protože zářily na ozdobných panelech regálů // viz tento příklad pro smyčku(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; //pak změňte cykly v bloku STOP pro (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); }

Snažil jsem se to maximálně okomentovat, ale pokud budou dotazy, pokusím se komentáře přidat (proto ho umisťuji do textu recenze, a ne jako přiložený soubor). To se mimochodem týká i dalších bodů recenze - v případě podstatných dotazů v komentářích ji také doplním.

A na závěr ukázka práce (u videa jsem použil skicu s demo režimem).

Upd. Vytvořil jsem skicu s demo režimem speciálně tak, aby se vše vešlo do jednoho krátkého videa.
Brzdové světlo bliká pouze při prudkém brzdění (to bylo psáno výše), když je plynulé a stojí v zácpě, tak jen pálí bez otravování řidičů zezadu.
Jas ve tmě není přehnaný, protože. kvůli naklonění skla jsou světla nasměrována více nahoru než dozadu.
Běžná světla fungují jako obvykle, tento pás je duplikuje.

Mám v plánu koupit +97 Přidat k oblíbeným Recenze se líbila +89 +191

Minulý rok řekl "Gop" - je čas skočit :)
Nebo spíš udělat slibovanou recenzi běžících blinkrů.
Objednal jsem si 1 metr černé pásky WS2812B (144 LED) v silikonové trubičce, při objednávce jsem zvolil “Black 1m 144led IP67” (možná se někomu bude líbit bílá barva podkladu, takový výběr je).

Malé upozornění

Dostal jsem pásku pájenou ze dvou půlmetrových kusů. Nevýhodou je slabé místo pájení (kontakty se mohou časem zlomit) a zvětšená mezera mezi LED.
Před nákupem se informujte u prodejce

K pásce byly oboustranně připájeny troleje pro sériové spojení několika kusů, protože Nepotřeboval jsem to, pak jsem to na jedné straně drátu připájel, vše utěsnil neutrálním tmelem a navinul ještě černou elektrickou pásku.



Na sklo se připevňuje například oboustrannou průhlednou lepicí páskou.

Podrobnosti o instalaci

Plochy jsem odmastil, nejprve jsem na tubus nalepil lepicí pásku (budu tomu říkat, i když je průřez obdélníkový), odstřihl přečnívající přebytek širší pásky, okraje tuby dal do mezery mezi strop a horní části ozdobných panelů zadních sloupků (kontaktní dráty s konektorem jsem schoval za jeden panel ), vycentroval a začal tlačit na sklo a pomalu vytahoval ochrannou vrstvu pásky.
Bohužel chybí video – nebyly volné ruce pro natáčení a každý má auta jiná.
Pokud něco není jasné - zeptejte se v komentářích.
Letní tepelný test byl úspěšný - nic se neodlepovalo ani neplavalo.
Jediným negativem je mírný úhel sklonu skla, LED svítí více nahoru. Za slunečného dne je to špatně vidět, ale protože se jedná o duplicitní signály

Nyní přejděme k elektronické nádivce.
Použil jsem, ale nedávno jsem objevil

Za přibližně stejnou cenu dostaneme více buchet

Skica bez jakýchkoli úprav bude fungovat i na Wemos při programování v Arduino IDE, a pokud implementujete malý webový server, můžete po připojení k němu přes Wi-Fi měnit hodnoty proměnných, jako je např. doba zpoždění mezi bliknutími, míra zpomalení při nouzovém brzdění atd.
Zde v budoucnu, pokud by měl někdo zájem o realizaci projektu na ESP8266, mohu vložit příklad pro změnu nastavení přes webové rozhraní, uložení do EEPROM a následné čtení.
Spuštění webového serveru lze realizovat například zapnutím blinkru a sešlápnutím brzdového pedálu při zapnutém zapalování (v proceduře nastavení se dotazujte na stav příslušných vstupů).

Pro implementaci režimu blikání při prudkém brzdění byl zakoupen
Náčrt sleduje úroveň zpomalení při sešlápnutí brzdového pedálu, pokud překročí 0,5G (tvrdé zpomalení, ale žádné pískání brzd), aktivuje se na několik sekund režim blikání, aby přitáhl další pozornost.
Řídící signály na vstupy Arduina z „plus“ dorazů, blinkrů a zpátečky jsou přiváděny přes galvanické oddělení - optočleny s odpory omezujícími proud, které případně tvoří LOW úroveň na vstupech Arduina (neustále tažené do plusu přes odpory 10kΩ ).
Napájení - 5 voltů přes DC-DC buck měnič.
Celé je to složené jako sendvič a zabaleno do vhodné krabice, na které jsem šipkou označil směr instalace pro správnou orientaci gravitačního čidla

Schéma a foto



Hodnota pull-up (to plus) rezistorů je standardní - 10 kOhm, proud omezující optočlenové rezistory - 1 kOhm. Ze starých desek vypadly optočleny, dva dostaly PC123, dva - PC817.


Na první fotce vidíte dva přídavné piny, dělal jsem je pro blinkry. Vzhledem k tomu, že v mém autě při zapnutí páky sloupku řízení dojde ke zkratu k zemi, zapojil jsem vodiče do bloku páky a vstupů Arduina. Pokud spínač na sloupku řízení spíná plus nebo přijímá signál z "+" žárovek levého / pravého blinkru, propojte je přes galvanické oddělení.



No a teď samotná skica (Arduino IDE)

#zahrnout #zahrnout //pár obecných poznámek // Vypnul jsem jednu z vnějších LED, protože zářily na dekorativních panelech stojanů //viz příklad této smyčky 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; //pak změňte cykly v bloku STOP pro (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); }

Snažil jsem se to maximálně okomentovat, ale pokud budou dotazy, pokusím se komentáře přidat (proto ho umisťuji do textu recenze, a ne jako přiložený soubor). To se mimochodem týká i dalších bodů recenze - v případě podstatných dotazů v komentářích ji také doplním.

A na závěr ukázka práce (u videa jsem použil skicu s demo režimem).

Upd. Vytvořil jsem skicu s demo režimem speciálně tak, aby se vše vešlo do jednoho krátkého videa.
Brzdové světlo bliká pouze při prudkém brzdění (to bylo psáno výše), když je plynulé a stojí v zácpě, tak jen pálí bez otravování řidičů zezadu.
Jas ve tmě není přehnaný, protože. kvůli naklonění skla jsou světla nasměrována více nahoru než dozadu.
Běžná světla fungují jako obvykle, tento pás je duplikuje.

Všichni, kdo viděli více či méně moderní a ne podruhé auto, a pokud šlo ještě o jízdu, už dávno pro sebe poznamenali jednu z užitečných možností... Lidé tomu říkají líný blinkr nebo zdvořilost směrovka. Celá jeho podstata spočívá v tom, že při odbočování vpravo nebo vlevo se řidič pouze jednou dotkne páčky blinkrů, aniž by ji zafixoval. To znamená, že jednoduše nechá fungovat obvody ukazatelů směru, ale nezapne stejný spínač. Výsledkem je, že po uvolnění páky ukazatele směru fungují ještě 3-4krát a řidič v tuto chvíli již může dělat své vlastní podnikání, to znamená zcela se vzdát vozovce. Tato možnost je velmi užitečná, když musíte změnit jízdní pruh. Když je páčka ukazatelů směru plně zapnutá, nedojde k automatickému vypnutí kvůli nevýznamnému úhlu natočení volantu, což znamená, že bude nutné šťouchnout tam a zpět samotným ukazatelem nebo jej neustále podpírat. s rukou na pokraji zapnutí, abyste simulovali činnost ukazatele směru. A pokud existuje taková možnost, pak se jen trochu dotkl páky a zapomněl. Obecně si myslíme, že podstata práce byla plně odhalena, ale nyní stojí za zmínku možná implementace takové možnosti na vašem stroji.

Které elektrické obvody jsou vhodné pro zdvořilý blinkr na Arduinu

Než se pustíte do všech vážných problémů s výrobou zdvořilého směrového světla, musíte pochopit, pro která schémata elektrického připojení je vhodná, aniž byste upravovali elektrický obvod v autě.
Zde jsou uvedeny dvě hlavní možnosti, které se v zásadě liší. První je, když se zapnou blinkry, když jsou připojeny jako zátěž. To znamená, že k zahrnutí dochází v důsledku přepínání obvodu směrových světel, ve kterých je umístěna samotná páka směrových světel, je to on, kdo uzavře obvod, po kterém dojde k operaci. V tomto případě nebude fungovat využít naší možnosti, protože když páka otevře okruh s lampami, okamžitě vypneme možnost světelné indikace, i když k samotné páce přijde signál, dál to prostě nejde.
Druhá možnost je naše, kdy existují řídicí signály a jsou výstupní výkonové signály. V tomto případě můžete místo běžného relé umístit pouze obvod, na který bychom vás rádi upozornili.

Reléový napájecí modul, který lze zakoupit na internetu pro řízení zátěže

Náčrt a schéma líného (slušného) blinkru na Arduinu

Takže o použití Arduina jako hlavní jednotky jako líných blinkrů lze polemizovat, protože to také není ideální řešení, které má své nevýhody. Řekněme, že po zapnutí zapalování bude nutné mít konstantní výkon, pro zajištění rychlosti bude nutné zapojit silové obvody. Samotné páskování z nepotřebných rádiových součástek je zde přitom v zásadě zbytečné, protože v tomto případě můžete mikrokontrolér jednoduše naprogramovat a používat pouze jej. Toto mínus je ale zároveň plusem, protože programovat Arduino si může dovolit každý, kdo ho má, a na mikrokontroléry budete potřebovat i programátor.
Právě napsat program bude jedním z nejtěžších úkolů. Zde bude muset začátečník strávit více než jednu hodinu svého volného času a studovat fungování algoritmů, ale naštěstí existuje internet a my ano. Takže tady je skica.

int switchPinR=8; int switchPinL=7; intledPinR=11; intledPinL=12; boolean ledOn = false; int i=0; intz=0; void setup() ( // vložte kód nastavení sem, aby se spustil jednou: pinMode(switchPinR, INPUT); pinMode(switchPinL, INPUT); pinMode(ledPinR, OUTPUT); pinMode(ledPinL, OUTPUT); Serial.begin(9600 ); ) void loop() ( // sem vložte svůj hlavní kód, aby se spouštěl opakovaně: //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; ) // Smyčka alarmu, pokud (digitalRead(switchPinR) == HIGH && digitalRead(switchPinL) = = HIGH) (goto label;) //Směrovka vpravo. 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) ( break; ) ) ) else ( digitalWrite(ledPinR, LOW); z=0; ) //Levý směrový signál. 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) ( break; ) ) ) else ( digitalWrite(ledPinL, LOW); z=0; )) )

Ve zkratce můžeme shrnout, že skica má 2 vstupy a 2 výstupy. Zároveň na vstupu kladného, ​​tedy vysoké úrovně signálu na vstupu (8.7), dostaneme určitý počet bliknutí (z nebo i) na odpovídajícím výstupu (11.12). Zkrátka něco takového. To znamená, že pokud chcete ve skice něco změnit ohledně počtu bliknutí a výstupů vstupů, věnujte pozornost těmto proměnným. Pokud bude nutné změnit délku bliknutí, pak by měla být vaše pozornost upřena na funkci zpoždění.
Další funkcí programu je poněkud neobvyklý výstup alarmu. Nejprve se vypracuje levý a pravý ukazatel a poté se zapne alarm nouzového světla. To je způsobeno tím, že se může zapnout pouze v případě, že je vstup vysoký současně na vstupech 8 a 7. A tato podmínka bude splněna až na druhý cyklus, protože stisknutí dvou tlačítek současně nebude fungovat jen fyzicky. Rychlost mikrokontroléru vám umožní rychleji přečíst vysoký výstup z některého tlačítka a rozhodnout, že je to stále podmínka pro fungování blinkru, a ne alarm. I když byste se tím neměli obtěžovat, kromě toho, že poděkovat na cestě bude problematické.

Funkce připojení líného (zdvořilého) blinkru k Arduinu v autě

Jako výstup byste neměli používat pin 13, protože při každém zapnutí a vypnutí napájení mohou indikátory, které budou připojeny k tomuto výstupu, blikat.
Při přechodu z řídicích signálů na napájecí signály použijte příslušné bloky zakoupené na internetu nebo vámi sestavené. O takových blocích – modulech jsme již mluvili.
Při příjmu signálu 1 z napětí 12 voltů umístěte před vstup rezistor 10 kΩ.

To jsou vlastně všechna slova na rozloučenou při výrobě líného blinkru pro auto na mikrokontroléru Arduino a teď asi to samé ve videu ...