Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * Irányjelző szimulátor
- *
- * A magyar jogszabályok nem teszik lehetővé a fényjelző berendezések módosítását, a gyáritól való eltérés esetén engedélyeztetni kell!
- * Tehát az ismertetésre kerülő megoldás kizárólag játék ill. demonstrációs céllal használható, engedély nélkül közúti forgalomban tilos vele részt venni!
- * Használata kizárólag saját felelősségel történhet.
- *
- * Az áramkör egy darab 1 méteres, WS2812B 60 RGB LED-es szalaggal készült. Ez van 4 részre osztva a 4 irányjelzőnek megfelelően.
- * A példa programban 1-1 irányjelző 12 LED-et tartalmaz, azért, hogy jól láthatóan el legyenek különülve, de a megvalósításkor erre nincs szükség,
- * fel lehet használni az összes LED-et.
- *
- */
- #include <Adafruit_NeoPixel.h> // A WS2812B led szalag meghajtásához szükséges könyvtár. Letölthető innen: https://github.com/adafruit/Adafruit_NeoPixel
- #define FRONT_DEFAULT_R 128 // Az alapértelmezett szín beállítása, amikor nincs bekapcsolva az irányjelző.
- #define FRONT_DEFAULT_G 128 // Ez jelen esetben elől fehér szín fél fényerővel.
- #define FRONT_DEFAULT_B 128
- #define FRONT_LEFT_START 0 // A bal első LED sor kezdete a teljes szalagon.
- #define FRONT_RIGHT_START 15 // A jobb első LED sor kezdete a teljes szalagon.
- #define REAR_DEFAULT_R 128 // Az alapértelmezett szín beállítása, amikor nincs bekapcsolva az irányjelző.
- #define REAR_DEFAULT_G 0 // Ez jelen esetben hátul piros szín fél fényerővel.
- #define REAR_DEFAULT_B 0
- #define REAR_LEFT_START 45 // A bal hátsó LED sor kezdete a teljes szalagon.
- #define REAR_RIGHT_START 30 // A jobb hátsó LED sor kezdete a teljes szalagon.
- // Figyelem! Nincs vizsgálva, hogy a LED sorok hossza és kezdő értéke alapján nem kerül-e átfedésbe valamelyik LED sor egy másikkal.
- #define FRONT_LEFT_DIRECTION 0 // Az irányjelző LED sorokon végigfutó fény iránya.
- #define FRONT_RIGHT_DIRECTION 1 // Ez a bekötéstől függ, hogy a felszereléskor ne legyen kötött a huzalozás iránya.
- #define REAR_LEFT_DIRECTION 1 // Tetszés szerinti irányban lehessen felszerelni,
- #define REAR_RIGHT_DIRECTION 0 // majd ahhoz lehet beállítani a fénysáv futásának az irányát.
- #define PLAY_R 245 // Ez az irányjelző narancs színének egy lehetséges beállítása, ha valaki nincs megelégedve vele, akkor
- #define PLAY_G 98 // itt lehet átállítani a színárnyalatot. Ez 100%-os fényerejű.
- #define PLAY_B 10
- #define PLAY_PIXEL_LONG 12 // Az irányjelző fénycsík hossza. 60 LED-es szalagnál célszerű 4*15 részre bontani.
- #define SPEED 100 // A fénycsík futásának sebessége. Az érték csökkentésével gyorsabb lesz.
- #define PAUSE 500 // 2 fénycsík közötti várakozási idő, amikor nem világít egyik LED sem. Ez jelen esetben 0,5 sec.
- #define LEFT_PIN 2 // A balra irány jelzésének bemenete.
- #define RIGHT_PIN 3 // A jobbra irány jelzésének bemenete.
- #define HSignal_PIN 4 // A vészvillogó bemenete, ilyenkor mind a 4 LED sor egyszerre működik.
- #define NC1_PIN 5 // Tervezett fejlesztéshez fenntartva, most nincs használva.
- #define PIXEL_PIN 6 // A LED szalag vezérlő jele, ide kell kötni a WS2812B szalag IN pontját.
- #define PIXEL_COUNT 60 // A WS2812B szalag LED-jeinek a száma. Ez tartalmazza mind a 4 irányjelzőt.
- Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800); // A LED sor kezelő létrehozása a programban, a megadott paraméterek szerint
- bool State = LOW; // Állapot jelző, funkciója később lesz ismertetve.
- void setup() { // A kezdeti állapotok beállításai.
- // Serial.begin(115200); // Hibakereséshez vagy nyomonkövetéshez a soros monitor bekapcsolása.
- // Serial.println("Start");
- strip.begin(); // Elindítjuk a LED szalagot, ezzel törlődik, azaz minden LED kikapcsolt állapotba kerül.
- strip.show(); // Megjelenítjük a beállított LED állapotot, ezt minden esetben meg kell tenni, hogy látszódjon is a változtatás.
- pinMode(LEFT_PIN, INPUT); // A bemenetek létrehozása
- pinMode(RIGHT_PIN, INPUT);
- pinMode(HSignal_PIN, INPUT);
- pinMode(NC1_PIN, INPUT);
- pinMode(LEFT_PIN, INPUT_PULLUP); // És a felhúzó ellenállás bekapcsolása. Ajánlott külső 1k - 10k értékű külső ellenállás használata.
- pinMode(RIGHT_PIN, INPUT_PULLUP);
- pinMode(HSignal_PIN, INPUT_PULLUP);
- pinMode(NC1_PIN, INPUT_PULLUP);
- showDefault(); // Az alapértelmezett fény megjelenítése. A programban ez az elől fehér, hátul pedig piros szín 50%-os fényerővel.
- }
- void loop() { // Maga a főprogram, mely ciklikusan hajtódik végre.
- if (digitalRead(HSignal_PIN)==LOW ) { // A vészvillogó bemenet lekérdezése.
- showHazardSignal(); // És ha aktív (negatív logika, nulla szintre kapcsolva válik aktívvá)
- }
- if (digitalRead(LEFT_PIN)==LOW ) { // A balra irány bemenet lekérdezése.
- showLEFT();
- }
- if (digitalRead(RIGHT_PIN)==LOW ) { // A jobbra irány bemenet lekérdezése.
- showRIGHT();
- }
- if (digitalRead(LEFT_PIN)==HIGH and digitalRead(RIGHT_PIN)==HIGH and digitalRead(HSignal_PIN)==HIGH and State==HIGH) { // Az alapérték megjelenítésének vizsgálata
- State=LOW; // Az állapotjelző visszaállítása, hogy ne történjen meg minden loop ciklusban az alapértékek kiírása a LED sorra, mert felesleges.
- showDefault(); // Az alap szín beállítása.
- }
- }
- void showDefault() { // Az alap szín beállításást elvégző függvény.
- for (char i=0;i<PLAY_PIXEL_LONG;i++) { // Az irányjelzők hosszának megfelelő hosszú ciklus.
- strip.setPixelColor( i+FRONT_LEFT_START, strip.Color( FRONT_DEFAULT_R, FRONT_DEFAULT_G,FRONT_DEFAULT_B ) ); // A 4 irányjelző alapszíneinek beállítás sorban
- strip.setPixelColor( i+FRONT_RIGHT_START, strip.Color( FRONT_DEFAULT_R, FRONT_DEFAULT_G,FRONT_DEFAULT_B ) );
- strip.setPixelColor( i+REAR_LEFT_START, strip.Color( REAR_DEFAULT_R, REAR_DEFAULT_G,REAR_DEFAULT_B ) );
- strip.setPixelColor( i+REAR_RIGHT_START, strip.Color( REAR_DEFAULT_R, REAR_DEFAULT_G,REAR_DEFAULT_B ) );
- }
- strip.show(); // Az értékek beírása után megjelenítjük a LED soron.
- }
- void showLEFT() { // A bal oldal irányjelzőinek a kezelésére szolgáló függvény.
- State=HIGH; // Beállítjuk az állapotjelző, hogy történt irányjelzés.
- for (char i=0;i<PLAY_PIXEL_LONG;i++) {
- strip.setPixelColor( i+FRONT_LEFT_START, strip.Color( 0, 0, 0 ) ); // Kikapcsoljuk az irányjelző LED-jeit.
- strip.setPixelColor( i+REAR_LEFT_START, strip.Color( 0, 0, 0 ) );
- }
- strip.show(); // És ezt megjelenítjük.
- for (char i=0;i<PLAY_PIXEL_LONG;i++) {
- if (FRONT_LEFT_DIRECTION) {
- strip.setPixelColor(i+FRONT_LEFT_START, strip.Color( PLAY_R, PLAY_G, PLAY_B ) ); // Majd a megfelelő irányban sorban bekapcsoljuk a futófényt.
- }
- else {
- strip.setPixelColor(PLAY_PIXEL_LONG-i+FRONT_LEFT_START-1, strip.Color( PLAY_R, PLAY_G, PLAY_B ) ); // Ez a másik irányú futófény.
- }
- if (REAR_LEFT_DIRECTION) {
- strip.setPixelColor(i+REAR_LEFT_START, strip.Color( PLAY_R, PLAY_G, PLAY_B ) );
- }
- else {
- strip.setPixelColor(PLAY_PIXEL_LONG-i+REAR_LEFT_START-1, strip.Color( PLAY_R, PLAY_G, PLAY_B ) );
- }
- strip.show();
- delay(SPEED); // A LED-ek bekapcsolása között eltelt várakozási idő.
- }
- strip.show();
- for (char i=0;i<PLAY_PIXEL_LONG;i++) {
- strip.setPixelColor( i+FRONT_LEFT_START, strip.Color( 0, 0, 0 ) ); // A futófény végén kikapcsoljuk a LED-eket.
- strip.setPixelColor( i+REAR_LEFT_START, strip.Color( 0, 0, 0 ) );
- }
- strip.show();
- delay(PAUSE); // Majd várakozunk.
- //Serial.println("LEFT END");
- }
- void showRIGHT() {
- State=HIGH;
- for (char i=0;i<PLAY_PIXEL_LONG;i++) {
- strip.setPixelColor( i+FRONT_RIGHT_START, strip.Color( 0, 0, 0 ) );
- strip.setPixelColor( i+REAR_RIGHT_START, strip.Color( 0, 0, 0 ) );
- }
- strip.show();
- for (char i=0;i<PLAY_PIXEL_LONG;i++) {
- if (FRONT_RIGHT_DIRECTION) {
- strip.setPixelColor(i+FRONT_RIGHT_START, strip.Color( PLAY_R, PLAY_G, PLAY_B ) );
- }
- else {
- strip.setPixelColor(PLAY_PIXEL_LONG-i+FRONT_RIGHT_START-1, strip.Color( PLAY_R, PLAY_G, PLAY_B ) );
- }
- if (REAR_RIGHT_DIRECTION) {
- strip.setPixelColor(i+REAR_RIGHT_START, strip.Color( PLAY_R, PLAY_G, PLAY_B ) );
- }
- else {
- strip.setPixelColor(PLAY_PIXEL_LONG-i+REAR_RIGHT_START-1, strip.Color( PLAY_R, PLAY_G, PLAY_B ) );
- }
- strip.show();
- delay(SPEED);
- }
- strip.show();
- for (char i=0;i<PLAY_PIXEL_LONG;i++) {
- strip.setPixelColor( i+FRONT_RIGHT_START, strip.Color( 0, 0, 0 ) );
- strip.setPixelColor( i+REAR_RIGHT_START, strip.Color( 0, 0, 0 ) );
- }
- strip.show();
- delay(PAUSE);
- }
- void showHazardSignal() {
- State=HIGH;
- for (char i=0;i<PLAY_PIXEL_LONG;i++) {
- strip.setPixelColor( i+FRONT_LEFT_START, strip.Color( 0, 0, 0 ) );
- strip.setPixelColor( i+REAR_LEFT_START, strip.Color( 0, 0, 0 ) );
- strip.setPixelColor( i+FRONT_RIGHT_START, strip.Color( 0, 0, 0 ) );
- strip.setPixelColor( i+REAR_RIGHT_START, strip.Color( 0, 0, 0 ) );
- }
- strip.show();
- for (char i=0;i<PLAY_PIXEL_LONG;i++) {
- if (FRONT_LEFT_DIRECTION) {
- strip.setPixelColor(i+FRONT_LEFT_START, strip.Color( PLAY_R, PLAY_G, PLAY_B ) );
- }
- else {
- strip.setPixelColor(PLAY_PIXEL_LONG-i+FRONT_LEFT_START-1, strip.Color( PLAY_R, PLAY_G, PLAY_B ) );
- }
- if (REAR_LEFT_DIRECTION) {
- strip.setPixelColor(i+REAR_LEFT_START, strip.Color( PLAY_R, PLAY_G, PLAY_B ) );
- }
- else {
- strip.setPixelColor(PLAY_PIXEL_LONG-i+REAR_LEFT_START-1, strip.Color( PLAY_R, PLAY_G, PLAY_B ) );
- }
- if (FRONT_RIGHT_DIRECTION) {
- strip.setPixelColor(i+FRONT_RIGHT_START, strip.Color( PLAY_R, PLAY_G, PLAY_B ) );
- }
- else {
- strip.setPixelColor(PLAY_PIXEL_LONG-i+FRONT_RIGHT_START-1, strip.Color( PLAY_R, PLAY_G, PLAY_B ) );
- }
- if (REAR_RIGHT_DIRECTION) {
- strip.setPixelColor(i+REAR_RIGHT_START, strip.Color( PLAY_R, PLAY_G, PLAY_B ) );
- }
- else {
- strip.setPixelColor(PLAY_PIXEL_LONG-i+REAR_RIGHT_START-1, strip.Color( PLAY_R, PLAY_G, PLAY_B ) );
- }
- strip.show();
- delay(SPEED);
- }
- strip.show();
- for (char i=0;i<PLAY_PIXEL_LONG;i++) {
- strip.setPixelColor( i+FRONT_LEFT_START, strip.Color( 0, 0, 0 ) );
- strip.setPixelColor( i+REAR_LEFT_START, strip.Color( 0, 0, 0 ) );
- strip.setPixelColor( i+FRONT_RIGHT_START, strip.Color( 0, 0, 0 ) );
- strip.setPixelColor( i+REAR_RIGHT_START, strip.Color( 0, 0, 0 ) );
- }
- strip.show();
- delay(PAUSE);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement