You Tube • FAQ •  Szukaj •  Zarejestruj się •  Zaloguj się 




Obecny czas: 28 Mar 2024, 15:59

Wszystkie czasy w strefie UTC + 1 godzina (czas letni)




Napisz nowy temat Odpowiedz  [ 121 posty(ów) ]  Idź do strony Poprzednia  1, 2, 3, 4, 5  Następna
Autor Wiadomość
 
 Post #848374 Wysłany: 18 Cze 2019, 22:10; 
 Temat postu: Re: Grande Punto CAN BUS (Can-A/Can-B) - Arduino + Shield
Offline
Puntoświr

Imię: Krzych
Samochód: Grande Punto 3d
Silnik: 1.3 90KM mJTD
Paliwo: ON
Wersja: Sporting
Województwo: śląskie [S]
Miejscowość: Tarnowskie Góry
Rejestracja: 06 Lut 2012,
Posty: 813
Pomógł: 11
misci napisał(a):
CAN odpalony pomiędzy dwoma mikrokontrolerami. Już rozmawiają ze sobą. Jeśli możecie to przypomnijcie mi szybkość magistral w Punto.

wolniejsza 50kbps a szybsza 500kbps


Góra
 Profil  
 

 
 Post #848380 Wysłany: 19 Cze 2019, 13:37; 
 Temat postu: Re: Grande Punto CAN BUS (Can-A/Can-B) - Arduino + Shield
Offline
Puntoświr
Awatar użytkownika

Samochód: Punto Evo 3d
Silnik: 1.4 8V 77KM
Paliwo: Benzyna + LPG
Wersja: MyLive
Województwo: śląskie [S]
Rejestracja: 22 Paź 2014,
Posty: 834
Pomógł: 27
Dzięki. Moja właśnie pracuje na 500kbps. Jak będę miał trochę czasu to sprzęt zapakuję do wtyczki.
P. S. Nabyłem Vgate iCar Pro (ELM327 na BT). Zastanawiam się nad podłączeniem tego interface do terminala w telefonie. Wiem, że do sprawdzenia czy zadziała wystarczy kilka minut, ale zapytam czy próbowaliście takiego połączenia?


Góra
 Profil  
 
 
 Post #849194 Wysłany: 09 Sie 2019, 20:50; 
 Temat postu: Re: Grande Punto CAN BUS (Can-A/Can-B) - Arduino + Shield
Offline
Puntoświr

Imię: Krzych
Samochód: Grande Punto 3d
Silnik: 1.3 90KM mJTD
Paliwo: ON
Wersja: Sporting
Województwo: śląskie [S]
Miejscowość: Tarnowskie Góry
Rejestracja: 06 Lut 2012,
Posty: 813
Pomógł: 11
Mały update, Arduino siedzi w aucie od około 1,5miesiąca, może nawet 2, ma się dobrze, jak narazie żadnych poważnych (niepoważnych przygód nie było).

Zabrałem się w końcu za TripLinka który trochę przyprawił kłopotów w implementacji, ale ostatecznie wyszło całkiem spoko, wrzucam zupełnie na świeżo rezultat.
https://www.youtube.com/watch?v=fuipPnYVFsk

Cała zabawa to odczyt z lini Can-Bus bitu reprezentującego mruganie lewego i prawego kierunkowskazu na zegarach a następnie zamiana tej informacji na czasowe zwarcie przekaźników odpowiadających za konkretny kierunkowskaz.
Czyli naśladujemy fizyczne zwarcie obwodu ta jak robi to oryginalnie manetka kierunkowskazu.


Załączniki:


Góra
 Profil  
 
 
 Post #849201 Wysłany: 10 Sie 2019, 09:07; 
 Temat postu: Re: Grande Punto CAN BUS (Can-A/Can-B) - Arduino + Shield
Offline
Puntoświr
Awatar użytkownika

Samochód: Punto Evo 3d
Silnik: 1.4 8V 77KM
Paliwo: Benzyna + LPG
Wersja: MyLive
Województwo: śląskie [S]
Rejestracja: 22 Paź 2014,
Posty: 834
Pomógł: 27
... a mój temat leży z braku czasu :(.

Co do twojego pomysłu to jest całkiem ok. ale ogranicz liczbę błysków góra do trzech. Moje auto ma tą funkcję w standardzie i jak przez przypadek zahaczę o manetkę to miga aż 5 razy, co trwa długo i może zmylić innych kierowców. Za pierwszym razem myślałem, że mi się kierunkowskaz zepsuł.


Góra
 Profil  
 
 
 Post #849202 Wysłany: 10 Sie 2019, 09:52; 
 Temat postu: Re: Grande Punto CAN BUS (Can-A/Can-B) - Arduino + Shield
Offline
Puntoświr

Imię: Krzych
Samochód: Grande Punto 3d
Silnik: 1.3 90KM mJTD
Paliwo: ON
Wersja: Sporting
Województwo: śląskie [S]
Miejscowość: Tarnowskie Góry
Rejestracja: 06 Lut 2012,
Posty: 813
Pomógł: 11
misci napisał(a):
Co do twojego pomysłu to jest całkiem ok. ale ogranicz liczbę błysków góra do trzech. Moje auto ma tą funkcję w standardzie i jak przez przypadek zahaczę o manetkę to miga aż 5 razy, co trwa długo i może zmylić innych kierowców. Za pierwszym razem myślałem, że mi się kierunkowskaz zepsuł.


No własnie... do tej pory nie wiedzialem jaki jest standard ;)
Czyli w nowszych punto i EVO przytrzymanie dzwigienki daje mrugniecie x5 ?

Na ten moment u mnie jeden blysk daje wywolanie i dokladam kolejne 3 od siebie, razem cztery.
Potestuje to troche i w razie czego utne ten czwarty blysk.

Dodatkowe pytanie... jak dziala w EVO wyzwolenie awaryjnych swiatel przy gwaltownym chamowaniu (tzw. ABL lub ESS)?
Awaryjne aktywuja sie po calkowitym zatrzymaniu auta? czy juz w trakcie samego hamowania?
Jak dlugo mrugaja? Same przestaja czy trzeba je recznie wylaczyc?


Góra
 Profil  
 
 
 Post #849208 Wysłany: 10 Sie 2019, 14:18; 
 Temat postu: Re: Grande Punto CAN BUS (Can-A/Can-B) - Arduino + Shield
Grande miga mi kierunkowskazem 4 razy po draśnięciu manetki (i można to odwołać klikając w przeciwną stronę).

Awaryjne mrugają same przy gwałtownym hamowaniu (ale od pewnej prędkości wzwyż, przy powolnych testach hamulców np. na śliskiej drodze i 30-40 km/h, funkcja nie działa), w trakcie hamowania (ale coś jakby pod koniec lub w połowie manewru, nie "od razu").
Chyba (nie pamiętam) same przestają.


Góra
  
 
 
 Post #849243 Wysłany: 11 Sie 2019, 09:02; 
 Temat postu: Re: Grande Punto CAN BUS (Can-A/Can-B) - Arduino + Shield
Offline
Moderator
Awatar użytkownika

Imię: Adam
Samochód: Punto Evo 5d
Silnik: 1.4 8V 77KM
Paliwo: Benzyna + LPG
Wersja: Estiva Blue&Me
Województwo: łódzkie [E]
Miejscowość: Łódź
Rejestracja: 17 Kwi 2010,
Posty: 1264
Pomógł: 11
pmx007p1 napisał(a):
Awaryjne mrugają same przy gwałtownym hamowaniu (ale od pewnej prędkości wzwyż, przy powolnych testach hamulców np. na śliskiej drodze i 30-40 km/h, funkcja nie działa), w trakcie hamowania (ale coś jakby pod koniec lub w połowie manewru, nie "od razu").
Chyba (nie pamiętam) same przestają.


Awaryjne podczas mocnego hamowania działają od prędkości 50km/h, jak odpuścisz hamulec wtedy przestają mrugać :D

_________________
MOJE PUNTO EVO http://fiatpunto.com.pl/topic55029.html
MOJA BYŁE GP http://fiatpunto.com.pl/topic45699.html


Góra
 Profil  
 
 
 Post #849256 Wysłany: 11 Sie 2019, 22:12; 
 Temat postu: Re: Grande Punto CAN BUS (Can-A/Can-B) - Arduino + Shield
Offline
Puntoświr

Imię: Krzych
Samochód: Grande Punto 3d
Silnik: 1.3 90KM mJTD
Paliwo: ON
Wersja: Sporting
Województwo: śląskie [S]
Miejscowość: Tarnowskie Góry
Rejestracja: 06 Lut 2012,
Posty: 813
Pomógł: 11
Hmm... mam to zrobione u siebie od miesiąca ale nie do końca to mruganie awaryjnymi mnie satysfakcjonuje.

Z tego co widzę na drogach to nowe auta maja to dwu etapowo:
- ostre hamowanie -> duża częstotliwość mrugania trzeciego światła stopu
- po zatrzymaniu -> stopy świecą światłem ciągłym a zaczynają mrugać awaryjne

A gdy w trakcie jazdy chcemy tylko ostro dohamować (a nie całkowicie się zatrzymać), to poprzestajemy na migotaniu stopami.


Góra
 Profil  
 
 
 Post #849265 Wysłany: 12 Sie 2019, 20:04; 
 Temat postu: Re: Grande Punto CAN BUS (Can-A/Can-B) - Arduino + Shield
Offline
Puntoświr
Awatar użytkownika

Samochód: Punto Evo 3d
Silnik: 1.4 8V 77KM
Paliwo: Benzyna + LPG
Wersja: MyLive
Województwo: śląskie [S]
Rejestracja: 22 Paź 2014,
Posty: 834
Pomógł: 27
Moje Qubo miga 3x.


Góra
 Profil  
 
 
 Post #849420 Wysłany: 23 Sie 2019, 15:07; 
 Temat postu: Re: Grande Punto CAN BUS (Can-A/Can-B) - Arduino + Shield
Offline
Puntoświr

Samochód: Grande Punto 5d
Silnik: 1.4 8V 77KM
Paliwo: Benzyna
Województwo: małopolskie [K]
Rejestracja: 13 Gru 2016,
Posty: 193
W których Grande jest fabrycznie 3-krotne mruganie kierunku po 1x "puknięciu" w manetkę :?:

Mam Grande z 2008 i kierunek mrugnie tylko 1x po puknięciu w manetkę, co prawdę mówiąc strasznie mnie "w...a", bo myślałem że nabyłem w miarę nowoczesne auto, ale w miarę używania coraz bardziej przekonuję się do słynnej tezy, że nie kupuje się aut na F ...
:D


Góra
 Profil  
 
 
 Post #849434 Wysłany: 23 Sie 2019, 22:44; 
 Temat postu: Re: Grande Punto CAN BUS (Can-A/Can-B) - Arduino + Shield
W których? Zależy od wersji, rocznika, i pewnie coś jeszcze.
Do tego ludzie sami robili przeróbki, oprogramowanie i/lub sprzęt (np. dokładanie Blue&Me).


Góra
  
 
 
 Post #849441 Wysłany: 24 Sie 2019, 00:16; 
 Temat postu: Re: Grande Punto CAN BUS (Can-A/Can-B) - Arduino + Shield
Offline
Puntoświr

Imię: Krzych
Samochód: Grande Punto 3d
Silnik: 1.3 90KM mJTD
Paliwo: ON
Wersja: Sporting
Województwo: śląskie [S]
Miejscowość: Tarnowskie Góry
Rejestracja: 06 Lut 2012,
Posty: 813
Pomógł: 11
pmx007p1 napisał(a):
W których? Zależy od wersji, rocznika, i pewnie coś jeszcze.
Do tego ludzie sami robili przeróbki, oprogramowanie i/lub sprzęt (np. dokładanie Blue&Me).

Nie, nie, nie... a przeróbki przeróbkami ;)

TripLink był w standardzie od modelu 4C po zmianie elektryki czyli od października 2008.
Pierwsze modele 2Y oraz 4C ale przed liftem elektryki tego nie maja.
Rozgraniczeniem jest lift instalacji elektrycznej z października 2008.


Góra
 Profil  
 
 
 Post #849454 Wysłany: 25 Sie 2019, 14:36; 
 Temat postu: Re: Grande Punto CAN BUS (Can-A/Can-B) - Arduino + Shield
Offline
Puntoświr

Samochód: Grande Punto 5d
Silnik: 1.4 8V 77KM
Paliwo: Benzyna
Województwo: małopolskie [K]
Rejestracja: 13 Gru 2016,
Posty: 193
... to mam podwójnego pecha - raz że kupiłem makaroniarską myśl techniczną, a dwa że sprzed października 2008.
:D :D :D


Góra
 Profil  
 
 
 Post #849657 Wysłany: 07 Wrz 2019, 12:49; 
 Temat postu: Re: Grande Punto CAN BUS (Can-A/Can-B) - Arduino + Shield
Offline
Puntoświr

Imię: Krzych
Samochód: Grande Punto 3d
Silnik: 1.3 90KM mJTD
Paliwo: ON
Wersja: Sporting
Województwo: śląskie [S]
Miejscowość: Tarnowskie Góry
Rejestracja: 06 Lut 2012,
Posty: 813
Pomógł: 11
Taki mały spoiler z tego co się dzieje...
https://www.youtube.com/watch?v=cIjdctL2HgY


Załączniki:

Góra
 Profil  
 
 
 Post #849660 Wysłany: 07 Wrz 2019, 17:25; 
 Temat postu: Re: Grande Punto CAN BUS (Can-A/Can-B) - Arduino + Shield
Offline
Puntoświr
Awatar użytkownika

Samochód: Punto Evo 3d
Silnik: 1.4 8V 77KM
Paliwo: Benzyna + LPG
Wersja: MyLive
Województwo: śląskie [S]
Rejestracja: 22 Paź 2014,
Posty: 834
Pomógł: 27
Mój projekt stoi z braku czasu.
Prosiłbym o informację na której magistrali występują te dane?
Czy można by było prosić o wykaz opanowanych ID wraz z interpretacją znaczenia danych? Gdzież czytałem, że dane mogą mieć poprzestawiane bajty.
Szacun za wytrwałość.
Ogólnie rozumiem, że sterownik czyta dane z magistrali (magistral) i kieruje je do wyświetlacza licznika.


Góra
 Profil  
 
 
 Post #849661 Wysłany: 07 Wrz 2019, 17:30; 
 Temat postu: Re: Grande Punto CAN BUS (Can-A/Can-B) - Arduino + Shield
Offline
Puntoświr
Awatar użytkownika

Imię: Radek
Samochód: Grande Punto 3d
Silnik: Inny
Paliwo: Benzyna + LPG
Wersja: Dynamic
Województwo: śląskie [S]
Rejestracja: 19 Sie 2017,
Posty: 695
Pomógł: 2
misci, Nie, dane latają po szynie CAN i odbiornik(Wyświetlacz) odczytuje to co potrzebuje.


Góra
 Profil  
 
 
 Post #849673 Wysłany: 08 Wrz 2019, 14:26; 
 Temat postu: Re: Grande Punto CAN BUS (Can-A/Can-B) - Arduino + Shield
Offline
Puntoświr

Imię: Krzych
Samochód: Grande Punto 3d
Silnik: 1.3 90KM mJTD
Paliwo: ON
Wersja: Sporting
Województwo: śląskie [S]
Miejscowość: Tarnowskie Góry
Rejestracja: 06 Lut 2012,
Posty: 813
Pomógł: 11
radex324, w sumie nie wiem dlaczego tak to zinterpretowałeś? ;)
misci, tak, jest tak jak to napisałeś, Arduino robi odczyt z magistrali (te dane akurat z tej szybkiej) i wysyła je z powrotem na magistrale (w tym wypadku na tą wolną) w takiej postaci żeby LCD je wyświetliło.


Góra
 Profil  
 
 
 Post #849682 Wysłany: 08 Wrz 2019, 20:37; 
 Temat postu: Re: Grande Punto CAN BUS (Can-A/Can-B) - Arduino + Shield
Offline
Puntoświr
Awatar użytkownika

Samochód: Punto Evo 3d
Silnik: 1.4 8V 77KM
Paliwo: Benzyna + LPG
Wersja: MyLive
Województwo: śląskie [S]
Rejestracja: 22 Paź 2014,
Posty: 834
Pomógł: 27
Jeszcze przypomnę prośbę o interpretację znanych koledze ramek. Chodzi głównie o parametry pracy silnika. Mam LPG i potrzebowałbym monitorować korektę długo i krótko terminową, czas wtrysku, prędkość obrotową silnika, podciśnienie w dolocie.
Domyślam się, że kolega podłączył się do magistral poprzez złącze diagnostyczne. Sam sprzęt sobie ogarnę. Będzie to kontroler z wyświetlaczem i kartą pamięci. Sprzęt by się przydał, bo od czasu do czasu silnik zachowuje się trochę nieładnie. Analiza ww danych pozwoliłaby mi zdiagnozować losowo pojawiające się usterki. A może moja twórczość przydałaby się innym. Idzie ku zimie więc czasu do zabawy będzie więcej.


Góra
 Profil  
 
 
 Post #849684 Wysłany: 08 Wrz 2019, 22:36; 
 Temat postu: Re: Grande Punto CAN BUS (Can-A/Can-B) - Arduino + Shield
Offline
Puntoświr

