Witam
Pracuję nad projektem symulującym magistralę CAN-BUS w samochodzie.
Jako że kierunkowskazy są sterowane po magistrali, postanowiłem napisać program, który na podstawie odpowiednio wciśniętego przycisku podłączonego do konkretnego wyjścia cyfrowego będzie podstawiał we wskazane miejsce daną wartość w czasie rzeczywistym.
Pomysł OK, dla trzech kierunkowskazów działa, tj. Prawy, Lewy, i Awaryjne. Natomiast problem jest taki, że jeśli instrukcję IF rozbuduję o np. kolejne 4 opcje program tak jakby się zapętla, czy coś w tym stylu i na wejściu podstawia wartość z trzeciego warunku,więc cały czas miga kierunkowskaz lewy przykładowo.
Natomiast jeżeli wcisnę button od kierunkowskazu prawego to działa, ale jeśli wcisnę kolejną wartość to już nie działa. Wniosek ==> program działa dla pierwszych trzech wejść cyfrowych 0, 1 i 2, dla reszty nie działa. Próbowałem z instrukcją switch case, jak i różnymi wariantami IF ELSE, problem wciąż ten sam. Nie wiem gdzie popełniam błąd. Będę bardzo wdzięczny za udzielenie porady.
Użyte piny cyfrowe:
//#################wejscia cyfrowe#################
int st0 = 0;
int st1 = 1;
int st2 = 2;
int st3 = 3;
int st4 = 4;
int st5 = 5;
int st6 = 6;
....
void setup()
{
pinMode(st0, INPUT_PULLUP);
pinMode(st1, INPUT_PULLUP);
pinMode(st2, INPUT_PULLUP);
pinMode(st3, INPUT_PULLUP);
pinMode(st4, INPUT_PULLUP);
pinMode(st5, INPUT_PULLUP);
pinMode(st6, INPUT_PULLUP);
......
Pętla wstawiająca wartość konkretnego bitu sygnału CAN-BUS:
if (digitalRead(st0) == LOW)
{
program1();
}else if (digitalRead(st1) == LOW)
{
program2();
}else if (digitalRead(st2) == LOW)
{
program3();
}else if (digitalRead(st3) == LOW)
{
program4();
}else if (digitalRead(st5) == LOW)
{
program6();
}else if (digitalRead(st4) == LOW)
{
program5();
}else
{
program0();
}
Ja "wyrzuciłem" wszystkie warianty poza główną pętlę, tworząc podprogramy:
//###############podprogramy###############
void program0()
{
turning_light = 0;
c_1 = 0;
c_2 = 0;
c_3 = 0;
c_4 = 0;
c_5 = 0;
c_6 = 0;
}
//############### kierunkowskaz lewy###############
void program1()
{
if(c_1 == 7)
{
turning_light = 1;
c_1 = c_1 + 1;
}else if(c_1 == 14)
{
turning_light = 0;
c_1 = 0;
}else{
c_1 = c_1 + 1;
}
}
//###############kierunkowskaz prawy###############
void program2()
{
if(c_2 == 7)
{
turning_light = 2;
c_2 = c_2 + 1;
}else if(c_2 == 14)
{
turning_light = 0;
c_2 = 0;
}else{
c_2 = c_2 + 1;
}
}
//###############swiatła awaryjne###############
void program3()
{
if(c_3 == 7)
{
turning_light = 3;
c_3 = c_3 + 1;
}else if(c_3 == 14)
{
turning_light = 0;
c_3 = 0;
}else{
c_3 = c_3 + 1;
}
}
//###############kierunkowskaz lewy przyczepy###############
void program4()
{
if(c_4 == 7)
{
turning_light = 6;
c_4 = c_4 + 1;
}else if(c_4 == 14)
{
turning_light = 0;
c_4 = 0;
}else{
c_4 = c_4 + 1;
}
}
//###############kierunkowskaz prawy przyczepy###############
void program5()
{
if(c_5 == 7)
{
turning_light = 7;
c_5 = c_5 + 1;
}else if(c_5 == 14)
{
turning_light = 0;
c_5 = 0;
}else{
c_5 = c_5 + 1;
}
}
//############### światła awaryjne przyczepy###############
void program6()
{
if(c_6 == 7)
{
turning_light = 8;
c_6 = c_6 + 1;
}else if(c_6 == 14)
{
turning_light = 0;
c_6 = 0;
}else{
c_6 = c_6 + 1;
}
}
Zmienna turning_lights ma właśnie przybierać zakodowane prze zemnie wartości.