Imię: Krzych
Samochód: Grande Punto 3d
Silnik: 1.3 90KM mJTD
Paliwo: ON
Wersja: Sporting
Województwo: śląskie [S]
Miejscowość: Tarnowskie Góry
Rejestracja: 06 Lut 2012,
Posty: 813
Pomógł: 11
misci, pytasz o dane które są dostępne w trybie serwisowym, czyli wysyłasz ramki pytające i dostajesz ramki z odpowiedzią... nie ogarniałem tego podejścia w ogóle póki co.
Na ten moment z tej szybkiej magistrali mam zidentyfikowane dosłownie dwa parametry, pozycja przepustnicy i doladowanie.
Zaczniesz coś grzebać to będę podpowiadał, natomiast otwartego kodu na razie nie udostępniam, choć... może i ku potomności jak zmienię samochód to wrzucę tutaj wszystko co mam.


Góra
 Profil  
 
 
 Post #849688 Wysłany: 09 Wrz 2019, 07:22; 
 Temat postu: Re: Grande Punto CAN BUS (Can-A/Can-B) - Arduino + Shield
Offline
Puntoświr
Awatar użytkownika

Samochód: Punto Evo 3d
Silnik: 1.4 8V 77KM
Paliwo: Benzyna + LPG
Wersja: MyLive
Województwo: śląskie [S]
Rejestracja: 22 Paź 2014,
Posty: 834
Pomógł: 27
Wbrew pozorom to dobra wiadomość. To znaczy, że mogę podejrzeć co dzieje się na magistrali z podłączonym MES'em włączając i wyłączając kolejne parametry i identyfikując ramki, które się pojawiają i znikają. Dość łatwo też identyfikować ramki pytające. Tylko czasu, czasu mało.


Góra
 Profil  
 
 
 Post #849689 Wysłany: 15 Lip 2020, 20:02; 
 Temat postu: Re: Grande Punto CAN BUS (Can-A/Can-B) - Arduino + Shield
Offline
Puntoświr

Imię: Krzych
Samochód: Grande Punto 3d
Silnik: 1.3 90KM mJTD
Paliwo: ON
Wersja: Sporting
Województwo: śląskie [S]
Miejscowość: Tarnowskie Góry
Rejestracja: 06 Lut 2012,
Posty: 813
Pomógł: 11
misci napisał(a):
Wbrew pozorom to dobra wiadomość. To znaczy, że mogę podejrzeć co dzieje się na magistrali z podłączonym MES'em włączając i wyłączając kolejne parametry i identyfikując ramki, które się pojawiają i znikają. Dość łatwo też identyfikować ramki pytające. Tylko czasu, czasu mało.

Tak, potwierdzam.
Ja robiłem taki próbny odczyt mając włączony monitoring sieci i MES'a i wtedy faktycznie dokładnie widać na jakie adresy trzeba wysłać zapytanie i z jakiego adresu przychodzi odpowiedź.

[ Dodano: 15 Lip 2020 19:02 ]

Temat chyba umarł... liczyłem że znajdzie się tu kilka osób które same coś podziałają na bazie przekazanych przeze mnie informacji.
Żeby temat nie umarł tak całkiem, to ku potomności wrzucam cały swój dotychczasowy kod źródłowy.
W całości się nikomu nie przyda, ale poszczególne kawałki będą na pewno pomocne.
Na zdrowie :!:

Można sobie to skopiować i zrobić z tego plik *.ino czyli plik jaki rozpozna Arduino IDE.

Kod:
//Autor który zlepił to w całość: KRZYSZTOF ZYZIK, zyzik.krzysztof@gmail.com
//Jestem autorem tylko części kodu, większość głównych trików programowych to zlepki różnych przykładów
//znalezionych w necie, typu obsluga ADXL345, NEOPIXELS, ODCZYT/WYSYŁ RAMEK CAN czy obsługa programowych TIMERÓW
//KOD NAPISANY POD ARDUINO MEGA2560 wraz z dwoma nalozonymi na niego SHIELDAMI CAN oraz akcelerometr ADXL345,
//auto ma też kilka niestandardowych dodatków wiec nie jest to kod typu Plug&Play, koniecznie trzeba to zaadaptować
//2020.07.14


//Biblioteki
#include <mcp_can.h>            //CAN Bus Shield Compatibility Library
#include <SPI.h>                //CAN Bus Shield SPI Pin Library
//#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_ADXL345_U.h>
#include <Adafruit_NeoPixel.h>
#include <Timers.h>

#ifdef __AVR__
#include <avr/power.h>
#endif

#define PINa  22 //pin danych diody pasa 1 - pas kierowcy - czujka pin 40 (kontaktron)
#define PINb  25 //pin danych diody pasa 3 - tylny pas pasazera pasazera - steruje pin 43 (zapinka)
#define PINc  24 //pin danych diody pasa 2 - tylny pas pasazera kierowcy - steruje pin 42 (zapinka)
#define PINd  23 //pin danych diody pasa 4 - pas pasazera - czujka pin 41 (kontaktron)
#define PINe  30 //pin danych podswietlenia nog kierowcy
#define PINf  31 //pin danych podswietlenia nog pasazera

Adafruit_NeoPixel pixels1 = Adafruit_NeoPixel(1, PINa, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel pixels2 = Adafruit_NeoPixel(1, PINb, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel pixels3 = Adafruit_NeoPixel(1, PINc, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel pixels4 = Adafruit_NeoPixel(1, PINd, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel pixelsKIE = Adafruit_NeoPixel(10, PINe, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel pixelsPAS = Adafruit_NeoPixel(10, PINf, NEO_GRB + NEO_KHZ800);

int delayval = 10; //delay tylko dla petli obslugujacej NEOPIXELE
int i = 1;  //krok w pętli gaszącej/zaświecającej wskazniki pasow
int a = 20; //max jasnosc NeoPixels do wskaznika pasow

int white = 75; //max jasnosc podswietlenia bialego nog
int orange = 5; //bazowa jasnosc podswietlenia pomaranczowego nog, odczyt z CAN definiuje poziom tej jesnosci
int stanDRZWI = 0;

boolean flag1 = false; //flaga gwarntujaca wykonanie funkcji 1 raz
boolean flag2 = false; //flaga gwarntujaca wykonanie funkcji 1 raz
boolean flag3 = false; //flaga gwarntujaca wykonanie funkcji 1 raz
boolean flag4 = false; //flaga gwarntujaca wykonanie funkcji 1 raz
boolean pas1 = false;
boolean pas2 = false;
boolean pas3 = false;
boolean pas4 = false;
boolean stanPas1 = false;
boolean stanPas2 = false;
boolean stanPas3 = false;
boolean stanPas4 = false;

//zmienne pod oczyty linii CAN 50kbps
boolean bRPM = false;
boolean bVspeed = false;
boolean bKeyIn = false;
boolean bLEDpasy = false;
byte HbyteSpeed = 0x00;
byte newHbyteSpeed = 0x00;
byte LbyteSpeed = 0x00;
byte newLbyteSpeed = 0x00;
byte SpeedRef = 0x00;
byte SpeedDiff = 0x00;

//zmienne pod oczyty linii CAN 500kbps
byte boostValue = 0x00;
byte NEWboostValue = 0x00;
byte throttle = 0x00;
byte NEWthrottle = 0x00;

//zmienne i timery pod ADVANCED MODE
Timer TimerBUTTON; //glowny timer odczytujacy co 200ms czy jakikolwiek guzik byl wklikniety
Timer TimerAMode;  //timer pokazujacy nazwe trybu: ADVANCED MODE
Timer TimerACC;
Timer TimerBOOST;
Timer TimerTHROTTLE;
Timer TimerONETOUCH;
Timer TimerLastFrame;
int zmienna = 0;
int MODEstate = 0;
int lastMODEstate = 0;
int MODEcounter = 10;
boolean MODE_ACTIVE = false;
int UPstate = 0;
int lastUPstate = 0;
int DOWNstate = 0;
int lastDOWNstate = 0;
int UPDOWNcounter = 0;
int lastUPDOWNcounter = 0;
long tick = 250;


/* Assign a unique ID to this sensor at the same time */
Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(12345);

//-------------------------------------------------------------------------------
const int SPI_CS_PINslow = 10;
MCP_CAN CANslow(SPI_CS_PINslow);  // Set CS pin for 50kbps
unsigned char lenSlow = 0;        //odczyt lini CANslow
byte bufferSlow[8];               //bufor odczytu lini CANslow

const int SPI_CS_PINfast = 9;
MCP_CAN CANfast(SPI_CS_PINfast);  // Set CS pin for 500kbps
unsigned char lenFast = 0;        //odczyt lini CANfast
byte bufferFast[8];               //bufor odczytu lini CANfast
//-------------------------------------------------------------------------------

//zmienne do odczytu ACC
int accVal = 0;
float fAccVal = 0;


unsigned long aktualnyCzas = 0;
unsigned long poprzedniCzas = 0;
unsigned long PITofLastACCread = 0;
boolean wystapiloACC = false;
boolean wystapiloACC2 = false;
boolean wystapiloACC3 = false;
int v = 0;
unsigned long previousMillisEXIT = 0;


// zmienna pomocnicza do poprwnego sterowania modulem zamykania lusterek
int licznikDrzwi = 0;

// timery pod aktywacje systemu ABS / ESS
boolean bHazardLight = false;
boolean stanbHazardLight = false;
int CountH = 0;
Timer TimerHazardLights;
Timer TimerHazardLightsCheck1;
Timer TimerHazardLightsCheck2;
Timer TimerHazardLightsCheck3;
Timer TimerHazardLightsCheck4;
Timer TimerHazardLightsEnd;
int ledState = LOW;                // ledState used to set the LED
const int blink_interval = 80;     // interval at which to blink

// timer wygaszajacy podswietlenie zapiecia pasow i podswietlenie pod nogami
Timer TimerOFF;

// SEKCJA ZMIENNYCH DLA FUNKCJI "ONE-TOUCH BLINKER" zwanej też "TRIPLINK"
unsigned long PITofStartBlinkerImpulse = 0;
unsigned long ImpulseLength = 0;
boolean BlinkerStartPermision = false;
boolean BlinkerEndPermision = false;
boolean bMigaLewy = false;
boolean bMigaPrawy = false;
boolean stanbMigaPrawy = false;
boolean stanbMigaLewy = false;
byte state = 0x00;
int CountL = 0;
int CountR = 0;
unsigned long PITOfLastChange = 0;
unsigned long PITforBlinkerEnd = 0;
unsigned long diff = 0;
unsigned long BlinkLength = 990;


// SEKCAJ ZMIENNYCH I TIMEROW DO WYSYLANIA RAMEK CAN
int CANinterval = 10;

Timer tCanSend81;
Timer tCanSend82;
Timer tCanSend83;
Timer tCanSend84;
Timer tCanSend85;

boolean send81 = true;
boolean send82 = true;
boolean send83 = true;
boolean send84 = true;
boolean send85 = true;

byte DataToSend81[8] = {0, 0, 0, 0, 0, 0, 0, 0};
unsigned long address81 = 0;
byte DataToSend82[8] = {0, 0, 0, 0, 0, 0, 0, 0};
unsigned long address82 = 0;
byte DataToSend83[8] = {0, 0, 0, 0, 0, 0, 0, 0};
unsigned long address83 = 0;
byte DataToSend84[8] = {0, 0, 0, 0, 0, 0, 0, 0};
unsigned long address84 = 0;
byte DataToSend85[8] = {0, 0, 0, 0, 0, 0, 0, 0};
unsigned long address85 = 0;

//rozpoznawanie LOCKED/UNLOCED
int newline1 = 0;
int newline2 = 0;
int line1 = 0;
int line2 = 0;
boolean LOCK = false;
boolean tempLOCK = false;
int tempDOORstate = 0;
Timer tLOCKpreStart;
Timer tLOCKstart;
Timer tLOCKmid;
Timer tLOCKend;

//------------------------------------------------------------------------------------------------------

void setup() {
#ifndef ESP8266
  while (!Serial); // for Leonardo/Micro/Zero
#endif

  pinMode(44, OUTPUT);    //output na TransOptor
  digitalWrite(44, LOW);  //TransOptor od razu zainicjalizowany jako wylaczony

  pinMode(46, OUTPUT);    //output na TransOptor
  digitalWrite(46, LOW);  //TransOptor od razu zainicjalizowany jako wylaczony
  pinMode(47, OUTPUT);    //output na TransOptor
  digitalWrite(47, LOW);  //TransOptor od razu zainicjalizowany jako wylaczony

  pinMode(16, OUTPUT); //output na przekaznik zwierajacy obwod domykanych lusterek, wpiety w wyjscia NO (normalnie otwarte)
  digitalWrite(16, HIGH); //przekaznik natywnie ustawiony w pozycji HIGH, pozostawia nozki zwarte
  pinMode(17, OUTPUT); //output na przekaznik zwierajacy obwod domykanych lusterek, wpiety w wyjscia NO (normalnie otwarte)
  digitalWrite(17, HIGH); //przekaznik natywnie ustawiony w pozycji HIGH, pozostawia nozki zwarte
  pinMode(18, OUTPUT); //output na przekaznik zwierajacy obwod domykanych lusterek, wpiety w wyjscia NO (normalnie otwarte)
  digitalWrite(18, HIGH); //przekaznik natywnie ustawiony w pozycji HIGH, pozostawia nozki zwarte

  pinMode(40, INPUT_PULLUP); //wejście do testowania LEDa pasow, uzyc kontaktrona
  pinMode(41, INPUT_PULLUP); //wejście do testowania LEDa pasow, uzyc kontaktrona
  pinMode(42, INPUT_PULLUP); //wejście do testowania LEDa pasow, uzyc zapinki z AlfyMito
  pinMode(43, INPUT_PULLUP); //wejście do testowania LEDa pasow, uzyc zapinki z AlfyMito

  Serial.begin(115200); // Inicjalizacja komunikacji przez port szeregowy

  while (CAN_OK != CANslow.begin(CAN_50KBPS)) {    // Fiat CANBUS A/B: baudrate = 50k
    Serial.println("CANBUSslow Shield init failed");
    //Serial.println("Init CAN BUS Shield again");
    delay(100); // Retry each 1000ms
  }
  Serial.println("CANBUSslow Shield init success!");

  while (CAN_OK != CANfast.begin(CAN_500KBPS)) {    // Fiat CANBUS L/H: baudrate = 500k
    Serial.println("CANBUSfast Shield init failed");
    //Serial.println("Init CAN BUS Shield again");
    delay(100); // Retry each 1000ms
  }
  Serial.println("CANBUSfast Shield init success!");


  //Initialise the ADXL345 sensor
  if (!accel.begin())
  {
    // There was a problem detecting the ADXL345 ... check your connections
    Serial.println("Ooops, no ADXL345 detected ... Check your wiring!");
    while (100);
  }

  // Set the range to whatever is appropriate for your project
  // accel.setRange(ADXL345_RANGE_16_G);
  // accel.setRange(ADXL345_RANGE_8_G);
  // accel.setRange(ADXL345_RANGE_4_G);
  accel.setRange(ADXL345_RANGE_2_G);

  // This initializes the NeoPixel library, define pixels colours and light them up
  pixels1.begin();
  pixels2.begin();
  pixels3.begin();
  pixels4.begin();
  pixelsKIE.begin();
  pixelsPAS.begin();

  pixels1.setPixelColor(0, pixels1.Color(a, 0, 0));
  pixels2.setPixelColor(0, pixels2.Color(a, 0, 0));
  pixels3.setPixelColor(0, pixels3.Color(a, 0, 0));
  pixels4.setPixelColor(0, pixels4.Color(a, 0, 0));
  pixelsKIE.setPixelColor(0, pixelsKIE.Color(orange, orange / 5, 0) );
  pixelsPAS.setPixelColor(0, pixelsPAS.Color(orange, orange / 5, 0) );

  pixels1.show();
  pixels2.show();
  pixels3.show();
  pixels4.show();
  pixelsKIE.show();
  pixelsPAS.show();

  TimerBUTTON.begin(100); //Zainicjalizowany timer sprawdzajacy klikniety guzik wywolujacy ekranowe Advance Mode
 
  Serial.println("firmware: 78.0.0");
}

void loop() {
  aktualnyCzas = millis();

  sensors_event_t event;
  accel.getEvent(&event);

  //odczyc ACC co 25ms
  if (aktualnyCzas - PITofLastACCread >= 25UL ) {
    PITofLastACCread = aktualnyCzas;
    accVal = event.acceleration.x;
    fAccVal = event.acceleration.x;
  }

  // Display the results (acceleration is measured in m/s^2)
  //Serial.print("X: "); Serial.println(event.acceleration.x); //Serial.print("  ");
  //Serial.print("Y: "); Serial.print(event.acceleration.y); Serial.print("  ");
  //Serial.print("Z: "); Serial.print(event.acceleration.z); Serial.print("  ");Serial.println("m/s^2 ");
  //delay(50);


  //############################################# DOBRY KOD - ZWIERA ODCZYT CAN 50kbps #######################################
  if (CANslow.checkReceive() == CAN_MSGAVAIL) {
    CANslow.readMsgBuf(&lenSlow, bufferSlow);
    unsigned long id = CANslow.getCanId();

    // SEKCJA KONTROLUJACA JASNOSC PODSWIETLENIA ZGODNIE Z JASNOSCIA USTAWIONA NA ZEGARACH
    if (id == 0x06314003) {
      int neworange = 0;

      if (bufferSlow[2] == 0x00) {
        neworange = 5;
      }
      if (bufferSlow[2] == 0x10) {
        neworange = 10;
      }
      if (bufferSlow[2] == 0x20) {
        neworange = 15;
      }
      if (bufferSlow[2] == 0x30) {
        neworange = 20;
      }
      if (bufferSlow[2] == 0x40) {
        neworange = 25;
      }
      if (bufferSlow[2] == 0x50) {
        neworange = 30;
      }
      if (bufferSlow[2] == 0x60) {
        neworange = 35;
      }
      if (bufferSlow[2] == 0x70) {
        neworange = 40;
      }

      if (orange != neworange) {
        orange = neworange;
        gmerajLEDamiPodswietlenia();
        oswiecLEDy(); //niepotrzebne, dopisane tylko po to aby recznie kontrolowac czy ledy zapietych pasow dobrze sie odswiezaja
      }
    }

    /*  // SEKCJA KONTROLUJACA STAN ZAPIECIA PASA KIEROWCY
        // zrezygnowac z odczytu tej informacji, gdyz ten adres na lini can pojawia sie tylko na zaplonie po stacujce,
        // w zwiazku z tym, mozna zgasic auto na zapietym pasie, potem go odpiac a po ponownym otwarciu drzwi
        // wskaznik bedzie dalej pokazywal zapiety pas co nie bedzie prawda, dopiero pozycja MAR w stacyjcie uaktualni stan
        // wizualnie efekt jest slaby... choc po odpaleniu auta informacja sie zaktualizuje, ale to takie... nie do konca pro.
        if (id == 0x0621401A) {
          boolean stanPas1 = false;

          if (bufferSlow[2] == 0x00) {
            stanPas1 = true;
          }
          if (bufferSlow[2] == 0x01) {
            stanPas1 = false;
          }

          if (pas1 != stanPas1) {
            pas1 = stanPas1;
            gmerajLEDami();
          }
        }
    */
    /*
      // SEKCJA KONTROLUJACA STAN ZAPIECIA PASA KIEROWCY - DRUGI ADRES ID
        // drugi adres ID pokazujacy stan zapiecia pasa kierowcy
        if (id == 0x06314003) {
          boolean stanPas1 = false;

          if (bufferSlow[4] == 0x00) {
            stanPas1 = true;
          }
          if (bufferSlow[4] == 0x02) {
            stanPas1 = false;
          }

          if (pas1 != stanPas1) {
            pas1 = stanPas1;
            gmerajLEDami();
          }
        }
    */

    // SEKCJA KONTROLUJACA PODSWIETLENIE PODLOGOWE I ZAPIETYCH WSZYSTKICH PASÓW
    // W ZALEZNOSCI OD OTWARTYCH DRZWI bufferSlow[1]
    // ORAZ CZY PRZEKRECONO KLUCZYK W STACYJCE bufferSlow[2]
    // WYŚWIETLAMY BIAŁE LUB POMARAŃCZOWE PASKI NEOPIXEL
    if (id == 0x06214000) {
      int tempStanDRZWI = 5;
      boolean stanKeyIn = false;

      if (bufferSlow[1] == 0x00) {
        tempStanDRZWI = 0;
      }
      if (bufferSlow[1] == 0x04 ) {
        tempStanDRZWI = 1;
      }
      if (bufferSlow[1] == 0x08 ) {
        tempStanDRZWI = 2;
      }
      if (bufferSlow[1] == 0x0C ) {
        tempStanDRZWI = 3;
      }

      if (stanDRZWI != tempStanDRZWI) {
        stanDRZWI = tempStanDRZWI;
        gmerajLEDamiPodswietlenia();
        if (bLEDpasy == true) {
          oswiecLEDy();
          bLEDpasy = false;
        }
      }

      if (bufferSlow[2] == 0x18) {
        stanKeyIn = false;
      } else {
        stanKeyIn = true;
      }

      if (bKeyIn != stanKeyIn) {
        bKeyIn = stanKeyIn;
        gmerajLEDamiPodswietlenia();
        if (bLEDpasy == true) {
          oswiecLEDy();
          bLEDpasy = false;
        }
      }

      //gasi wszystkie moje NeoPixele po wykryciu braku kluczyka w stacyjce przy zamknietych obu drzwiach i uplywie 5sekund
      if (bKeyIn == false && stanDRZWI == 0) {
        TimerOFF.begin(5000); //odpal TIMER
      } else {
        TimerOFF.time(STOP);
      }

    }

    /*
      // SEKCJA SPRAWDZAJACA CZY SILNIK PRACUJE CZY NIE, NARZIE NIEUZYWANA
      if (id == 0x04214001) {
      boolean stanRPM = false;

      if (bufferSlow[6] == 0x00) {
        stanRPM = false;
      }
      else {
        stanRPM = true;
      }

      if (bRPM != stanRPM) {
        bRPM = stanRPM;
        //funkcja(); //funkcja do wywolania gdy zgasimy/zalaczomy silnik
      }
      }
    */

    // SEKCJA SPRAWDZAJACA CZY AUTO JEDZIE CZY STOI ORAZ WYPLUWAJACA AKTUALNA PREDKOSC Z WYSOKIEGO BITU
    if (id == 0x04294000) {
      /*  boolean stanVspeed = false;

        if (bufferSlow[0] == 0x00) {
          stanVspeed = false;
        } else {
          stanVspeed = true;
        }

        if (bVspeed != stanVspeed) {
          bVspeed = stanVspeed;
          //funkcja(); //funkcja do wywolania gdy jedziemy
        } */

      newHbyteSpeed = bufferSlow[0];
      newLbyteSpeed = bufferSlow[1];
      if (HbyteSpeed != newHbyteSpeed || LbyteSpeed != newLbyteSpeed) {
        HbyteSpeed = newHbyteSpeed;
        LbyteSpeed = newLbyteSpeed;
        //Serial.print(HbyteSpeed, HEX);
        //Serial.print(" ");
        //Serial.println(LbyteSpeed, HEX);
      }

    }

    // SEKCJA SPRAWDZAJACA CZY MRYGA LEWY/PRAWY KIERUNKOWSKAZ ALBO ZADEN NIE MRYGA
    // ORAZ ZLICZA ZBOCZA IMPULSOW, GDY DOLICZY SIE TYLKO 2 IMPULSWO W OKRESLONYM CZASIE,
    // TO TRIPLINK ZADZIALA, W INNYCH WYPADKACH NIE
    if (id == 0x02214000) {

      if (bufferSlow[2] == 0x20) {
        stanbMigaPrawy = true;
      }
      if (bufferSlow[2] == 0x40) {
        stanbMigaLewy = true;
      }
      if (bufferSlow[2] == 0x60) {
        stanbHazardLight = true;
      }
      if (bufferSlow[2] == 0x00) {
        stanbMigaPrawy = false;
        stanbMigaLewy = false;
        stanbHazardLight = false;
      }

      if (bMigaPrawy != stanbMigaPrawy) {
        bMigaPrawy = stanbMigaPrawy;
        CountR++; //zliczam zbocza narastajace i opadajace aby aktywowac kierunki tylko wtedy gdy licznik pokaze 2 zbocza, czyli jeden impuls
        PITOfLastChange = aktualnyCzas;
        //Serial.println("Zmiany prawego kierunku: ");
        //Serial.println(CountR);
      }
      if (bMigaLewy != stanbMigaLewy) {
        bMigaLewy = stanbMigaLewy;
        CountL++; //zliczam zbocza narastajace i opadajace aby aktywowac kierunki tylko wtedy gdy licznik pokaze 2 zbocza, czyli jeden impuls
        PITOfLastChange = aktualnyCzas;
        //Serial.println("Zmiany lewego kierunku: ");
        //Serial.println(CountL);
      }
      if (bHazardLight != stanbHazardLight) {
        bHazardLight = stanbHazardLight;
        CountH++;
        PITOfLastChange = aktualnyCzas;
      }
    }

  }
  //################################################### KONIEC ODCZYT CAN slow ###############################################


  //############################################# DOBRY KOD - ZWIERA ODCZYT CAN 500kbps ######################################

  if (CANfast.checkReceive() == CAN_MSGAVAIL) {
    CANfast.readMsgBuf(&lenFast, bufferFast);
    unsigned long id = CANfast.getCanId();

    // SEKCJA ODCZYTUJACA STAN DOLADOWANIA I POZYCJE % PRZEPUSTNICY
    if (id == 0x0618A001) {
      NEWboostValue = bufferFast[4];
      NEWthrottle = bufferFast[7];

      if (boostValue != NEWboostValue) {
        boostValue = NEWboostValue;
        //Serial.print("Boost: ");
        //Serial.println(boostValue, HEX);
      }

      if (throttle != NEWthrottle) {
        throttle = NEWthrottle;
        throttle = map(throttle, 0x00, 0xFF, 0, 100);
        //Serial.print("Throttle [%]: ");
        //Serial.println(throttle);
      }
    }

  }

  //################################################### KONIEC ODCZYT CAN fast ###############################################




  //###################################################### TRIPLINK ##########################################################
  diff = aktualnyCzas - PITOfLastChange; //diff - to czas jaki uplynal od ostatniej zmiany (ostatniego zbocza) kierunkowskazu odczytanego na CANie

  //liczymy czas od ustania ostatniego zbocza, normalne mruganie daje drugie zbocze po ~330ms a my sprawdzamy od razu przy 350ms,
  //bo to znaczy ze juz nie migamy na manetce
  if (diff >= 350UL && diff < 400UL ) {
    BlinkerStartPermision = true;
  } else {
    BlinkerStartPermision = false;
  }

  //po uplywie 400ms mam pewnosc ze manetka nie jest juz wlaczona i moge zresetowac licznik aby znowu polowac na jeden impuls wywolania TripLinka
  //500ms aby odciac sie od mozliwosci wskoczenia impulsu po odbiciu manetki
  if (diff >= 400UL) {
    if (CountL != 0 || CountR != 0 || CountH != 0) {
      CountL = 0;
      CountR = 0;
      CountH = 0;
      Serial.println("WYZEROWANY LICZNIK PO 400ms");
    }
  }

  //Jeśli migacz zaswieci, to wpisuje na stale do zmiennej "state" swoj stan, bo oryginalne dane "pulsuja" w rytm migania
  if (bMigaLewy == true || bMigaPrawy == true) {
    if (bMigaLewy == true) {
      state = 0x01;
    }
    if (bMigaPrawy == true) {
      state = 0x02;
    }
    ImpulseLength = aktualnyCzas - PITofStartBlinkerImpulse;
    Serial.print("ImpulseLength ");
    Serial.println(ImpulseLength);
  } else {
    PITofStartBlinkerImpulse = aktualnyCzas; // punkt w czasie gdzie zapala sie lampka i else nie jest juz spelniony, tym smym zapamietujemy czas startu mrugania
  }

  //ta sekcja ma tylko 50ms okno na swoje dzialanie i to przy czterech warunkach do spelnienia:
  //pod warunkiem ze impuls byl dluzszy niz 150ms i ten impuls nie byl od HazardLights,
  //nie jest aktywna procedurka swiatel awaryjnych przy ACC wiekszym od 6.1m/s
  //czyli dopiero wtedy zwieramy przekaznikiem lewy/prawy kierunkowskaz
  if (BlinkerStartPermision == true && ImpulseLength >= 150UL && CountH == 0 && wystapiloACC == false) {
    if (CountL == 2) {
      PITforBlinkerEnd = aktualnyCzas; //zapamietujemy czas w ktorym zwarlismy obwod aby po xxxx ms moc go rozewrzec
      ImpulseLength = 0;
      BlinkerEndPermision = true;
      digitalWrite(46, HIGH);
      Serial.println("LEWY ON");
    }
    if (CountR == 2) {
      PITforBlinkerEnd = aktualnyCzas; //zapamietujemy czas w ktorym zwarlismy obwod aby po xxxx ms moc go rozewrzec
      ImpulseLength = 0;
      BlinkerEndPermision = true;
      digitalWrite(47, HIGH);
      Serial.println("PRAWY ON");
    }
  }

  //RoZwieramy przekaznikiem lewy/prawy kierunkowskaz
  if (aktualnyCzas - PITforBlinkerEnd >= BlinkLength && BlinkerEndPermision == true) {
    if (state == 0x01) {
      BlinkerEndPermision = false;
      digitalWrite(46, LOW);
      state = 0x00;
      Serial.println("LEWY OFF");
    }
    if (state == 0x02) {
      BlinkerEndPermision = false;
      digitalWrite(47, LOW);
      state = 0x00;
      Serial.println("PRAWY OFF");
    }
  }
  //#################################################### KONIEC TRIPLINK ##################################################



  //########################################### ZWIERA GUZIK AWARYJNYCH - ABL(ESS) ########################################

  if (fAccVal <= -6.0 && wystapiloACC == false && wystapiloACC2 == false) {
    Serial.print("Aktywuje PROCEDURE: ");
    Serial.println(fAccVal);
    previousMillisEXIT = aktualnyCzas;
    wystapiloACC = true;
    wystapiloACC2 = true;
    SpeedRef = HbyteSpeed;
    TimerHazardLights.begin(350); //Pierwszy prog wywolania, wystapilo opoznienie 6.0 i zapamietujemy predkosc przy ktorej wystapilo
    TimerHazardLightsCheck1.begin(50);
    TimerHazardLightsCheck2.begin(100);
    TimerHazardLightsCheck3.begin(200);
    TimerHazardLightsCheck4.begin(250);
  }

  //pierwsza szansa na przerwanie procedury zwierajacej przekaznik i powrot do poczatku
  if (TimerHazardLightsCheck1.available() ) {
    if (fAccVal >= 1 && wystapiloACC == true && wystapiloACC2 == true) {
      TimerHazardLights.time(STOP);
      TimerHazardLightsCheck1.time(STOP);
      TimerHazardLightsCheck2.time(STOP);
      TimerHazardLightsCheck3.time(STOP);
      TimerHazardLightsCheck4.time(STOP);
      wystapiloACC = false; //ta flaga pozwala wykonac sie procedurce od poczatku
      Serial.print("Przerwanie procedurki 1 prog - 50ms: ");
      Serial.println(fAccVal);
    }
  }

  //druga szansa na przerwanie procedury zwierajacej przekaznik i powrot do poczatku
  if (TimerHazardLightsCheck2.available() ) {
    if (fAccVal >= 1 && wystapiloACC == true && wystapiloACC2 == true) {
      TimerHazardLights.time(STOP);
      TimerHazardLightsCheck1.time(STOP);
      TimerHazardLightsCheck2.time(STOP);
      TimerHazardLightsCheck3.time(STOP);
      TimerHazardLightsCheck4.time(STOP);
      wystapiloACC = false; //ta flaga pozwala wykonac sie procedurce od poczatku
      Serial.print("Przerwanie procedurki 2 prog - 100ms: ");
      Serial.println(fAccVal);
    }
  }

  //trzecia szansa na przerwanie procedury zwierajacej przekaznik i powrot do poczatku
  if (TimerHazardLightsCheck3.available() ) {
    if (fAccVal >= 1 && wystapiloACC == true && wystapiloACC2 == true) {
      TimerHazardLights.time(STOP);
      TimerHazardLightsCheck1.time(STOP);
      TimerHazardLightsCheck2.time(STOP);
      TimerHazardLightsCheck3.time(STOP);
      TimerHazardLightsCheck4.time(STOP);
      wystapiloACC = false; //ta flaga pozwala wykonac sie procedurce od poczatku
      Serial.print("Przerwanie procedurki 3 prog - 200ms: ");
      Serial.println(fAccVal);
    }
  }

  //czwarta szansa na przerwanie procedury zwierajacej przekaznik i powrot do poczatku
  if (TimerHazardLightsCheck4.available() ) {
    if (fAccVal >= 1 && wystapiloACC == true && wystapiloACC2 == true) {
      TimerHazardLights.time(STOP);
      TimerHazardLightsCheck1.time(STOP);
      TimerHazardLightsCheck2.time(STOP);
      TimerHazardLightsCheck3.time(STOP);
      TimerHazardLightsCheck4.time(STOP);
      wystapiloACC = false; //ta flaga pozwala wykonac sie procedurce od poczatku
      Serial.print("Przerwanie procedurki 4 prog - 250ms: ");
      Serial.println(fAccVal);
    }
  }

  //teraz po uplywie 350ms jak mamy dalej duze a nawet wieksze opoznienie (6.5) i okreslony spadek predkosci,
  //to jednak odpalamy przekaznik aby uruchomil awaryjne, 0x02 na spadku predkosci to ok 8km/h utraconych w 350ms
  if (TimerHazardLights.available() ) {
    SpeedDiff = SpeedRef - HbyteSpeed;
    if (fAccVal <= -6.5 && SpeedDiff >= 0x02 && wystapiloACC == true) {
      wystapiloACC3 = true;                           //<<-- OD TEGO MIEJSCA W CZASIE NAPINKALA LED !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      TimerHazardLights.time(STOP);
      TimerHazardLightsEnd.begin(10 + (4 * blink_interval * 8)); //osiem szybkich mrugniec awaryjnymi i dalej nic, jak dodam 160ms to awaryjne beda mrugac dalej same
      Serial.print("Dobrnalem do aktywacji po 350ms: ");
      Serial.println(fAccVal);
    }
  }

  if (TimerHazardLightsEnd.available()) {
    v++;
    //if (fAccVal <= 0) {
    //  TimerHazardLights.begin(410);
    //  //v++; doliczy do 9 w tym miejscu, dziwne!
    //} else {
    TimerHazardLightsEnd.time(STOP);
    wystapiloACC3 = false;                           //<<-- DO TEGO MIEJSCA W CZASIE NAPINKALA LED !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    Serial.print("Dobrnalem do konca po 4*blink_interval*8, acc: ");
    Serial.println(fAccVal);
    Serial.print(" i V powtorzeniach: ");
    Serial.println(v);
  }


  if (aktualnyCzas - poprzedniCzas >= blink_interval && wystapiloACC3 == true) {
    poprzedniCzas = aktualnyCzas;

    // if the LED is off turn it on and vice-versa:
    if (ledState == LOW) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }

    //if ( poprzedniCzas <= 10000UL ) //parzysta liczba zwarc i rozwarc sprawi ze na koncu awaryjne beda wylaczone, nieparzysta sprawi ze zostana wlaczone
    //{
    poprzedniCzas = aktualnyCzas;
    digitalWrite(44, ledState);
    Serial.print(ledState); Serial.print("<-LED TIME-> "); Serial.println(aktualnyCzas);
    //}
  }


  //dopiero po 3sek i ustopieniu przyspieszenia, pozwalamy systemowi aktywowac mryganie kolejny raz
  if (fAccVal > -2 && wystapiloACC2 == true)
  {
    if (aktualnyCzas - previousMillisEXIT  >= 3000UL )
    {
      wystapiloACC = false;  //ta flaga pozwala wykonac sie procedurce od poczatku
      wystapiloACC2 = false; //ta flaga pozwala wykonac sie procedurce od poczatku
      Serial.println("System gotowy do kolejnego HAMOWANIA 3,0sek <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<");
    }
  }

  //################################################### KONIEC AWARYJNYCH #################################################


  //##################################################### ADVANCED MODE ###################################################
  //Advanced mode tylko z dolozonymi guzikami ktore go aktywuja i nim steruja, ja stosuje przerobione guziki z FIATA DUCATO
  if (TimerBUTTON.available()) {
    zmienna = analogRead(A8); //Odczytanie wartości pod guziki MODE/UP/DOWN
    zmienna = map(zmienna, 0, 1023, 1, 100); //przeskalowanie na 1-100 odczyt opornosci guzikow MODE/UP/DOWN

    if (zmienna >= 85 && zmienna <= 95 ) {
      MODEstate = 1;
    } else {
      MODEstate = 0;
    }

    if (MODE_ACTIVE == true && zmienna >= 65 && zmienna <= 75) {
      UPstate = 1;
      //Serial.println("UP pressed");
    } else {
      UPstate = 0;
    }

    if (MODE_ACTIVE == true && zmienna >= 4 && zmienna <= 25 ) {
      DOWNstate = 1;
      //Serial.println("DOWN pressed");
    } else {
      DOWNstate = 0;
    }

    TimerBUTTON.begin(100); //Sprawdzamy co 100ms odczyty z guzików i odczyty danych analogowych
  }

  if (MODEstate != lastMODEstate) {
    if (MODEstate == 1) {
      MODEcounter++;
      Serial.println(zmienna);
      if (MODEcounter % 2 == 0) {
        MODE_ACTIVE = false;
        Serial.println("Menu NIEAKTYWNE - ekran znika");
        AdvancedModeDeAct(); //funkcja wysylajaca zera, deaktywuje wyswietlanie danych
      } else {
        MODE_ACTIVE = true;
        Serial.println("Menu AKTYWNE - Ekran powitalny");
        AdvancedModeAct(); //funkcja pokazujaca menu na wyswietlaczu
      }
    }
  }
  lastMODEstate = MODEstate;


  if (UPstate != lastUPstate) {
    if (UPstate == 1) {
      UPDOWNcounter++;
      if (UPDOWNcounter >= 5) {
        UPDOWNcounter = 1;
      }
    }
  }
  lastUPstate = UPstate;

  if (DOWNstate != lastDOWNstate) {
    if (DOWNstate == 1) {
      UPDOWNcounter--;
      if (UPDOWNcounter <= 0) {
        UPDOWNcounter = 4;
      }
    }
  }
  lastDOWNstate = DOWNstate;

  if (TimerAMode.available()) {
    TimerAMode.time(STOP);
    UPDOWNcounter++;
    if (UPDOWNcounter >= 5) {
      UPDOWNcounter = 1;
    }
  }

  if (MODE_ACTIVE == true) {
    if (UPDOWNcounter != lastUPDOWNcounter) {
      if (UPDOWNcounter == 1) {
        Serial.println("ekran A"); //wywolaj swoja funkcje(); pokazującą ekran A
        TimerBOOST.begin(tick);
        TimerACC.time(STOP);
        TimerTHROTTLE.time(STOP);
        TimerONETOUCH.time(STOP);
      }
      if (UPDOWNcounter == 2) {
        Serial.println("ekran B"); //wywolaj swoja funkcje(); pokazującą ekran B
        TimerBOOST.time(STOP);
        TimerACC.begin(tick);
        TimerTHROTTLE.time(STOP);
        TimerONETOUCH.time(STOP);
      }
      if (UPDOWNcounter == 3) {
        Serial.println("ekran C"); //wywolaj swoja funkcje(); pokazującą ekran C
        TimerACC.time(STOP);
        TimerBOOST.time(STOP);
        TimerTHROTTLE.begin(tick);
        TimerONETOUCH.time(STOP);
      }
      if (UPDOWNcounter == 4) {
        Serial.println("ekran D"); //wywolaj swoja funkcje(); pokazującą ekran D
        TimerACC.time(STOP);
        TimerBOOST.time(STOP);
        TimerTHROTTLE.time(STOP);
        TimerONETOUCH.begin(tick);
      }
    }
    lastUPDOWNcounter = UPDOWNcounter;
  }

  //##################################### wyswietl na ekranie BOOST ########################################
  if (TimerBOOST.available()) {
    TimerBOOST.begin(tick);
    showBOOST();
  }

  //###################################### wyswietl na ekranie ACC #########################################
  if (TimerACC.available()) {
    //TimerACC.begin(tick);
    TimerACC.begin(500);
    //Serial.print("event X: "); Serial.println(event.acceleration.x); //Serial.print("  ");
    //accVal = event.acceleration.x;
    //Serial.print("faccValX: "); Serial.println(fAccVal); //Serial.print("  ");

    //if (accVal != NEWaccVal) {
    //  accVal = NEWaccVal;
    showACC();
    //}
  }

  //##################################### wyswietl na ekranie THROTTLE #####################################
  if (TimerTHROTTLE.available()) {
    TimerTHROTTLE.begin(tick);
    showTHROTTLE();
  }

  //##################################### wyswietl na ekranie OTHER  #######################################
  //Przygotowka pod ustawienie czy TripLink ma mrugac 3x / 4x / 5x / czy w ogole ma byc OFF
  if (TimerONETOUCH.available()) {
    TimerONETOUCH.begin(tick);
    showONETOUCH();
  }

  //######################################### ramka ZEROWA A.MODE ##########################################
  if (TimerLastFrame.available()) {
    TimerLastFrame.time(STOP);
    CanSend81(0x0A394021,  0x00,  0x00,   0x00,  0x00,  0x00,  0x00,  0x00,  0x00);
    Serial.println("A.MODE END - 100ms");
  }
  //Timer który wysyła ostatnią ramke zerową po 100ms od wywołania aby mieć pewność że wcześniejsze funkcje już
  //zakończyły wysyłać swoje ramki, a robiły to co 250ms przez 50ms, bo najczęśćiej 5 ramek tworzy komunikat ekranowy
  //co maksymalnie trwa 50ms, dlatego czekamy 100, żeby mieć pewność że nie przerwiemy nadawania ramek

  //############################################## KONIEC ADVANCED MODE ##################################################



  //############################################ WYGASZENIE PODSWIETLENIA ################################################
  if (TimerOFF.available()) {
    wygasLEDyPodswietlenia();
    wygasLEDy();
    bLEDpasy = true;
    TimerOFF.time(STOP);
  }
  //##################################### KONIEC WYGASZENIE PODSWIETLENIA ################################################



  //####################################### ODCINKA MODULU SKLADANYCH LUSTEREK ###########################################
  //Uzywam do sterowania przekanikami ktore odcinaja od auta modul skladania lusterek, w ten sposob dzialaja w trybie
  //manualnym oraz w trybie automatycznym, sekcja nieprzydatna przy zwyklych fiatowskich lusterkach
  newline1 = analogRead(A10);
  newline1 = map(newline1, 0, 1023, 0, 3);
  newline2 = analogRead(A11);
  newline2 = map(newline2, 0, 1023, 0, 3);

  if (line1 != newline1) {
    line1 = newline1;
    if ( newline1 == 3) {
      tempLOCK = true;
      Serial.println("LOCKED");
    }
  }
  if (line2 != newline2) {
    line2 = newline2;
    if ( newline2 == 3) {
      tempLOCK = false;
      Serial.println("UNLOCKED");
    }
  }
  if (LOCK != tempLOCK) {
    LOCK = tempLOCK;
    tempDOORstate = stanDRZWI;
    // najistotnieszy warunek, sygnal do zlozenia lusterek wysyalac bedzie sie TYLKO gdy oba sa spelnione
    if ( bKeyIn == false && stanDRZWI == 0 || stanDRZWI == 5) {
      tLOCKpreStart.begin(240); //procedurka dodatkowa, zabezpiecza przed impulsem przy otwarciu drzwi z wewnatrz auta
    }
  }
  //######################################## KONIEC MODULU SKLADANYCH LUSTEREK ###########################################



  //################################# TIMERY FUNKCJI IMPULSOWEJ DLA POWER MIRRORS ########################################
  //niepotrzebne gdy ma się zwykle lusterka
  if (tLOCKpreStart.available() ) {
    tLOCKpreStart.time(STOP);
    if ( tempDOORstate == stanDRZWI) {
      tLOCKstart.begin(10);
    }
  }

  if (tLOCKstart.available() ) {
    tLOCKstart.time(STOP);
    tLOCKmid.begin(200);
    tLOCKend.begin(4000);
    digitalWrite(16, LOW);
    digitalWrite(17, LOW);
    digitalWrite(18, LOW);
    Serial.println("AKTYWACJA 16,17,18");
  }

  if (tLOCKmid.available() ) {
    tLOCKmid.time(STOP);
    digitalWrite(18, HIGH);
    Serial.println("DEAKTYWACJA 18 - IMPULSOWY");
  }

  if (tLOCKend.available() ) {
    tLOCKend.time(STOP);
    //tempDOORstate = stanDRZWI;
    digitalWrite(16, HIGH);
    digitalWrite(17, HIGH);
    Serial.println("DEAKTYWACJA 16,17");
  }
  //######################################## KONIEC TIMERY FUNKCJI IMPULSOWEJ ############################################


  /*
    //Przywitanie ekranowe.
    //##################################################### WELCOME KRIS ######################################################
    if (digitalRead(7) == LOW and klik1 == false) { //Jeśli przycisk wciśniemy, to zaczyna sie dziać
      zapamietanyCzas01 = aktualnyCzas;               //zaczynamy liczyc czas do porownania po 5sek i wysylamy kody na linie CAN
      klik1 = true;
      //WELCOME
      //KRIS
      CanSend(0xA394021, 0x10, 0x02, 0xFE, 0x24, 0x17, 0x39, 0xA6, 0x10);
      CanSend(0xA394021, 0x11, 0x02, 0xFD, 0x67, 0x54, 0x78, 0x00, 0x00);
      Serial.println("WCISNIETY");
    } else if (aktualnyCzas - zapamietanyCzas01 >= 5000UL and klik1 == true) {
      CanSend(0xA394021, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00); //po 5sek przestan wyswietlac tekst na LCD
      Serial.println("NIEWCISNIETY");
      klik1 = false;
    }
    //#########################################################################################################################
  */



  //########################################### UZYCIE KONTAKTRONOW W PASACH ############################################

  if (digitalRead(40) == LOW) { //Pas kierowcy z kontaktronem normalnie otwartym
    stanPas1 = true; // klamra zapieta, kontaktron zwarty do masy, stan LOW
  } else {
    stanPas1 = false; // klamra odpieta, obwod otwarty
  }
  if (pas1 != stanPas1) {
    pas1 = stanPas1;
    gmerajLEDami();
  }

  if (digitalRead(41) == LOW) { //Pas pasazera z przodu, z kontaktronem normalnie otwartym
    stanPas2 = true; // klamra zapieta, kontaktron zwarty do masy, stan LOW
  } else {
    stanPas2 = false; // klamra odpieta, obwod otwarty
  }
  if (pas2 != stanPas2) {
    pas2 = stanPas2;
    gmerajLEDami();
  }

  if (digitalRead(42) == LOW) { //Zapinka pasa tylnego z krancówka normalnie zwartą ALFA MITO
    stanPas3 = false; // bez zapietego pasa obwod jest zamkniety do masy
  } else {
    stanPas3 = true; // zapiety pas, otwiera obwod
  }
  if (pas3 != stanPas3) {
    pas3 = stanPas3;
    gmerajLEDami();
  }

  if (digitalRead(43) == LOW) { //Zapinka pasa tylnego z krancówka normalnie zwartą ALFA MITO
    stanPas4 = false; // bez zapietego pasa obwod jest zamkniety do masy
  } else {
    stanPas4 = true; // zapiety pas, otwiera obwod
  }
  if (pas4 != stanPas4) {
    pas4 = stanPas4;
    gmerajLEDami();
  }

  /*
    if (aktualnyCzas > 60000UL){ //60sek na to zeby zapiac wszystkie pasy bo potem i tak wygaszam diody
      wygasLEDy();
    }
  */
  //########################################### KONIEC KONTAKTRONOW W PASACH ############################################


  //############################################# TIMERY FUNKCJI CAN-SEND ###############################################
  //sekcja ktora skleja mi pakiety ramek i zapewnia ze calosc wysyla sie tylko raz od momentu wywolania,
  //dlatego kazda ma (STOP) i swoja wlasna zmienna true/false
  if (tCanSend81.available() ) {
    CANslow.sendMsgBuf(address81, 1, 8, DataToSend81);
    tCanSend81.time(STOP);
    send81 = true;
  }
  if (tCanSend82.available() ) {
    CANslow.sendMsgBuf(address82, 1, 8, DataToSend82);
    tCanSend82.time(STOP);
    send82 = true;
  }
  if (tCanSend83.available() ) {
    CANslow.sendMsgBuf(address83, 1, 8, DataToSend83);
    tCanSend83.time(STOP);
    send83 = true;
  }
  if (tCanSend84.available() ) {
    CANslow.sendMsgBuf(address84, 1, 8, DataToSend84);
    tCanSend84.time(STOP);
    send84 = true;
  }
  if (tCanSend85.available() ) {
    CANslow.sendMsgBuf(address85, 1, 8, DataToSend85);
    tCanSend85.time(STOP);
    send85 = true;
  }
  //######################################## KONIEC TIMERY FUNKCJI CAN-SEND #############################################


}

//------------------------------------------------------------- ENDO OF MAIN LOOP -----------------------------------------------------





//-------------------------------------------------------------------------------------------------------------------------------------
void AdvancedModeDeAct() {
  TimerBOOST.time(STOP);
  TimerACC.time(STOP);
  TimerTHROTTLE.time(STOP);
  TimerONETOUCH.time(STOP);
  TimerAMode.time(STOP);
  TimerLastFrame.begin(100);

  UPDOWNcounter--;
  if (UPDOWNcounter <= 0) {
    UPDOWNcounter = 4;
  }

  lastUPDOWNcounter--;
  if (lastUPDOWNcounter <= 0) {
    lastUPDOWNcounter = 4;
  }
}


void AdvancedModeAct() {
  TimerAMode.begin(600);
  CanSend81(0x0A394021,  0x10,  0x02,   0xFC,  0xC3,  0xE1,  0x31,  0x93,  0x90);
  CanSend82(0x0A394021,  0x11,  0x02,   0x3F,  0xF6,  0x1A,  0x3D,  0x00,  0x00);
}


void showONETOUCH() {
  //OTHER:
  //---
  CanSend81(0x0A394021,  0x10,  0x02,   0x69,  0xF4,  0xD0,  0x77,  0xAF,  0xF9);
  CanSend82(0x0A394021,  0x11,  0x02,   0xE7,  0x90,  0x00,  0x00,  0x00,  0x00);
}


void showTHROTTLE() {

  if (throttle > 95) {
    //THROTTLE:
    //100
    //:##########:
    CanSend81(0xA394021,  0x30,  0x2,   0x7D,  0x37,  0x5A,  0x7D,  0xF5,  0xD0);
    CanSend82(0xA394021,  0x31,  0x2,   0xEB,  0xF0,  0x81,  0x07,  0xFE,  0xBC);
    CanSend83(0xA394021,  0x32,  0x2,   0xF3,  0xCF,  0x3C,  0xF3,  0xCF,  0x3C);
    CanSend84(0xA394021,  0x33,  0x2,   0xF3,  0xA0,  0x00,  0x00,  0x00,  0x00);
  }

  if (throttle > 90 && throttle <= 95) {
    //THROTTLE:
    //95
    //:##########:
    CanSend81(0xA394021,  0x30,  0x2,   0x7D,  0x37,  0x5A,  0x7D,  0xF5,  0xD0);
    CanSend82(0xA394021,  0x31,  0x2,   0xEB,  0xF2,  0x86,  0xFF,  0xAF,  0x3C);
    CanSend83(0xA394021,  0x32,  0x2,   0xF3,  0xCF,  0x3C,  0xF3,  0xCF,  0x3C);
    CanSend84(0xA394021,  0x33,  0x2,   0xE8,  0x00,  0x00,  0x00,  0x00,  0x00);
  }

  if (throttle > 85 && throttle <= 90) {
    //THROTTLE:
    //90
    //:######### :
    CanSend81(0xA394021,  0x30,  0x2,   0x7D,  0x37,  0x5A,  0x7D,  0xF5,  0xD0);
    CanSend82(0xA394021,  0x31,  0x2,   0xEB,  0xF2,  0x81,  0xFF,  0xAF,  0x3C);
    CanSend83(0xA394021,  0x32,  0x2,   0xF3,  0xCF,  0x3C,  0xF3,  0xCF,  0x00);
    CanSend84(0xA394021,  0x33,  0x2,   0xE8,  0x00,  0x00,  0x00,  0x00,  0x00);
  }

  if (throttle > 80 && throttle <= 85) {
    //THROTTLE:
    //85
    //:######### :
    CanSend81(0xA394021,  0x30,  0x2,   0x7D,  0x37,  0x5A,  0x7D,  0xF5,  0xD0);
    CanSend82(0xA394021,  0x31,  0x2,   0xEB,  0xF2,  0x46,  0xFF,  0xAF,  0x3C);
    CanSend83(0xA394021,  0x32,  0x2,   0xF3,  0xCF,  0x3C,  0xF3,  0xCF,  0x00);
    CanSend84(0xA394021,  0x33,  0x2,   0xE8,  0x00,  0x00,  0x00,  0x00,  0x00);
  }

  if (throttle > 75 && throttle <= 80) {
    //THROTTLE:
    //80
    //:########  :
    CanSend81(0xA394021,  0x30,  0x2,   0x7D,  0x37,  0x5A,  0x7D,  0xF5,  0xD0);
    CanSend82(0xA394021,  0x31,  0x2,   0xEB,  0xF2,  0x41,  0xFF,  0xAF,  0x3C);
    CanSend83(0xA394021,  0x32,  0x2,   0xF3,  0xCF,  0x3C,  0xF3,  0xC0,  0x00);
    CanSend84(0xA394021,  0x33,  0x2,   0xE8,  0x00,  0x00,  0x00,  0x00,  0x00);
  }

  if (throttle > 70 && throttle <= 75) {
    //THROTTLE:
    //75
    //:########  :
    CanSend81(0xA394021,  0x30,  0x2,   0x7D,  0x37,  0x5A,  0x7D,  0xF5,  0xD0);
    CanSend82(0xA394021,  0x31,  0x2,   0xEB,  0xF2,  0x06,  0xFF,  0xAF,  0x3C);
    CanSend83(0xA394021,  0x32,  0x2,   0xF3,  0xCF,  0x3C,  0xF3,  0xC0,  0x00);
    CanSend84(0xA394021,  0x33,  0x2,   0xE8,  0x00,  0x00,  0x00,  0x00,  0x00);
  }

  if (throttle > 65 && throttle <= 70) {
    //THROTTLE:
    //70
    //:#######   :
    CanSend81(0xA394021,  0x30,  0x2,   0x7D,  0x37,  0x5A,  0x7D,  0xF5,  0xD0);
    CanSend82(0xA394021,  0x31,  0x2,   0xEB,  0xF2,  0x01,  0xFF,  0xAF,  0x3C);
    CanSend83(0xA394021,  0x32,  0x2,   0xF3,  0xCF,  0x3C,  0xF0,  0x00,  0x00);
    CanSend84(0xA394021,  0x33,  0x2,   0xE8,  0x00,  0x00,  0x00,  0x00,  0x00);
  }

  if (throttle > 60 && throttle <= 65) {
    //THROTTLE:
    //65
    //:#######   :
    CanSend81(0xA394021,  0x30,  0x2,   0x7D,  0x37,  0x5A,  0x7D,  0xF5,  0xD0);
    CanSend82(0xA394021,  0x31,  0x2,   0xEB,  0xF1,  0xC6,  0xFF,  0xAF,  0x3C);
    CanSend83(0xA394021,  0x32,  0x2,   0xF3,  0xCF,  0x3C,  0xF0,  0x00,  0x00);
    CanSend84(0xA394021,  0x33,  0x2,   0xE8,  0x00,  0x00,  0x00,  0x00,  0x00);
  }

  if (throttle > 55 && throttle <= 60) {
    //THROTTLE:
    //60
    //:######    :
    CanSend81(0xA394021,  0x30,  0x2,   0x7D,  0x37,  0x5A,  0x7D,  0xF5,  0xD0);
    CanSend82(0xA394021,  0x31,  0x2,   0xEB,  0xF1,  0xC1,  0xFF,  0xAF,  0x3C);
    CanSend83(0xA394021,  0x32,  0x2,   0xF3,  0xCF,  0x3C,  0x00,  0x00,  0x00);
    CanSend84(0xA394021,  0x33,  0x2,   0xE8,  0x00,  0x00,  0x00,  0x00,  0x00);
  }

  if (throttle > 50 && throttle <= 55) {
    //THROTTLE:
    //55
    //:######    :
    CanSend81(0xA394021,  0x30,  0x2,   0x7D,  0x37,  0x5A,  0x7D,  0xF5,  0xD0);
    CanSend82(0xA394021,  0x31,  0x2,   0xEB,  0xF1,  0x86,  0xFF,  0xAF,  0x3C);
    CanSend83(0xA394021,  0x32,  0x2,   0xF3,  0xCF,  0x3C,  0x00,  0x00,  0x00);
    CanSend84(0xA394021,  0x33,  0x2,   0xE8,  0x00,  0x00,  0x00,  0x00,  0x00);
  }

  if (throttle > 45 && throttle <= 50) {
    //THROTTLE:
    //50
    //:#####     :
    CanSend81(0xA394021,  0x30,  0x2,   0x7D,  0x37,  0x5A,  0x7D,  0xF5,  0xD0);
    CanSend82(0xA394021,  0x31,  0x2,   0xEB,  0xF1,  0x81,  0xFF,  0xAF,  0x3C);
    CanSend83(0xA394021,  0x32,  0x2,   0xF3,  0xCF,  0x00,  0x00,  0x00,  0x00);
    CanSend84(0xA394021,  0x33,  0x2,   0xE8,  0x00,  0x00,  0x00,  0x00,  0x00);
  }

  if (throttle > 40 && throttle <= 45) {
    //THROTTLE:
    //45
    //:#####     :
    CanSend81(0xA394021,  0x30,  0x2,   0x7D,  0x37,  0x5A,  0x7D,  0xF5,  0xD0);
    CanSend82(0xA394021,  0x31,  0x2,   0xEB,  0xF1,  0x46,  0xFF,  0xAF,  0x3C);
    CanSend83(0xA394021,  0x32,  0x2,   0xF3,  0xCF,  0x00,  0x00,  0x00,  0x00);
    CanSend84(0xA394021,  0x33,  0x2,   0xE8,  0x00,  0x00,  0x00,  0x00,  0x00);
  }

  if (throttle > 35 && throttle <= 40) {
    //THROTTLE:
    //40
    //:####      :
    CanSend81(0xA394021,  0x30,  0x2,   0x7D,  0x37,  0x5A,  0x7D,  0xF5,  0xD0);
    CanSend82(0xA394021,  0x31,  0x2,   0xEB,  0xF1,  0x41,  0xFF,  0xAF,  0x3C);
    CanSend83(0xA394021,  0x32,  0x2,   0xF3,  0xC0,  0x00,  0x00,  0x00,  0x00);
    CanSend84(0xA394021,  0x33,  0x2,   0xE8,  0x00,  0x00,  0x00,  0x00,  0x00);
  }

  if (throttle > 30 && throttle <= 35) {
    //THROTTLE:
    //35
    //:####      :
    CanSend81(0xA394021,  0x30,  0x2,   0x7D,  0x37,  0x5A,  0x7D,  0xF5,  0xD0);
    CanSend82(0xA394021,  0x31,  0x2,   0xEB,  0xF1,  0x06,  0xFF,  0xAF,  0x3C);
    CanSend83(0xA394021,  0x32,  0x2,   0xF3,  0xC0,  0x00,  0x00,  0x00,  0x00);
    CanSend84(0xA394021,  0x33,  0x2,   0xE8,  0x00,  0x00,  0x00,  0x00,  0x00);
  }

  if (throttle > 25 && throttle <= 30) {
    //THROTTLE:
    //30
    //:###       :
    CanSend81(0xA394021,  0x30,  0x2,   0x7D,  0x37,  0x5A,  0x7D,  0xF5,  0xD0);
    CanSend82(0xA394021,  0x31,  0x2,   0xEB,  0xF1,  0x01,  0xFF,  0xAF,  0x3C);
    CanSend83(0xA394021,  0x32,  0x2,   0xF0,  0x00,  0x00,  0x00,  0x00,  0x00);
    CanSend84(0xA394021,  0x33,  0x2,   0xE8,  0x00,  0x00,  0x00,  0x00,  0x00);
  }

  if (throttle > 20 && throttle <= 25) {
    //THROTTLE:
    //25
    //:###       :
    CanSend81(0xA394021,  0x30,  0x2,   0x7D,  0x37,  0x5A,  0x7D,  0xF5,  0xD0);
    CanSend82(0xA394021,  0x31,  0x2,   0xEB,  0xF0,  0xC6,  0xFF,  0xAF,  0x3C);
    CanSend83(0xA394021,  0x32,  0x2,   0xF0,  0x00,  0x00,  0x00,  0x00,  0x00);
    CanSend84(0xA394021,  0x33,  0x2,   0xE8,  0x00,  0x00,  0x00,  0x00,  0x00);
  }

  if (throttle > 15 && throttle <= 20) {
    //THROTTLE:
    //20
    //:##        :
    CanSend81(0xA394021,  0x30,  0x2,   0x7D,  0x37,  0x5A,  0x7D,  0xF5,  0xD0);
    CanSend82(0xA394021,  0x31,  0x2,   0xEB,  0xF0,  0xC1,  0xFF,  0xAF,  0x3C);
    CanSend83(0xA394021,  0x32,  0x2,   0x00,  0x00,  0x00,  0x00,  0x00,  0x00);
    CanSend84(0xA394021,  0x33,  0x2,   0xE8,  0x00,  0x00,  0x00,  0x00,  0x00);
  }

  if (throttle > 10 && throttle <= 15) {
    //THROTTLE:
    //15
    //:##        :
    CanSend81(0xA394021,  0x30,  0x2,   0x7D,  0x37,  0x5A,  0x7D,  0xF5,  0xD0);
    CanSend82(0xA394021,  0x31,  0x2,   0xEB,  0xF0,  0x86,  0xFF,  0xAF,  0x3C);
    CanSend83(0xA394021,  0x32,  0x2,   0x00,  0x00,  0x00,  0x00,  0x00,  0x00);
    CanSend84(0xA394021,  0x33,  0x2,   0xE8,  0x00,  0x00,  0x00,  0x00,  0x00);
  }

  if (throttle > 5 && throttle <= 10) {
    //THROTTLE:
    //10
    //:#         :
    CanSend81(0xA394021,  0x30,  0x2,   0x7D,  0x37,  0x5A,  0x7D,  0xF5,  0xD0);
    CanSend82(0xA394021,  0x31,  0x2,   0xEB,  0xF0,  0x81,  0xFF,  0xAF,  0x00);
    CanSend83(0xA394021,  0x32,  0x2,   0x00,  0x00,  0x00,  0x00,  0x00,  0x00);
    CanSend84(0xA394021,  0x33,  0x2,   0xE8,  0x00,  0x00,  0x00,  0x00,  0x00);
  }

  if (throttle > 0 && throttle <= 5) {
    //THROTTLE:
    //5
    //:#         :
    CanSend81(0xA394021,  0x30,  0x2,   0x7D,  0x37,  0x5A,  0x7D,  0xF5,  0xD0);
    CanSend82(0xA394021,  0x31,  0x2,   0xEB,  0xF1,  0xBF,  0xEB,  0xC0,  0x00);
    CanSend83(0xA394021,  0x32,  0x2,   0x00,  0x00,  0x00,  0x00,  0x00,  0x3A);
    CanSend84(0xA394021,  0x33,  0x2,   0x00,  0x00,  0x00,  0x00,  0x00,  0x00);
  }

  if (throttle == 0) {
    //THROTTLE:
    //0
    //:          :
    CanSend81(0xA394021,  0x30,  0x2,   0x7D,  0x37,  0x5A,  0x7D,  0xF5,  0xD0);
    CanSend82(0xA394021,  0x31,  0x2,   0xEB,  0xF0,  0x7F,  0xE8,  0x00,  0x00);
    CanSend83(0xA394021,  0x32,  0x2,   0x00,  0x00,  0x00,  0x00,  0x00,  0x3A);
    CanSend84(0xA394021,  0x33,  0x2,   0x00,  0x00,  0x00,  0x00,  0x00,  0x00);
  }
}


void showACC() {

  if (accVal >= 10 && accVal < 11) {
    //G-SENSOR:
    //+1.0G
    //:##########  :
    CanSend81(0xA394021,  0x30,  0x2,   0x4B,  0x97,  0x90,  0x65,  0xE6,  0x9D);
    CanSend82(0xA394021,  0x31,  0x2,   0xEB,  0xFE,  0x02,  0x2C,  0x14,  0xBF);
    CanSend83(0xA394021,  0x32,  0x2,   0xEB,  0xCF,  0x3C,  0xF3,  0xCF,  0x3C);
    CanSend84(0xA394021,  0x33,  0x2,   0xF3,  0xCF,  0x00,  0x03,  0xAF,  0x00);
  }

  if (accVal >= 9 && accVal < 10) {
    //G-SENSOR:
    //+0.9G
    //:#########   :
    CanSend81(0xA394021,  0x30,  0x2,   0x4B,  0x97,  0x90,  0x65,  0xE6,  0x9D);
    CanSend82(0xA394021,  0x31,  0x2,   0xEB,  0xFE,  0x01,  0x2C,  0xA4,  0xBF);
    CanSend83(0xA394021,  0x32,  0x2,   0xEB,  0xCF,  0x3C,  0xF3,  0xCF,  0x3C);
    CanSend84(0xA394021,  0x33,  0x2,   0xF3,  0xC0,  0x00,  0x03,  0xAF,  0x00);
  }

  if (accVal >= 8 && accVal < 9) {
    //G-SENSOR:
    //+0.8G
    //:########    :
    CanSend81(0xA394021,  0x30,  0x2,   0x4B,  0x97,  0x90,  0x65,  0xE6,  0x9D);
    CanSend82(0xA394021,  0x31,  0x2,   0xEB,  0xFE,  0x01,  0x2C,  0x94,  0xBF);
    CanSend83(0xA394021,  0x32,  0x2,   0xEB,  0xCF,  0x3C,  0xF3,  0xCF,  0x3C);
    CanSend84(0xA394021,  0x33,  0x2,   0xF0,  0x00,  0x00,  0x03,  0xAF,  0x00);
  }

  if (accVal >= 7 && accVal < 8) {
    //G-SENSOR:
    //+0.7G
    //:#######     :
    CanSend81(0xA394021,  0x30,  0x2,   0x4B,  0x97,  0x90,  0x65,  0xE6,  0x9D);
    CanSend82(0xA394021,  0x31,  0x2,   0xEB,  0xFE,  0x01,  0x2C,  0x84,  0xBF);
    CanSend83(0xA394021,  0x32,  0x2,   0xEB,  0xCF,  0x3C,  0xF3,  0xCF,  0x3C);
    CanSend84(0xA394021,  0x33,  0x2,   0x00,  0x00,  0x00,  0x03,  0xAF,  0x00);
  }

  if (accVal >= 6 && accVal < 7) {
    //G-SENSOR:
    //+0.6G
    //:######      :
    CanSend81(0xA394021,  0x30,  0x2,   0x4B,  0x97,  0x90,  0x65,  0xE6,  0x9D);
    CanSend82(0xA394021,  0x31,  0x2,   0xEB,  0xFE,  0x01,  0x2C,  0x74,  0xBF);
    CanSend83(0xA394021,  0x32,  0x2,   0xEB,  0xCF,  0x3C,  0xF3,  0xCF,  0x00);
    CanSend84(0xA394021,  0x33,  0x2,   0x00,  0x00,  0x00,  0x03,  0xAF,  0x00);
  }

  if (accVal >= 5 && accVal < 6) {
    //G-SENSOR:
    //+0.5G
    //:#####       :
    CanSend81(0xA394021,  0x30,  0x2,   0x4B,  0x97,  0x90,  0x65,  0xE6,  0x9D);
    CanSend82(0xA394021,  0x31,  0x2,   0xEB,  0xFE,  0x01,  0x2C,  0x64,  0xBF);
    CanSend83(0xA394021,  0x32,  0x2,   0xEB,  0xCF,  0x3C,  0xF3,  0xC0,  0x00);
    CanSend84(0xA394021,  0x33,  0x2,   0x00,  0x00,  0x00,  0x03,  0xAF,  0x00);
  }

  if (accVal >= 4 && accVal < 5) {
    //G-SENSOR:
    //+0.4G
    //:####        :
    CanSend81(0xA394021,  0x30,  0x2,   0x4B,  0x97,  0x90,  0x65,  0xE6,  0x9D);
    CanSend82(0xA394021,  0x31,  0x2,   0xEB,  0xFE,  0x01,  0x2C,  0x54,  0xBF);
    CanSend83(0xA394021,  0x32,  0x2,   0xEB,  0xCF,  0x3C,  0xF0,  0x00,  0x00);
    CanSend84(0xA394021,  0x33,  0x2,   0x00,  0x00,  0x00,  0x03,  0xAF,  0x00);
  }

  if (accVal >= 3 && accVal < 4) {
    //G-SENSOR:
    //+0.3G
    //:###         :
    CanSend81(0xA394021,  0x30,  0x2,   0x4B,  0x97,  0x90,  0x65,  0xE6,  0x9D);
    CanSend82(0xA394021,  0x31,  0x2,   0xEB,  0xFE,  0x01,  0x2C,  0x44,  0xBF);
    CanSend83(0xA394021,  0x32,  0x2,   0xEB,  0xCF,  0x3C,  0x00,  0x00,  0x00);
    CanSend84(0xA394021,  0x33,  0x2,   0x00,  0x00,  0x00,  0x03,  0xAF,  0x00);
  }

  if (accVal >= 2 && accVal < 3) {
    //G-SENSOR:
    //+0.2G
    //:##          :
    CanSend81(0xA394021,  0x30,  0x2,   0x4B,  0x97,  0x90,  0x65,  0xE6,  0x9D);
    CanSend82(0xA394021,  0x31,  0x2,   0xEB,  0xFE,  0x01,  0x2C,  0x34,  0xBF);
    CanSend83(0xA394021,  0x32,  0x2,   0xEB,  0xCF,  0x00,  0x00,  0x00,  0x00);
    CanSend84(0xA394021,  0x33,  0x2,   0x00,  0x00,  0x00,  0x03,  0xAF,  0x00);
  }

  if (accVal >= 1 && accVal < 2) {
    //G-SENSOR:
    //+0.1G
    //:#           :
    CanSend81(0xA394021,  0x30,  0x2,   0x4B,  0x97,  0x90,  0x65,  0xE6,  0x9D);
    CanSend82(0xA394021,  0x31,  0x2,   0xEB,  0xFE,  0x01,  0x2C,  0x24,  0xBF);
    CanSend83(0xA394021,  0x32,  0x2,   0xEB,  0xC0,  0x00,  0x00,  0x00,  0x00);
    CanSend84(0xA394021,  0x33,  0x2,   0x00,  0x00,  0x00,  0x03,  0xAF,  0x00);
  }

  if (accVal > -1 && accVal < 1) {
    //G-SENSOR:
    // 0.0G
    //:            :
    CanSend81(0xA394021,  0x30,  0x2,   0x4B,  0x97,  0x90,  0x65,  0xE6,  0x9D);
    CanSend82(0xA394021,  0x31,  0x2,   0xEB,  0xF0,  0x01,  0x2C,  0x14,  0xBF);
    CanSend83(0xA394021,  0x32,  0x2,   0xE8,  0x00,  0x00,  0x00,  0x00,  0x00);
    CanSend84(0xA394021,  0x33,  0x2,   0x00,  0x00,  0x00,  0x03,  0xAF,  0x00);
  }

  if (accVal > -2 && accVal <= -1) {
    //G-SENSOR:
    //-0.1G
    //:           #:
    CanSend81(0xA394021,  0x30,  0x2,   0x4B,  0x97,  0x90,  0x65,  0xE6,  0x9D);
    CanSend82(0xA394021,  0x31,  0x2,   0xEB,  0xFE,  0x41,  0x2C,  0x24,  0xBF);
    CanSend83(0xA394021,  0x32,  0x2,   0xE8,  0x00,  0x00,  0x00,  0x00,  0x00);
    CanSend84(0xA394021,  0x33,  0x2,   0x00,  0x00,  0x00,  0xF3,  0xAF,  0x00);
  }

  if (accVal > -3 && accVal <= -2) {
    //G-SENSOR:
    //-0.2G
    //:          ##:
    CanSend81(0xA394021,  0x30,  0x2,   0x4B,  0x97,  0x90,  0x65,  0xE6,  0x9D);
    CanSend82(0xA394021,  0x31,  0x2,   0xEB,  0xFE,  0x41,  0x2C,  0x34,  0xBF);
    CanSend83(0xA394021,  0x32,  0x2,   0xE8,  0x00,  0x00,  0x00,  0x00,  0x00);
    CanSend84(0xA394021,  0x33,  0x2,   0x00,  0x00,  0x3C,  0xF3,  0xAF,  0x00);
  }

  if (accVal > -4 && accVal <= -3) {
    //G-SENSOR:
    //-0.3G
    //:         ###:
    CanSend81(0xA394021,  0x30,  0x2,   0x4B,  0x97,  0x90,  0x65,  0xE6,  0x9D);
    CanSend82(0xA394021,  0x31,  0x2,   0xEB,  0xFE,  0x41,  0x2C,  0x44,  0xBF);
    CanSend83(0xA394021,  0x32,  0x2,   0xE8,  0x00,  0x00,  0x00,  0x00,  0x00);
    CanSend84(0xA394021,  0x33,  0x2,   0x00,  0x0F,  0x3C,  0xF3,  0xAF,  0x00);
  }

  if (accVal > -5 && accVal <= -4) {
    //G-SENSOR:
    //-0.4G
    //:        ####:
    CanSend81(0xA394021,  0x30,  0x2,   0x4B,  0x97,  0x90,  0x65,  0xE6,  0x9D);
    CanSend82(0xA394021,  0x31,  0x2,   0xEB,  0xFE,  0x41,  0x2C,  0x54,  0xBF);
    CanSend83(0xA394021,  0x32,  0x2,   0xE8,  0x00,  0x00,  0x00,  0x00,  0x00);
    CanSend84(0xA394021,  0x33,  0x2,   0x03,  0xCF,  0x3C,  0xF3,  0xAF,  0x00);
  }

  if (accVal > -6 && accVal <= -5) {
    //G-SENSOR:
    //-0.5G
    //:       #####:
    CanSend81(0xA394021,  0x30,  0x2,   0x4B,  0x97,  0x90,  0x65,  0xE6,  0x9D);
    CanSend82(0xA394021,  0x31,  0x2,   0xEB,  0xFE,  0x41,  0x2C,  0x64,  0xBF);
    CanSend83(0xA394021,  0x32,  0x2,   0xE8,  0x00,  0x00,  0x00,  0x00,  0x00);
    CanSend84(0xA394021,  0x33,  0x2,   0xF3,  0xCF,  0x3C,  0xF3,  0xAF,  0x00);
  }

  if (accVal > -7 && accVal <= -6) {
    //G-SENSOR:
    //-0.6G
    //:      ######:
    CanSend81(0xA394021,  0x30,  0x2,   0x4B,  0x97,  0x90,  0x65,  0xE6,  0x9D);
    CanSend82(0xA394021,  0x31,  0x2,   0xEB,  0xFE,  0x41,  0x2C,  0x74,  0xBF);
    CanSend83(0xA394021,  0x32,  0x2,   0xE8,  0x00,  0x00,  0x00,  0x00,  0x3C);
    CanSend84(0xA394021,  0x33,  0x2,   0xF3,  0xCF,  0x3C,  0xF3,  0xAF,  0x00);
  }

  if (accVal > -8 && accVal <= -7) {
    //G-SENSOR:
    //-0.7G
    //:     #######:
    CanSend81(0xA394021,  0x30,  0x2,   0x4B,  0x97,  0x90,  0x65,  0xE6,  0x9D);
    CanSend82(0xA394021,  0x31,  0x2,   0xEB,  0xFE,  0x41,  0x2C,  0x84,  0xBF);
    CanSend83(0xA394021,  0x32,  0x2,   0xE8,  0x00,  0x00,  0x00,  0x0F,  0x3C);
    CanSend84(0xA394021,  0x33,  0x2,   0xF3,  0xCF,  0x3C,  0xF3,  0xAF,  0x00);
  }

  if (accVal > -9 && accVal <= -8) {
    //G-SENSOR:
    //-0.8G
    //:    ########:
    CanSend81(0xA394021,  0x30,  0x2,   0x4B,  0x97,  0x90,  0x65,  0xE6,  0x9D);
    CanSend82(0xA394021,  0x31,  0x2,   0xEB,  0xFE,  0x41,  0x2C,  0x94,  0xBF);
    CanSend83(0xA394021,  0x32,  0x2,   0xE8,  0x00,  0x00,  0x03,  0xCF,  0x3C);
    CanSend84(0xA394021,  0x33,  0x2,   0xF3,  0xCF,  0x3C,  0xF3,  0xAF,  0x00);
  }

  if (accVal > -10 && accVal <= -9) {
    //G-SENSOR:
    //-0.9G
    //:   #########:
    CanSend81(0xA394021,  0x30,  0x2,   0x4B,  0x97,  0x90,  0x65,  0xE6,  0x9D);
    CanSend82(0xA394021,  0x31,  0x2,   0xEB,  0xFE,  0x41,  0x2C,  0xA4,  0xBF);
    CanSend83(0xA394021,  0x32,  0x2,   0xE8,  0x00,  0x00,  0xF3,  0xCF,  0x3C);
    CanSend84(0xA394021,  0x33,  0x2,   0xF3,  0xCF,  0x3C,  0xF3,  0xAF,  0x00);
  }

  if (accVal > -11 && accVal <= -10) {
    //G-SENSOR:
    //-1.0G
    //:  ##########:
    CanSend81(0xA394021,  0x30,  0x2,   0x4B,  0x97,  0x90,  0x65,  0xE6,  0x9D);
    CanSend82(0xA394021,  0x31,  0x2,   0xEB,  0xFE,  0x42,  0x2C,  0x14,  0xBF);
    CanSend83(0xA394021,  0x32,  0x2,   0xE8,  0x00,  0x3C,  0xF3,  0xCF,  0x3C);
    CanSend84(0xA394021,  0x33,  0x2,   0xF3,  0xCF,  0x3C,  0xF3,  0xAF,  0x00);
  }

  //Serial.print("accVal: "); Serial.println(accVal); //Serial.print("  ");
}


void showBOOST() {

  if (boostValue >= 0xD0) {
    //BOOST:
    //+1:2
    //:############:
    CanSend81(0xA394021,  0x30,  0x2,   0x35,  0xA6,  0x9E,  0x7F,  0xAF,  0xF8);
    CanSend82(0xA394021,  0x31,  0x2,   0x08,  0xB0,  0xFF,  0xEB,  0xCF,  0x3C);
    CanSend83(0xA394021,  0x32,  0x2,   0xF3,  0xCF,  0x3C,  0xF3,  0xCF,  0x3C);
    CanSend84(0xA394021,  0x33,  0x2,   0xF3,  0xAF,  0x00,  0x00,  0x00,  0x00);
  }

  if (boostValue >= 0xC0 && boostValue <= 0xCF) {
    //BOOST:
    //+1:1
    //:########### :
    CanSend81(0xA394021,  0x30,  0x2,   0x35,  0xA6,  0x9E,  0x7F,  0xAF,  0xF8);
    CanSend82(0xA394021,  0x31,  0x2,   0x08,  0xB0,  0xBF,  0xEB,  0xCF,  0x3C);
    CanSend83(0xA394021,  0x32,  0x2,   0xF3,  0xCF,  0x3C,  0xF3,  0xCF,  0x3C);
    CanSend84(0xA394021,  0x33,  0x2,   0x03,  0xAF,  0x00,  0x00,  0x00,  0x00);
  }

  if (boostValue >= 0xB0 && boostValue <= 0xBF) {
    //BOOST:
    //+1:0
    //:##########  :
    CanSend81(0xA394021,  0x30,  0x2,   0x35,  0xA6,  0x9E,  0x7F,  0xAF,  0xF8);
    CanSend82(0xA394021,  0x31,  0x2,   0x08,  0xB0,  0x7F,  0xEB,  0xCF,  0x3C);
    CanSend83(0xA394021,  0x32,  0x2,   0xF3,  0xCF,  0x3C,  0xF3,  0xCF,  0x00);
    CanSend84(0xA394021,  0x33,  0x2,   0x03,  0xAF,  0x00,  0x00,  0x00,  0x00);
  }

  if (boostValue >= 0xA0 && boostValue <= 0xAF) {
    //BOOST:
    //+0:9
    //:#########   :
    CanSend81(0xA394021,  0x30,  0x2,   0x35,  0xA6,  0x9E,  0x7F,  0xAF,  0xF8);
    CanSend82(0xA394021,  0x31,  0x2,   0x04,  0xB2,  0xBF,  0xEB,  0xCF,  0x3C);
    CanSend83(0xA394021,  0x32,  0x2,   0xF3,  0xCF,  0x3C,  0xF3,  0xC0,  0x00);
    CanSend84(0xA394021,  0x33,  0x2,   0x03,  0xAF,  0x00,  0x00,  0x00,  0x00);
  }

  if (boostValue >= 0x90 && boostValue <= 0x9F) {
    //BOOST:
    //+0:8
    //:########    :
    CanSend81(0xA394021,  0x30,  0x2,   0x35,  0xA6,  0x9E,  0x7F,  0xAF,  0xF8);
    CanSend82(0xA394021,  0x31,  0x2,   0x04,  0xB2,  0x7F,  0xEB,  0xCF,  0x3C);
    CanSend83(0xA394021,  0x32,  0x2,   0xF3,  0xCF,  0x3C,  0xF0,  0x00,  0x00);
    CanSend84(0xA394021,  0x33,  0x2,   0x03,  0xAF,  0x00,  0x00,  0x00,  0x00);
  }

  if (boostValue >= 0x80 && boostValue <= 0x8F) {
    //BOOST:
    //+0:7
    //:#######     :
    CanSend81(0xA394021,  0x30,  0x2,   0x35,  0xA6,  0x9E,  0x7F,  0xAF,  0xF8);
    CanSend82(0xA394021,  0x31,  0x2,   0x04,  0xB2,  0x3F,  0xEB,  0xCF,  0x3C);
    CanSend83(0xA394021,  0x32,  0x2,   0xF3,  0xCF,  0x3C,  0x00,  0x00,  0x00);
    CanSend84(0xA394021,  0x33,  0x2,   0x03,  0xAF,  0x00,  0x00,  0x00,  0x00);
  }

  if (boostValue >= 0x70 && boostValue <= 0x7F) {
    //BOOST:
    //+0:6
    //:######      :
    CanSend81(0xA394021,  0x30,  0x2,   0x35,  0xA6,  0x9E,  0x7F,  0xAF,  0xF8);
    CanSend82(0xA394021,  0x31,  0x2,   0x04,  0xB1,  0xFF,  0xEB,  0xCF,  0x3C);
    CanSend83(0xA394021,  0x32,  0x2,   0xF3,  0xCF,  0x00,  0x00,  0x00,  0x00);
    CanSend84(0xA394021,  0x33,  0x2,   0x03,  0xAF,  0x00,  0x00,  0x00,  0x00);
  }

  if (boostValue >= 0x60 && boostValue <= 0x6F) {
    //BOOST:
    //+0:5
    //:#####       :
    CanSend81(0xA394021,  0x30,  0x2,   0x35,  0xA6,  0x9E,  0x7F,  0xAF,  0xF8);
    CanSend82(0xA394021,  0x31,  0x2,   0x04,  0xB1,  0xBF,  0xEB,  0xCF,  0x3C);
    CanSend83(0xA394021,  0x32,  0x2,   0xF3,  0xC0,  0x00,  0x00,  0x00,  0x00);
    CanSend84(0xA394021,  0x33,  0x2,   0x03,  0xAF,  0x00,  0x00,  0x00,  0x00);
  }

  if (boostValue >= 0x50 && boostValue <= 0x5F) {
    //BOOST:
    //+0:4
    //:####        :
    CanSend81(0xA394021,  0x30,  0x2,   0x35,  0xA6,  0x9E,  0x7F,  0xAF,  0xF8);
    CanSend82(0xA394021,  0x31,  0x2,   0x04,  0xB1,  0x7F,  0xEB,  0xCF,  0x3C);
    CanSend83(0xA394021,  0x32,  0x2,   0xF0,  0x00,  0x00,  0x00,  0x00,  0x00);
    CanSend84(0xA394021,  0x33,  0x2,   0x03,  0xAF,  0x00,  0x00,  0x00,  0x00);
  }

  if (boostValue >= 0x40 && boostValue <= 0x4F) {
    //BOOST:
    //+0:3
    //:###         :
    CanSend81(0xA394021,  0x30,  0x2,   0x35,  0xA6,  0x9E,  0x7F,  0xAF,  0xF8);
    CanSend82(0xA394021,  0x31,  0x2,   0x04,  0xB1,  0x3F,  0xEB,  0xCF,  0x3C);
    CanSend83(0xA394021,  0x32,  0x2,   0x00,  0x00,  0x00,  0x00,  0x00,  0x00);
    CanSend84(0xA394021,  0x33,  0x2,   0x03,  0xAF,  0x00,  0x00,  0x00,  0x00);
  }

  if (boostValue >= 0x30 && boostValue <= 0x3F) {
    //BOOST:
    //+0:2
    //:##          :
    CanSend81(0xA394021,  0x30,  0x2,   0x35,  0xA6,  0x9E,  0x7F,  0xAF,  0xF8);
    CanSend82(0xA394021,  0x31,  0x2,   0x04,  0xB0,  0xFF,  0xEB,  0xCF,  0x00);
    CanSend83(0xA394021,  0x32,  0x2,   0x00,  0x00,  0x00,  0x00,  0x00,  0x00);
    CanSend84(0xA394021,  0x33,  0x2,   0x03,  0xAF,  0x00,  0x00,  0x00,  0x00);
  }

  if (boostValue >= 0x20 && boostValue <= 0x2F) {
    //BOOST:
    //+0:1
    //:#           :
    CanSend81(0xA394021,  0x30,  0x2,   0x35,  0xA6,  0x9E,  0x7F,  0xAF,  0xF8);
    CanSend82(0xA394021,  0x31,  0x2,   0x04,  0xB0,  0xBF,  0xEB,  0xC0,  0x00);
    CanSend83(0xA394021,  0x32,  0x2,   0x00,  0x00,  0x00,  0x00,  0x00,  0x00);
    CanSend84(0xA394021,  0x33,  0x2,   0x03,  0xAF,  0x00,  0x00,  0x00,  0x00);
  }

  if (boostValue <= 0x1F) {
    //BOOST:
    //+0:0
    //:            :
    CanSend81(0xA394021,  0x30,  0x2,   0x35,  0xA6,  0x9E,  0x7F,  0xAF,  0xF8);
    CanSend82(0xA394021,  0x31,  0x2,   0x04,  0xB0,  0x7F,  0xE8,  0x00,  0x00);
    CanSend83(0xA394021,  0x32,  0x2,   0x00,  0x00,  0x00,  0x00,  0x00,  0x00);
    CanSend84(0xA394021,  0x33,  0x2,   0x03,  0xAF,  0x00,  0x00,  0x00,  0x00);
  }

  //Serial.print("BOOST: ");
  //Serial.println(boostValue);
}


//--------------------------------------------------------------------------------------------------------------------------------------
void gmerajLEDamiPodswietlenia() {
  if (stanDRZWI == 3) {
    for (int x = 0; x < 10 ; x++) {
      pixelsKIE.setPixelColor(x, pixelsKIE.Color(white, white, white));
      pixelsPAS.setPixelColor(x, pixelsPAS.Color(white, white, white));
    }
    pixelsKIE.show();
    pixelsPAS.show();
    delay(delayval);
  }

  if (stanDRZWI == 2) {
    for (int x = 0; x < 10 ; x++) {
      pixelsKIE.setPixelColor(x, pixelsKIE.Color(orange, orange / 5, 0));
      pixelsPAS.setPixelColor(x, pixelsPAS.Color(white, white, white));
    }
    pixelsKIE.show();
    pixelsPAS.show();
    delay(delayval);
  }

  if (stanDRZWI == 1) {
    for (int x = 0; x < 10 ; x++) {
      pixelsKIE.setPixelColor(x, pixelsKIE.Color(white, white, white));
      pixelsPAS.setPixelColor(x, pixelsPAS.Color(orange, orange / 5, 0));
    }
    pixelsKIE.show();
    pixelsPAS.show();
    delay(delayval);
  }

  if (stanDRZWI == 0) {
    for (int x = 0; x < 10 ; x++) {
      pixelsKIE.setPixelColor(x, pixelsKIE.Color(orange, orange / 5, 0));
      pixelsPAS.setPixelColor(x, pixelsPAS.Color(orange, orange / 5, 0));
    }
    pixelsKIE.show();
    pixelsPAS.show();
    delay(delayval);
  }
  Serial.println("gmeral w glownej funkcji");

}


void gmerajLEDami() {
  //------------------------------------------------- przypadki pierwszej diody
  // pierwszy if jak przycisk wciskamy to gasnie czerwone i zapala sie zielone
  if (pas1 == 1 && flag1 == 0) {
    for (i = a; i >= 0 ; i--) {
      pixels1.setPixelColor(0, pixels1.Color(i, 0, 0));
      pixels1.show();
      delay(delayval);
    }
    for (i = 0; i < a ; i++) {
      pixels1.setPixelColor(0, pixels1.Color(0, i, 0));
      pixels1.show();
      delay(delayval);
    }
    flag1 = 1;
    //Serial.println("gmeram ledami PASÓW local 1");
  }
  // drugi if jak przycisk rozlaczamy to gasnie zielone i zapala sie czerwone
  if (pas1 == 0 && flag1 == 1) {
    for (i = a; i >= 0 ; i--) {
      pixels1.setPixelColor(0, pixels1.Color(0, i, 0));
      pixels1.show();
      delay(delayval);
    }
    for (i = 0; i < a ; i++) {
      pixels1.setPixelColor(0, pixels1.Color(i, 0, 0));
      pixels1.show();
      delay(delayval);
    }
    flag1 = 0;
    //Serial.println("gmeram ledami PASÓW local 2");
  }
  //------------------------------------------------- przypadki drugiej diody
  if (pas2 == 1 && flag2 == 0) {
    for (i = a; i >= 0 ; i--) {
      pixels2.setPixelColor(0, pixels2.Color(i, 0, 0));
      pixels2.show();
      delay(delayval);
    }
    for (i = 0; i < a ; i++) {
      pixels2.setPixelColor(0, pixels2.Color(0, i, 0));
      pixels2.show();
      delay(delayval);
    }
    flag2 = 1;
  }
  if (pas2 == 0 && flag2 == 1) {
    for (i = a; i >= 0 ; i--) {
      pixels2.setPixelColor(0, pixels2.Color(0, i, 0));
      pixels2.show();
      delay(delayval);
    }
    for (i = 0; i < a ; i++) {
      pixels2.setPixelColor(0, pixels2.Color(i, 0, 0));
      pixels2.show();
      delay(delayval);
    }
    flag2 = 0;
  }
  //------------------------------------------------- przypadki trzeciej diody
  if (pas3 == 1 && flag3 == 0) {
    for (i = a; i >= 0 ; i--) {
      pixels3.setPixelColor(0, pixels3.Color(i, 0, 0));
      pixels3.show();
      delay(delayval);
    }
    for (i = 0; i < a ; i++) {
      pixels3.setPixelColor(0, pixels3.Color(0, i, 0));
      pixels3.show();
      delay(delayval);
    }
    flag3 = 1;
  }
  if (pas3 == 0 && flag3 == 1) {
    for (i = a; i >= 0 ; i--) {
      pixels3.setPixelColor(0, pixels3.Color(0, i, 0));
      pixels3.show();
      delay(delayval);
    }
    for (i = 0; i < a ; i++) {
      pixels3.setPixelColor(0, pixels3.Color(i, 0, 0));
      pixels3.show();
      delay(delayval);
    }
    flag3 = 0;
  }
  //------------------------------------------------- przypadki czwartej diody
  if (pas4 == 1 && flag4 == 0) {
    for (i = a; i >= 0 ; i--) {
      pixels4.setPixelColor(0, pixels4.Color(i, 0, 0));
      pixels4.show();
      delay(delayval);
    }
    for (i = 0; i < a ; i++) {
      pixels4.setPixelColor(0, pixels4.Color(0, i, 0));
      pixels4.show();
      delay(delayval);
    }
    flag4 = 1;
  }
  if (pas4 == 0 && flag4 == 1) {
    for (i = a; i >= 0 ; i--) {
      pixels4.setPixelColor(0, pixels4.Color(0, i, 0));
      pixels4.show();
      delay(delayval);
    }
    for (i = 0; i < a ; i++) {
      pixels4.setPixelColor(0, pixels4.Color(i, 0, 0));
      pixels4.show();
      delay(delayval);
    }
    flag4 = 0;
  }
  Serial.println("gmeram ledami PASÓW global");
}

//--------------------------------------------------------------------------------------------------------------------------------------
void wygasLEDyPodswietlenia() {
  for (int i = 0; i < 10; i++) {
    pixelsKIE.setPixelColor(i, pixelsKIE.Color(0, 0, 0) );
    pixelsPAS.setPixelColor(i, pixelsPAS.Color(0, 0, 0) );
    delay(10 * delayval);
  }
  pixelsKIE.show();
  pixelsPAS.show();
}

//--------------------------------------------------------------------------------------------------------------------------------------
void wygasLEDy() {

  if (pas1 == 0 && pas2 == 0 && pas3 == 0 && pas4 == 0) {
    for (i = a; i >= 0 ; i--) {
      pixels1.setPixelColor(0, pixels1.Color(i, 0, 0));
      pixels2.setPixelColor(0, pixels2.Color(i, 0, 0));
      pixels3.setPixelColor(0, pixels3.Color(i, 0, 0));
      pixels4.setPixelColor(0, pixels4.Color(i, 0, 0));
      pixels1.show();
      pixels2.show();
      pixels3.show();
      pixels4.show();
      delay(delayval);
    }
  }
  if (pas1 == 1 && pas2 == 0 && pas3 == 0 && pas4 == 0) {
    for (i = a; i >= 0 ; i--) {
      pixels1.setPixelColor(0, pixels1.Color(0, i, 0));
      pixels2.setPixelColor(0, pixels2.Color(i, 0, 0));
      pixels3.setPixelColor(0, pixels3.Color(i, 0, 0));
      pixels4.setPixelColor(0, pixels4.Color(i, 0, 0));
      pixels1.show();
      pixels2.show();
      pixels3.show();
      pixels4.show();
      delay(delayval);
    }
  }
  if (pas1 == 0 && pas2 == 1 && pas3 == 0 && pas4 == 0) {
    for (i = a; i >= 0 ; i--) {
      pixels1.setPixelColor(0, pixels1.Color(i, 0, 0));
      pixels2.setPixelColor(0, pixels2.Color(0, i, 0));
      pixels3.setPixelColor(0, pixels3.Color(i, 0, 0));
      pixels4.setPixelColor(0, pixels4.Color(i, 0, 0));
      pixels1.show();
      pixels2.show();
      pixels3.show();
      pixels4.show();
      delay(delayval);
    }
  }
  if (pas1 == 0 && pas2 == 0 && pas3 == 1 && pas4 == 0) {
    for (i = a; i >= 0 ; i--) {
      pixels1.setPixelColor(0, pixels1.Color(i, 0, 0));
      pixels2.setPixelColor(0, pixels2.Color(i, 0, 0));
      pixels3.setPixelColor(0, pixels3.Color(0, i, 0));
      pixels4.setPixelColor(0, pixels4.Color(i, 0, 0));
      pixels1.show();
      pixels2.show();
      pixels3.show();
      pixels4.show();
      delay(delayval);
    }
  }
  if (pas1 == 0 && pas2 == 0 && pas3 == 0 && pas4 == 1) {
    for (i = a; i >= 0 ; i--) {
      pixels1.setPixelColor(0, pixels1.Color(i, 0, 0));
      pixels2.setPixelColor(0, pixels2.Color(i, 0, 0));
      pixels3.setPixelColor(0, pixels3.Color(i, 0, 0));
      pixels4.setPixelColor(0, pixels4.Color(0, i, 0));
      pixels1.show();
      pixels2.show();
      pixels3.show();
      pixels4.show();
      delay(delayval);
    }
  }
  if (pas1 == 1 && pas2 == 1 && pas3 == 0 && pas4 == 0) {
    for (i = a; i >= 0 ; i--) {
      pixels1.setPixelColor(0, pixels1.Color(0, i, 0));
      pixels2.setPixelColor(0, pixels2.Color(0, i, 0));
      pixels3.setPixelColor(0, pixels3.Color(i, 0, 0));
      pixels4.setPixelColor(0, pixels4.Color(i, 0, 0));
      pixels1.show();
      pixels2.show();
      pixels3.show();
      pixels4.show();
      delay(delayval);
    }
  }
  if (pas1 == 1 && pas2 == 0 && pas3 == 1 && pas4 == 0) {
    for (i = a; i >= 0 ; i--) {
      pixels1.setPixelColor(0, pixels1.Color(0, i, 0));
      pixels2.setPixelColor(0, pixels2.Color(i, 0, 0));
      pixels3.setPixelColor(0, pixels3.Color(0, i, 0));
      pixels4.setPixelColor(0, pixels4.Color(i, 0, 0));
      pixels1.show();
      pixels2.show();
      pixels3.show();
      pixels4.show();
      delay(delayval);
    }
  }
  if (pas1 == 1 && pas2 == 0 && pas3 == 0 && pas4 == 1) {
    for (i = a; i >= 0 ; i--) {
      pixels1.setPixelColor(0, pixels1.Color(0, i, 0));
      pixels2.setPixelColor(0, pixels2.Color(i, 0, 0));
      pixels3.setPixelColor(0, pixels3.Color(i, 0, 0));
      pixels4.setPixelColor(0, pixels4.Color(0, i, 0));
      pixels1.show();
      pixels2.show();
      pixels3.show();
      pixels4.show();
      delay(delayval);
    }
  }
  if (pas1 == 0 && pas2 == 1 && pas3 == 1 && pas4 == 0) {
    for (i = a; i >= 0 ; i--) {
      pixels1.setPixelColor(0, pixels1.Color(i, 0, 0));
      pixels2.setPixelColor(0, pixels2.Color(0, i, 0));
      pixels3.setPixelColor(0, pixels3.Color(0, i, 0));
      pixels4.setPixelColor(0, pixels4.Color(i, 0, 0));
      pixels1.show();
      pixels2.show();
      pixels3.show();
      pixels4.show();
      delay(delayval);
    }
  }
  if (pas1 == 0 && pas2 == 1 && pas3 == 0 && pas4 == 1) {
    for (i = a; i >= 0 ; i--) {
      pixels1.setPixelColor(0, pixels1.Color(i, 0, 0));
      pixels2.setPixelColor(0, pixels2.Color(0, i, 0));
      pixels3.setPixelColor(0, pixels3.Color(i, 0, 0));
      pixels4.setPixelColor(0, pixels4.Color(0, i, 0));
      pixels1.show();
      pixels2.show();
      pixels3.show();
      pixels4.show();
      delay(delayval);
    }
  }
  if (pas1 == 0 && pas2 == 0 && pas3 == 1 && pas4 == 1) {
    for (i = a; i >= 0 ; i--) {
      pixels1.setPixelColor(0, pixels1.Color(i, 0, 0));
      pixels2.setPixelColor(0, pixels2.Color(i, 0, 0));
      pixels3.setPixelColor(0, pixels3.Color(0, i, 0));
      pixels4.setPixelColor(0, pixels4.Color(0, i, 0));
      pixels1.show();
      pixels2.show();
      pixels3.show();
      pixels4.show();
      delay(delayval);
    }
  }
  if (pas1 == 1 && pas2 == 1 && pas3 == 1 && pas4 == 0) {
    for (i = a; i >= 0 ; i--) {
      pixels1.setPixelColor(0, pixels1.Color(0, i, 0));
      pixels2.setPixelColor(0, pixels2.Color(0, i, 0));
      pixels3.setPixelColor(0, pixels3.Color(0, i, 0));
      pixels4.setPixelColor(0, pixels4.Color(i, 0, 0));
      pixels1.show();
      pixels2.show();
      pixels3.show();
      pixels4.show();
      delay(delayval);
    }
  }
  if (pas1 == 1 && pas2 == 1 && pas3 == 0 && pas4 == 1) {
    for (i = a; i >= 0 ; i--) {
      pixels1.setPixelColor(0, pixels1.Color(0, i, 0));
      pixels2.setPixelColor(0, pixels2.Color(0, i, 0));
      pixels3.setPixelColor(0, pixels3.Color(i, 0, 0));
      pixels4.setPixelColor(0, pixels4.Color(0, i, 0));
      pixels1.show();
      pixels2.show();
      pixels3.show();
      pixels4.show();
      delay(delayval);
    }
  }
  if (pas1 == 1 && pas2 == 0 && pas3 == 1 && pas4 == 1) {
    for (i = a; i >= 0 ; i--) {
      pixels1.setPixelColor(0, pixels1.Color(0, i, 0));
      pixels2.setPixelColor(0, pixels2.Color(i, 0, 0));
      pixels3.setPixelColor(0, pixels3.Color(0, i, 0));
      pixels4.setPixelColor(0, pixels4.Color(0, i, 0));
      pixels1.show();
      pixels2.show();
      pixels3.show();
      pixels4.show();
      delay(delayval);
    }
  }
  if (pas1 == 0 && pas2 == 1 && pas3 == 1 && pas4 == 1) {
    for (i = a; i >= 0 ; i--) {
      pixels1.setPixelColor(0, pixels1.Color(i, 0, 0));
      pixels2.setPixelColor(0, pixels2.Color(0, i, 0));
      pixels3.setPixelColor(0, pixels3.Color(0, i, 0));
      pixels4.setPixelColor(0, pixels4.Color(0, i, 0));
      pixels1.show();
      pixels2.show();
      pixels3.show();
      pixels4.show();
      delay(delayval);
    }
  }
  if (pas1 == 1 && pas2 == 1 && pas3 == 1 && pas4 == 1) {
    for (i = a; i >= 0 ; i--) {
      pixels1.setPixelColor(0, pixels1.Color(0, i, 0));
      pixels2.setPixelColor(0, pixels2.Color(0, i, 0));
      pixels3.setPixelColor(0, pixels3.Color(0, i, 0));
      pixels4.setPixelColor(0, pixels4.Color(0, i, 0));
      pixels1.show();
      pixels2.show();
      pixels3.show();
      pixels4.show();
      delay(delayval);
    }
  }

}

//--------------------------------------------------------------------------------------------------------------------------------------
void oswiecLEDy() {
  //po wygaszeniu ledow, przywracamy je do zycia zgodnie ze stanem ich własnych zmiennych
  if (pas1 == 0 && pas2 == 0 && pas3 == 0 && pas4 == 0) {
    for (i = 0; i < a ; i++) {
      pixels1.setPixelColor(0, pixels1.Color(i, 0, 0));
      pixels2.setPixelColor(0, pixels2.Color(i, 0, 0));
      pixels3.setPixelColor(0, pixels3.Color(i, 0, 0));
      pixels4.setPixelColor(0, pixels4.Color(i, 0, 0));
      pixels1.show();
      pixels2.show();
      pixels3.show();
      pixels4.show();
      delay(delayval);
    }
  }
  if (pas1 == 1 && pas2 == 0 && pas3 == 0 && pas4 == 0) {
    for (i = 0; i < a ; i++) {
      pixels1.setPixelColor(0, pixels1.Color(0, i, 0));
      pixels2.setPixelColor(0, pixels2.Color(i, 0, 0));
      pixels3.setPixelColor(0, pixels3.Color(i, 0, 0));
      pixels4.setPixelColor(0, pixels4.Color(i, 0, 0));
      pixels1.show();
      pixels2.show();
      pixels3.show();
      pixels4.show();
      delay(delayval);
    }
  }
  if (pas1 == 0 && pas2 == 1 && pas3 == 0 && pas4 == 0) {
    for (i = 0; i < a ; i++) {
      pixels1.setPixelColor(0, pixels1.Color(i, 0, 0));
      pixels2.setPixelColor(0, pixels2.Color(0, i, 0));
      pixels3.setPixelColor(0, pixels3.Color(i, 0, 0));
      pixels4.setPixelColor(0, pixels4.Color(i, 0, 0));
      pixels1.show();
      pixels2.show();
      pixels3.show();
      pixels4.show();
      delay(delayval);
    }
  }
  if (pas1 == 0 && pas2 == 0 && pas3 == 1 && pas4 == 0) {
    for (i = 0; i < a ; i++) {
      pixels1.setPixelColor(0, pixels1.Color(i, 0, 0));
      pixels2.setPixelColor(0, pixels2.Color(i, 0, 0));
      pixels3.setPixelColor(0, pixels3.Color(0, i, 0));
      pixels4.setPixelColor(0, pixels4.Color(i, 0, 0));
      pixels1.show();
      pixels2.show();
      pixels3.show();
      pixels4.show();
      delay(delayval);
    }
  }
  if (pas1 == 0 && pas2 == 0 && pas3 == 0 && pas4 == 1) {
    for (i = 0; i < a ; i++) {
      pixels1.setPixelColor(0, pixels1.Color(i, 0, 0));
      pixels2.setPixelColor(0, pixels2.Color(i, 0, 0));
      pixels3.setPixelColor(0, pixels3.Color(i, 0, 0));
      pixels4.setPixelColor(0, pixels4.Color(0, i, 0));
      pixels1.show();
      pixels2.show();
      pixels3.show();
      pixels4.show();
      delay(delayval);
    }
  }
  if (pas1 == 1 && pas2 == 1 && pas3 == 0 && pas4 == 0) {
    for (i = 0; i < a ; i++) {
      pixels1.setPixelColor(0, pixels1.Color(0, i, 0));
      pixels2.setPixelColor(0, pixels2.Color(0, i, 0));
      pixels3.setPixelColor(0, pixels3.Color(i, 0, 0));
      pixels4.setPixelColor(0, pixels4.Color(i, 0, 0));
      pixels1.show();
      pixels2.show();
      pixels3.show();
      pixels4.show();
      delay(delayval);
    }
  }
  if (pas1 == 1 && pas2 == 0 && pas3 == 1 && pas4 == 0) {
    for (i = 0; i < a ; i++) {
      pixels1.setPixelColor(0, pixels1.Color(0, i, 0));
      pixels2.setPixelColor(0, pixels2.Color(i, 0, 0));
      pixels3.setPixelColor(0, pixels3.Color(0, i, 0));
      pixels4.setPixelColor(0, pixels4.Color(i, 0, 0));
      pixels1.show();
      pixels2.show();
      pixels3.show();
      pixels4.show();
      delay(delayval);
    }
  }
  if (pas1 == 1 && pas2 == 0 && pas3 == 0 && pas4 == 1) {
    for (i = 0; i < a ; i++) {
      pixels1.setPixelColor(0, pixels1.Color(0, i, 0));
      pixels2.setPixelColor(0, pixels2.Color(i, 0, 0));
      pixels3.setPixelColor(0, pixels3.Color(i, 0, 0));
      pixels4.setPixelColor(0, pixels4.Color(0, i, 0));
      pixels1.show();
      pixels2.show();
      pixels3.show();
      pixels4.show();
      delay(delayval);
    }
  }
  if (pas1 == 0 && pas2 == 1 && pas3 == 1 && pas4 == 0) {
    for (i = 0; i < a ; i++) {
      pixels1.setPixelColor(0, pixels1.Color(i, 0, 0));
      pixels2.setPixelColor(0, pixels2.Color(0, i, 0));
      pixels3.setPixelColor(0, pixels3.Color(0, i, 0));
      pixels4.setPixelColor(0, pixels4.Color(i, 0, 0));
      pixels1.show();
      pixels2.show();
      pixels3.show();
      pixels4.show();
      delay(delayval);
    }
  }
  if (pas1 == 0 && pas2 == 1 && pas3 == 0 && pas4 == 1) {
    for (i = 0; i < a ; i++) {
      pixels1.setPixelColor(0, pixels1.Color(i, 0, 0));
      pixels2.setPixelColor(0, pixels2.Color(0, i, 0));
      pixels3.setPixelColor(0, pixels3.Color(i, 0, 0));
      pixels4.setPixelColor(0, pixels4.Color(0, i, 0));
      pixels1.show();
      pixels2.show();
      pixels3.show();
      pixels4.show();
      delay(delayval);
    }
  }
  if (pas1 == 0 && pas2 == 0 && pas3 == 1 && pas4 == 1) {
    for (i = 0; i < a ; i++) {
      pixels1.setPixelColor(0, pixels1.Color(i, 0, 0));
      pixels2.setPixelColor(0, pixels2.Color(i, 0, 0));
      pixels3.setPixelColor(0, pixels3.Color(0, i, 0));
      pixels4.setPixelColor(0, pixels4.Color(0, i, 0));
      pixels1.show();
      pixels2.show();
      pixels3.show();
      pixels4.show();
      delay(delayval);
    }
  }
  if (pas1 == 1 && pas2 == 1 && pas3 == 1 && pas4 == 0) {
    for (i = 0; i < a ; i++) {
      pixels1.setPixelColor(0, pixels1.Color(0, i, 0));
      pixels2.setPixelColor(0, pixels2.Color(0, i, 0));
      pixels3.setPixelColor(0, pixels3.Color(0, i, 0));
      pixels4.setPixelColor(0, pixels4.Color(i, 0, 0));
      pixels1.show();
      pixels2.show();
      pixels3.show();
      pixels4.show();
      delay(delayval);
    }
  }
  if (pas1 == 1 && pas2 == 1 && pas3 == 0 && pas4 == 1) {
    for (i = 0; i < a ; i++) {
      pixels1.setPixelColor(0, pixels1.Color(0, i, 0));
      pixels2.setPixelColor(0, pixels2.Color(0, i, 0));
      pixels3.setPixelColor(0, pixels3.Color(i, 0, 0));
      pixels4.setPixelColor(0, pixels4.Color(0, i, 0));
      pixels1.show();
      pixels2.show();
      pixels3.show();
      pixels4.show();
      delay(delayval);
    }
  }
  if (pas1 == 1 && pas2 == 0 && pas3 == 1 && pas4 == 1) {
    for (i = 0; i < a ; i++) {
      pixels1.setPixelColor(0, pixels1.Color(0, i, 0));
      pixels2.setPixelColor(0, pixels2.Color(i, 0, 0));
      pixels3.setPixelColor(0, pixels3.Color(0, i, 0));
      pixels4.setPixelColor(0, pixels4.Color(0, i, 0));
      pixels1.show();
      pixels2.show();
      pixels3.show();
      pixels4.show();
      delay(delayval);
    }
  }
  if (pas1 == 0 && pas2 == 1 && pas3 == 1 && pas4 == 1) {
    for (i = 0; i < a ; i++) {
      pixels1.setPixelColor(0, pixels1.Color(i, 0, 0));
      pixels2.setPixelColor(0, pixels2.Color(0, i, 0));
      pixels3.setPixelColor(0, pixels3.Color(0, i, 0));
      pixels4.setPixelColor(0, pixels4.Color(0, i, 0));
      pixels1.show();
      pixels2.show();
      pixels3.show();
      pixels4.show();
      delay(delayval);
    }
  }
  if (pas1 == 1 && pas2 == 1 && pas3 == 1 && pas4 == 1) {
    for (i = 0; i < a ; i++) {
      pixels1.setPixelColor(0, pixels1.Color(0, i, 0));
      pixels2.setPixelColor(0, pixels2.Color(0, i, 0));
      pixels3.setPixelColor(0, pixels3.Color(0, i, 0));
      pixels4.setPixelColor(0, pixels4.Color(0, i, 0));
      pixels1.show();
      pixels2.show();
      pixels3.show();
      pixels4.show();
      delay(delayval);
    }
  }

}

//--------------------------------------------------------------------------------------------------------------------------------------



void CanSend81(unsigned long address, byte a, byte b, byte c, byte d, byte e, byte f, byte g, byte h) {
  if ( send81 == true ) {
    send81 = false;
    DataToSend81[0] = {a}; DataToSend81[1] = {b}; DataToSend81[2] = {c}; DataToSend81[3] = {d}; DataToSend81[4] = {e}; DataToSend81[5] = {f}; DataToSend81[6] = {g}; DataToSend81[7] = {h};
    address81 = address;
    tCanSend81.begin(CANinterval);
  }
}

void CanSend82(unsigned long address, byte a, byte b, byte c, byte d, byte e, byte f, byte g, byte h) {
  if ( send82 == true ) {
    send82 = false;
    DataToSend82[0] = {a}; DataToSend82[1] = {b}; DataToSend82[2] = {c}; DataToSend82[3] = {d}; DataToSend82[4] = {e}; DataToSend82[5] = {f}; DataToSend82[6] = {g}; DataToSend82[7] = {h};
    address82 = address;
    tCanSend82.begin(2 * CANinterval);
  }
}

void CanSend83(unsigned long address, byte a, byte b, byte c, byte d, byte e, byte f, byte g, byte h) {
  if ( send83 == true ) {
    send83 = false;
    DataToSend83[0] = {a}; DataToSend83[1] = {b}; DataToSend83[2] = {c}; DataToSend83[3] = {d}; DataToSend83[4] = {e}; DataToSend83[5] = {f}; DataToSend83[6] = {g}; DataToSend83[7] = {h};
    address83 = address;
    tCanSend83.begin(3 * CANinterval);
  }
}

void CanSend84(unsigned long address, byte a, byte b, byte c, byte d, byte e, byte f, byte g, byte h) {
  if ( send84 == true ) {
    send84 = false;
    DataToSend84[0] = {a}; DataToSend84[1] = {b}; DataToSend84[2] = {c}; DataToSend84[3] = {d}; DataToSend84[4] = {e}; DataToSend84[5] = {f}; DataToSend84[6] = {g}; DataToSend84[7] = {h};
    address84 = address;
    tCanSend84.begin(4 * CANinterval);
  }
}

void CanSend85(unsigned long address, byte a, byte b, byte c, byte d, byte e, byte f, byte g, byte h) {
  if ( send85 == true ) {
    send85 = false;
    DataToSend85[0] = {a}; DataToSend85[1] = {b}; DataToSend85[2] = {c}; DataToSend85[3] = {d}; DataToSend85[4] = {e}; DataToSend85[5] = {f}; DataToSend85[6] = {g}; DataToSend85[7] = {h};
    address85 = address;
    tCanSend85.begin(5 * CANinterval);
  }
}



Góra
 Profil  
 
 
 Post #854719 Wysłany: 19 Gru 2020, 01:18; 
 Temat postu: Re: Grande Punto CAN BUS (Can-A/Can-B) - Arduino + Shield
Offline
Forumowicz

Imię: Karol
Samochód: Bravo
Silnik: Inny
Paliwo: Benzyna + LPG
Wersja: Active
Województwo: małopolskie [K]
Rejestracja: 19 Gru 2020,
Posty: 2
Cześć :)
Możesz powiedzieć, skąd brałeś sygnał wolniejszej magistrali can-a/b?
On jest też dostępny na złączu obd? Bo z tego co patrzę po pinoucie, to na pinach 6 i 14 jest can, ale piszą, że to HS-can, więc rozumiem, że to ta szybsza?

https://pinoutguide.com/dev/Fiat/Bravo/

Właściwie to chciałbym odczytać tylko prędkość i wypisać ją na ekranie licznika, ew. odczytać przyciski kierownicy multimedialnej, więc po przeczytaniu Twojego kodu widzę, że potrzebuję połączyć się tylko z wolniejszą CAN ;).


Góra
 Profil  
 
 
 Post #854720 Wysłany: 19 Gru 2020, 02:01; 
 Temat postu: Re: Grande Punto CAN BUS (Can-A/Can-B) - Arduino + Shield
Offline
Puntoświr
Awatar użytkownika

Samochód: Punto Evo 3d
Silnik: 1.4 8V 77KM
Paliwo: Benzyna + LPG
Wersja: MyLive
Województwo: śląskie [S]
Rejestracja: 22 Paź 2014,
Posty: 834
Pomógł: 27
Temat umarł bo czasu brak. Pobawiłem się szyną CAN, ale poza samochodem, a tam mam dowolność. Materiały jak najbardziej się przydadzą jak tylko wrócę do tematu.

Co do szyn to są obie dostępne na złączu OBD. Np. do silnika podłącza się interfejs bezpośrednio do gniazda OBD, a do niektórych innych sterowników poprzez przejściówkę (żółtą), która przekierowuje CAN H i CAN L na inne piny gniazda. Schematy przejściówek są w necie. Do Punta wystarczy przejściówka żółta.
https://viaken.pl/pl/adapter-do-interfe ... zolty.html - po schemacie można ustalić które to są piny.


Góra
 Profil  
 
 
 Post #854722 Wysłany: 19 Gru 2020, 08:26; 
 Temat postu: Re: Grande Punto CAN BUS (Can-A/Can-B) - Arduino + Shield
Offline
Puntoświr
Awatar użytkownika

Imię: Radek
Samochód: Grande Punto 3d
Silnik: Inny
Paliwo: Benzyna + LPG
Wersja: Dynamic
Województwo: śląskie [S]
Rejestracja: 19 Sie 2017,
Posty: 695
Pomógł: 2
volender, Tutaj masz odczyt prędkości z can 50, piny w OBD2 to 2 i 9.


Załączniki:

Góra
 Profil  
 
 
 Post #854728 Wysłany: 20 Gru 2020, 01:05; 
 Temat postu: Re: Grande Punto CAN BUS (Can-A/Can-B) - Arduino + Shield
Offline
Forumowicz

Imię: Karol
Samochód: Bravo
Silnik: Inny
Paliwo: Benzyna + LPG
Wersja: Active
Województwo: małopolskie [K]
Rejestracja: 19 Gru 2020,
Posty: 2
O, super, dzięki wielkie! Z tego pinoutu to wydawało mi się, że jest tylko szybsza can i jakieś linie K do różnych podzespołów ;)

A odnośnie tego, że podobno ta tania płytka z MCP2515 + TJA1050 nie działa z Fiatem, to sprawdzone info?

Tak patrzę w kod tutaj w wątku, i can jest inicjalizowany przez:
Kod:
CANslow.begin(CAN_50KBPS)


natomiast patrząc w kodzie biblioteki mcp_can, można inicjalizować ją z podaniem prędkości oscylatora:
Kod:
CAN0.begin(MCP_ANY, CAN_500KBPS, MCP_16MHZ)


a ta tania płytka ma 8MHz zamiast 16MHz jak w tym pełnym can arduino shield... może to było przyczyną problemów? ;-)


Góra
 Profil  
 
Wyświetl posty z poprzednich:  Sortuj według  
Napisz nowy temat Odpowiedz  [ 121 posty(ów) ]  Idź do strony Poprzednia  1, 2, 3, 4, 5  Następna


Wszystkie czasy w strefie UTC + 1 godzina (czas letni)


Nie możesz zakładać nowych tematów na tym forum
Nie możesz odpowiadać w tematach na tym forum
Nie możesz edytować swoich postów na tym forum
Nie możesz usuwać swoich postów na tym forum
Nie możesz dodawać załączników na tym forum

Szukaj:
Skocz do:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Style based on FI Subsilver by phpBBservice.nl
Forum Fiata Punto © 2006 - 2020
Tłumaczenie: phpbbhelp.pl
phpBB SEO