Sari la conținut
ELFORUM - Forumul electronistilor

Semnalizare auto cu Arduino UNO


Vizitator Paul Galbinasu

Postări Recomandate

Vizitator Paul Galbinasu

Salut!

Am realizat un montaj cu Arduino UNO pentru a comanda partea de semnalizare si avarii pentru un cart, am scris si codul pentru functionarea acestuia, pe simulator merge ok, dar vreau sa mai adaug un buton si cateva leduri pentru luminile de frana. Deoarece sunt incepator in programare vreau sa ma ajutati sa adaug in program liniile necesare pentru a comanda ledurile de frana independent de starea ledurilor de semnalizare sau avarii.

Va multumesc.

 

O simulare in Proteus si explicatiile proiectului am pus pe You-Tube si o puteti viziona aici: https://youtu.be/69j9pz3g7NU

 

Codul pentru Arduino este aici:


// Semnalizare simpla cu 2 butoane si 3 functii// // Made by Galbinasu Paul   int led = 13;  // input pin for the LED  int led1 = 12;  // input pin for the LED  int led2 = 11;  // input pin for the LED  int led3 = 10;  // input pin for the LED  int led4 = 9;  // input pin for the LED  int led5 = 8;  // input pin for the LED  int led6 = 7;  // input pin for the LED  int led7 = 6;  // input pin for the LED  int led8 = 5;  // input pin for the LED  int led9 = 4;  // input pin for the LED  int buton1 = 3; // pin intrare semnalizare stanga  int buton = 2; // pin intrare semnalizare dreapta void setup() {  pinMode(buton1, INPUT);  pinMode(buton, INPUT);  pinMode(led, OUTPUT);  pinMode(led1, OUTPUT);  pinMode(led2, OUTPUT);  pinMode(led3, OUTPUT);  pinMode(led4, OUTPUT);  pinMode(led5, OUTPUT);  pinMode(led6, OUTPUT);  pinMode(led7, OUTPUT);  pinMode(led8, OUTPUT);  pinMode(led9, OUTPUT);  digitalWrite(buton,1); // 1=HIGH, 0=LOW semn dr  digitalWrite(buton1,1); // 1=HIGH, 0=LOW semn st} void loop(){   int valbuton1 = digitalRead(buton1); // read input value    int val = digitalRead(buton); // read input value        if (val == LOW && valbuton1 == HIGH) // se aprinde semnal dreapta{  digitalWrite(led4, LOW);   // turn the LED on (HIGH is the voltage level)   delay(70);               // wait for a second  digitalWrite(led3, LOW);   // turn the LED on (HIGH is the voltage level)   delay(70);               // wait for a second  digitalWrite(led2, LOW);   // turn the LED on (HIGH is the voltage level)   delay(70);               // wait for a second  digitalWrite(led1, LOW);   // turn the LED on (HIGH is the voltage level)   delay(70);               // wait for a second  digitalWrite(led, LOW);   // turn the LED on (HIGH is the voltage level)   delay(100);               // wait for a second  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)   delay(20);               // wait for a second  digitalWrite(led1, HIGH);   // turn the LED on (HIGH is the voltage level)   delay(20);                  // wait for a second  digitalWrite(led2, HIGH);   // turn the LED on (HIGH is the voltage level)   delay(20);                  // wait for a second  digitalWrite(led3, HIGH);   // turn the LED on (HIGH is the voltage level)   delay(20);                  // wait for a second  digitalWrite(led4, HIGH);    // turn the LED off by making the voltage LOW   delay(100);               // wait for a second  }     else{  digitalWrite(led4, LOW);    // turn the LED off by making the voltage LOW  digitalWrite(led3, LOW);    // turn the LED off by making the voltage LOW  digitalWrite(led2, LOW);    // turn the LED off by making the voltage LOW  digitalWrite(led1, LOW);    // turn the LED off by making the voltage LOW  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW  }                if (valbuton1 == LOW && val == 1) // se aprinde semnal stanga{      digitalWrite(led5, LOW);    // turn the LED off by making the voltage LOW   delay(70);               // wait for a second  digitalWrite(led6, LOW);    // turn the LED off by making the voltage LOW   delay(70);               // wait for a second  digitalWrite(led7, LOW);    // turn the LED off by making the voltage LOW   delay(70);               // wait for a second  digitalWrite(led8, LOW);    // turn the LED off by making the voltage LOW   delay(70);               // wait for a second  digitalWrite(led9, LOW);    // turn the LED off by making the voltage LOW   delay(100);               // wait for a second  digitalWrite(led9, HIGH);    // turn the LED off by making the voltage LOW   delay(20);               // wait for a second  digitalWrite(led8, HIGH);    // turn the LED off by making the voltage LOW   delay(20);               // wait for a second   digitalWrite(led7, HIGH);    // turn the LED off by making the voltage LOW   delay(20);               // wait for a second   digitalWrite(led6, HIGH);    // turn the LED off by making the voltage LOW   delay(20);               // wait for a second  digitalWrite(led5, HIGH);    // turn the LED off by making the voltage LOW   delay(100);               // wait for a second}   else{  digitalWrite(led9, LOW);    // turn the LED off by making the voltage LOW  digitalWrite(led8, LOW);    // turn the LED off by making the voltage LOW  digitalWrite(led7, LOW);    // turn the LED off by making the voltage LOW  digitalWrite(led6, LOW);    // turn the LED off by making the voltage LOW  digitalWrite(led5, LOW);    // turn the LED off by making the voltage LOW }  if (valbuton1 == LOW && val == LOW) // se ruleaza program de avarii{      digitalWrite(led5, LOW);    // turn the LED off by making the voltage LOW  digitalWrite(led4, LOW);    // turn the LED off by making the voltage LOW   delay(40);               // wait for a second  digitalWrite(led6, LOW);    // turn the LED off by making the voltage LOW  digitalWrite(led3, LOW);    // turn the LED off by making the voltage LOW   delay(40);               // wait for a second  digitalWrite(led7, LOW);    // turn the LED off by making the voltage LOW  digitalWrite(led2, LOW);    // turn the LED off by making the voltage LOW   delay(40);               // wait for a second  digitalWrite(led8, LOW);    // turn the LED off by making the voltage LOW  digitalWrite(led1, LOW);    // turn the LED off by making the voltage LOW   delay(40);               // wait for a second   digitalWrite(led9, LOW);    // turn the LED off by making the voltage LOW  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW   delay(40);               // wait for a second    digitalWrite(led9, HIGH);    // turn the LED off by making the voltage LOW  digitalWrite(led, HIGH);    // turn the LED off by making the voltage LOW   delay(20);               // wait for a second  digitalWrite(led8, HIGH);    // turn the LED off by making the voltage LOW  digitalWrite(led1, HIGH);    // turn the LED off by making the voltage LOW   delay(20);               // wait for a second   digitalWrite(led7, HIGH);    // turn the LED off by making the voltage LOW  digitalWrite(led2, HIGH);    // turn the LED off by making the voltage LOW   delay(20);               // wait for a second  digitalWrite(led6, HIGH);    // turn the LED off by making the voltage LOW  digitalWrite(led3, HIGH);    // turn the LED off by making the voltage LOW   delay(20);               // wait for a second  digitalWrite(led5, HIGH);    // turn the LED off by making the voltage LOW  digitalWrite(led4, HIGH);    // turn the LED off by making the voltage LOW   delay(220);               // wait for a second  }}  
Link spre comentariu
  • 2 săptămâni mai târziu...
/*Control lumini - Versiune simplificata - www.upx.ro 	o Semnalizare stanga 	o Semnalizare dreapta 	o Stop FRANARE  	o Semnalizare Avarie *//*Dispunere leduri: STG: (13),(12),(11),(10),(9) 		DR: (4),(5),(6),(7),(8) Butoanele se leaga la masa(GND) *//*#define btnAvarii A0 #define btnFrana A1 #define btnSemnalizareStg A2 #define btnSemnalizareDr A3  #define ledSt1 13 #define ledSt2 12 #define ledSt3 11 #define ledSt4 10 #define ledSt5	9  #define ledDr1	8 #define ledDr2	7 #define	ledDr3	6 #define	ledDr4	5 #define ledDr5	4 *///SETUP VARIABLE//////////////////////////////////////////////const unsigned long speedLed = 200UL;  const unsigned long pause    = 1000UL;///////////////////////////////////////////////END SETUP#define LED_OFF	0#define AVARII	1#define FRANARE 	2#define SEMNAL_STG 3#define SEMNAL_DR  4byte runMode = LED_OFF;byte nextStep = 0;uint32_t cMs = 0;uint32_t lstNextStep = 0;byte stAvarii,stFrana, stSemnStg, stSemnDr;boolean flag1 = 0;boolean flag2 = 0;boolean flag3 = 0;boolean flag4 = 0;boolean reverse = 0;void setup() {  for (int i=4;i<=13;i++) pinMode(i,OUTPUT);  pinMode(A0,INPUT_PULLUP);  pinMode(A1,INPUT_PULLUP);  pinMode(A2,INPUT_PULLUP);  pinMode(A3,INPUT_PULLUP);  for (int x=0;x<10;x++){    for (int i=4;i<=13;i++) digitalWrite(i,1);	    delay(250);    for (int i=4;i<=13;i++) digitalWrite(i,0);	    delay(250);	  }  pwrOffAllLed();}void loop() {  readInput();  cMs = millis();  runMode = LED_OFF;  if (stSemnStg) runMode = SEMNAL_STG;  if (stSemnDr) runMode = SEMNAL_DR;  if (stAvarii) runMode = AVARII;  if (stFrana) runMode = FRANARE;  switch(runMode){  case 0: //LED_OFF    pwrOffAllLed();    flag1 = 0;    flag2 = 0;			    flag3 = 0;    flag4 = 0;    break;  case 1: //AVARII    if (!flag1) {	      pwrOffAllLed();      nextStep = 9;      reverse = 0;			     }    switch(reverse) {    case 0:      digitalWrite(nextStep, 1);      digitalWrite((nextStep-5), 1);      lstNextStep = (cMs + speedLed);      nextStep++;      if (nextStep > 13) {        reverse = 1;         lstNextStep = cMs+pause;         nextStep--;      }      break;    case 1:      digitalWrite(nextStep, 0);      digitalWrite((nextStep-5), 0);      lstNextStep = (cMs + speedLed);      nextStep--;	      if (nextStep < 9) {        reverse = 0;         lstNextStep = cMs+pause;         nextStep++;      }      break;    }		      flag1 = 1;    flag2 = 0;			    flag3 = 0;    flag4 = 0;					    break;  case 2: //FRANARE    if (!flag2) {      pwrOffAllLed();    }		    if ((cMs-lstNextStep)>speedLed) {      lstNextStep = cMs;      for (int i=4;i<=13;i++) digitalWrite(i,!digitalRead(i));    }		      flag1 = 0;    flag2 = 1;			    flag3 = 0;    flag4 = 0;		    // PROCEDURA TA DE FRANARE POATE FI CONTINUATA AICI, DAR    // NICIODATA NU FOLOSESTI FUNCTIA "delay()"    break;  case 3: //SEMNAL_STG: 9-13    if (!flag3) {      pwrOffAllLed();      nextStep = 9;      reverse = 0;    }	    if (cMs>=lstNextStep) {      switch(reverse) {      case 0:        digitalWrite(nextStep, 1);        lstNextStep = (cMs + speedLed);        nextStep++;        if (nextStep > 13) {          reverse = 1;           lstNextStep = cMs+pause;           nextStep--;        }        break;      case 1:        digitalWrite(nextStep, 0);        lstNextStep = (cMs + speedLed);        nextStep--;	        if (nextStep < 9) {          reverse = 0;           lstNextStep = cMs+pause;           nextStep++;        }        break;      }      flag1 = 0;      flag2 = 0;			      flag3 = 1;      flag4 = 0;    }    break;  case 4: //SEMNAL_DR: 4-8    if (!flag4) {      pwrOffAllLed();      nextStep = 4;      reverse = 0;			     }	    if (cMs>=lstNextStep) {      switch(reverse) {      case 0:        digitalWrite(nextStep, 1);        lstNextStep = (cMs + speedLed);        nextStep++;        if (nextStep > 8) {          reverse = 1;           lstNextStep = cMs+pause;           nextStep--;        }        break;      case 1:        digitalWrite(nextStep, 0);        lstNextStep = (cMs + speedLed);        nextStep--;	        if (nextStep < 4) {          reverse = 0;           lstNextStep = cMs+pause;           nextStep++;        }        break;      }		        flag1 = 0;      flag2 = 0;			      flag3 = 0;      flag4 = 1;    }    break;  }//end.switch}void pwrOffAllLed() {  for (int i=4;i<=13;i++) digitalWrite(i,0);}void readInput(){  stAvarii  = !bitRead(PINC, 0);  stFrana   = !bitRead(PINC, 1);  stSemnStg = !bitRead(PINC, 2);  stSemnDr  = !bitRead(PINC, 3);}

post-235374-0-54308100-1479008869_thumb.jpg

 

banuiesc ca sti ca fiecare LED este inseriat cu cate o rezistenta de aproximativ 220R

 

bafta.

Editat de Vizitator
Link spre comentariu
Vizitator Paul Galbinasu

Multumesc mult Aw Genetix pentru varianta simplificata si oarecum apropiata de ce vreau eu, am realizat-o si merge bine. Spun oarecum deoarece eu vreau ca pentru frina sa nu folosesc becurile de semnalizare. In montajul tau raman 4 porturi digitale (0,1,2.3) nefolosite si vreau ca sa pun acolo ledurile de frana. Crezi ca se poate face asta? Multumesc mult

Link spre comentariu

se poate. dar ar fi recomandat sa folosesti: (2,3,A4,A5) doar ca o sa ai doar 4 canale., pentru un joc de lumini pe care l-ai descris mai complex.

daca nu te descurci, zi-mi ce vrei sa faca si incerc sa rescriu

 

o versiune sumara ar fi cam asa

/*Control lumini - Versiune simplificata - www.upx.ro 	o Semnalizare stanga 	o Semnalizare dreapta 	o Stop FRANARE  	o Semnalizare Avarie *//*Dispunere leduri: STG: (13),(12),(11),(10),(9) 		DR: (4),(5),(6),(7),(8) FRANA: (2), (3), (A4), (A5) Butoanele se leaga la masa(GND) *//*#define btnAvarii A0 #define btnFrana A1 #define btnSemnalizareStg A2 #define btnSemnalizareDr A3  #define ledSt1 13 #define ledSt2 12 #define ledSt3 11 #define ledSt4 10 #define ledSt5	9  #define ledDr1	8 #define ledDr2	7 #define ledDr3	6 #define ledDr4	5 #define ledDr5	4 */ #define ledFr1	2 #define ledFr2	3 #define ledFr3	A4 #define ledFr4	A5//SETUP VARIABLE//////////////////////////////////////////////const unsigned long speedLed = 200UL;  const unsigned long pause    = 1000UL;const unsigned long speedFrana = 250UL;///////////////////////////////////////////////END SETUP#define LED_OFF	0#define AVARII	1#define SEMNAL_STG 2#define SEMNAL_DR  3byte runMode = LED_OFF;byte nextStep = 0;uint32_t cMs = 0;uint32_t lstNextStep = 0;uint32_t lstFranareTmr = 0;byte stAvarii,stFrana, stSemnStg, stSemnDr;boolean flag1 = 0;boolean flag2 = 0;boolean flag3 = 0;boolean flag4 = 0;boolean reverse = 0;boolean stLedFrana = 0;;void setup() {  for (int i=2;i<=13;i++) pinMode(i,OUTPUT);    pinMode(A0,INPUT_PULLUP);  pinMode(A1,INPUT_PULLUP);  pinMode(A2,INPUT_PULLUP);  pinMode(A3,INPUT_PULLUP);  pinMode(A4,OUTPUT);  pinMode(A5,OUTPUT);    for (int x=0;x<10;x++){    for (int i=4;i<=13;i++) digitalWrite(i,1);	    delay(250);    for (int i=4;i<=13;i++) digitalWrite(i,0);	    delay(250);	  }  pwrOffAllLed();}void loop() {  readInput();  cMs = millis();  runMode = LED_OFF;  if (stSemnStg) runMode = SEMNAL_STG;  if (stSemnDr) runMode = SEMNAL_DR;  if (stAvarii) runMode = AVARII;  if (stFrana) franare(); else pwrOffAllFrana();  switch(runMode){  case 0: //LED_OFF    pwrOffAllLed();    flag1 = 0;    flag2 = 0;			    flag3 = 0;    flag4 = 0;    break;  case 1: //AVARII    if (!flag1) {	      pwrOffAllLed();      nextStep = 9;      reverse = 0;			     }    switch(reverse) {    case 0:      digitalWrite(nextStep, 1);      digitalWrite((nextStep-5), 1);      lstNextStep = (cMs + speedLed);      nextStep++;      if (nextStep > 13) {        reverse = 1;         lstNextStep = cMs+pause;         nextStep--;      }      break;    case 1:      digitalWrite(nextStep, 0);      digitalWrite((nextStep-5), 0);      lstNextStep = (cMs + speedLed);      nextStep--;	      if (nextStep < 9) {        reverse = 0;         lstNextStep = cMs+pause;         nextStep++;      }      break;    }		      flag1 = 1;    flag2 = 0;			    flag3 = 0;    flag4 = 0;					    break;  case 2: //SEMNAL_STG: 9-13    if (!flag3) {      pwrOffAllLed();      nextStep = 9;      reverse = 0;    }	    if (cMs>=lstNextStep) {      switch(reverse) {      case 0:        digitalWrite(nextStep, 1);        lstNextStep = (cMs + speedLed);        nextStep++;        if (nextStep > 13) {          reverse = 1;           lstNextStep = cMs+pause;           nextStep--;        }        break;      case 1:        digitalWrite(nextStep, 0);        lstNextStep = (cMs + speedLed);        nextStep--;	        if (nextStep < 9) {          reverse = 0;           lstNextStep = cMs+pause;           nextStep++;        }        break;      }      flag1 = 0;      flag2 = 0;			      flag3 = 1;      flag4 = 0;    }    break;  case 3: //SEMNAL_DR: 4-8    if (!flag4) {      pwrOffAllLed();      nextStep = 4;      reverse = 0;			     }	    if (cMs>=lstNextStep) {      switch(reverse) {      case 0:        digitalWrite(nextStep, 1);        lstNextStep = (cMs + speedLed);        nextStep++;        if (nextStep > 8) {          reverse = 1;           lstNextStep = cMs+pause;           nextStep--;        }        break;      case 1:        digitalWrite(nextStep, 0);        lstNextStep = (cMs + speedLed);        nextStep--;	        if (nextStep < 4) {          reverse = 0;           lstNextStep = cMs+pause;           nextStep++;        }        break;      }		        flag1 = 0;      flag2 = 0;			      flag3 = 0;      flag4 = 1;    }    break;  }//end.switch}void pwrOffAllLed() {  for (int i=4;i<=13;i++) digitalWrite(i,0);}void readInput(){  stAvarii  = !bitRead(PINC, 0);  stFrana   = !bitRead(PINC, 1);  stSemnStg = !bitRead(PINC, 2);  stSemnDr  = !bitRead(PINC, 3);}void pwrOffAllFrana() {	 digitalWrite(ledFr1,0);	 digitalWrite(ledFr2,0);	 digitalWrite(ledFr3,0);	 digitalWrite(ledFr4,0);	 stLedFrana = 0;}void franare() {	if ((cMs-lstFranareTmr)>speedFrana) {	 lstFranareTmr = cMs;	 stLedFrana = !stLedFrana;	 digitalWrite(ledFr1,stLedFrana);	 digitalWrite(ledFr2,stLedFrana);	 digitalWrite(ledFr3,stLedFrana);	 digitalWrite(ledFr4,stLedFrana);	}}
Editat de Vizitator
Link spre comentariu

chiar daca ma repet. renunta la delay() pentru totdeauna. chiar daca vei folosi intreruperi mai tarziu, uita ca exista functia delay(); gandeste programele in bucla, gandeste ca procesorul repeta aceasi secventa la nesfarsit, doar ca tu poti jongla cu variabile si poti gestiona fiecare pas(repetitie). dar nu-l opri niciodata (pe procesor), pentru ca te vei auto-limita la un fir de executie. nu am vrut sa-ti pun butoanele pe intreruperi pentru ca se complica si nu are sens in cazul aplicatiei tale. vroiam sa si intelegi ce am scris.

 

bitRead(PINC, 0); este echivalent cu digitalRead(A0); doar ca se intampla mai repede. semnul exclamarii inverseaza state-ul citit. daca citeste 1 rezultatul lui va fi 0 si invers. in cazul de fata vroiam sa simplific starea butonului care era sa spunem NC(normal close) in NO(normal open)

 

 

am gasit o eroare la flag4 asa ca foloseste codul acesta:

/*Control lumini - Versiune simplificata - www.upx.ro     o Semnalizare stanga     o Semnalizare dreapta     o Stop FRANARE     o Semnalizare Avarie *//*Dispunere leduri: STG: (13),(12),(11),(10),(9)         DR: (4),(5),(6),(7),(8) FRANA: (2), (3), (A4), (A5) Butoanele se leaga la masa(GND) *//*#define btnAvarii A0 #define btnFrana A1 #define btnSemnalizareStg A2 #define btnSemnalizareDr A3  #define ledSt1 13 #define ledSt2 12 #define ledSt3 11 #define ledSt4 10 #define ledSt5    9  #define ledDr1    8 #define ledDr2    7 #define ledDr3    6 #define ledDr4    5 #define ledDr5    4 */ #define ledFr1    2 #define ledFr2    3 #define ledFr3    A4 #define ledFr4    A5//SETUP VARIABLE//////////////////////////////////////////////const unsigned long speedLed = 200UL;  const unsigned long pause    = 1000UL;const unsigned long speedFrana = 250UL;///////////////////////////////////////////////END SETUP#define LED_OFF    0#define AVARII    1#define SEMNAL_STG 2#define SEMNAL_DR  3byte runMode = LED_OFF;byte nextStep = 0;uint32_t cMs = 0;uint32_t lstNextStep = 0;uint32_t lstFranareTmr = 0;byte stAvarii,stFrana, stSemnStg, stSemnDr;boolean flag1 = 0;boolean flag2 = 0;boolean flag3 = 0;boolean reverse = 0;boolean stLedFrana = 0;;void setup() {  for (int i=2;i<=13;i++) pinMode(i,OUTPUT);   pinMode(A0,INPUT_PULLUP);  pinMode(A1,INPUT_PULLUP);  pinMode(A2,INPUT_PULLUP);  pinMode(A3,INPUT_PULLUP);  pinMode(A4,OUTPUT);  pinMode(A5,OUTPUT);    for (int x=0;x<10;x++){    for (int i=4;i<=13;i++) digitalWrite(i,1);        delay(250);    for (int i=4;i<=13;i++) digitalWrite(i,0);        delay(250);      }  pwrOffAllLed();}void loop() {  readInput();  cMs = millis();  runMode = LED_OFF;  if (stSemnStg) runMode = SEMNAL_STG;  if (stSemnDr) runMode = SEMNAL_DR;  if (stAvarii) runMode = AVARII;  if (stFrana) franare(); else pwrOffAllFrana();  switch(runMode){  case 0: //LED_OFF    pwrOffAllLed();    flag1 = 0;    flag2 = 0;                flag3 = 0;    break;  case 1: //AVARII    if (!flag1) {          pwrOffAllLed();      nextStep = 9;      reverse = 0;                }    switch(reverse) {    case 0:      digitalWrite(nextStep, 1);      digitalWrite((nextStep-5), 1);      lstNextStep = (cMs + speedLed);      nextStep++;      if (nextStep > 13) {        reverse = 1;        lstNextStep = cMs+pause;        nextStep--;      }      break;    case 1:      digitalWrite(nextStep, 0);      digitalWrite((nextStep-5), 0);      lstNextStep = (cMs + speedLed);      nextStep--;          if (nextStep < 9) {        reverse = 0;        lstNextStep = cMs+pause;        nextStep++;      }      break;    }              flag1 = 1;    flag2 = 0;                flag3 = 0;                    break;  case 2: //SEMNAL_STG: 9-13    if (!flag2) {      pwrOffAllLed();      nextStep = 9;      reverse = 0;    }        if (cMs>=lstNextStep) {      switch(reverse) {      case 0:        digitalWrite(nextStep, 1);        lstNextStep = (cMs + speedLed);        nextStep++;        if (nextStep > 13) {          reverse = 1;          lstNextStep = cMs+pause;          nextStep--;        }        break;      case 1:        digitalWrite(nextStep, 0);        lstNextStep = (cMs + speedLed);        nextStep--;            if (nextStep < 9) {          reverse = 0;          lstNextStep = cMs+pause;          nextStep++;        }        break;      }      flag1 = 0;      flag2 = 1;                  flag3 = 0;    }    break;  case 3: //SEMNAL_DR: 4-8    if (!flag3) {      pwrOffAllLed();      nextStep = 4;      reverse = 0;                }        if (cMs>=lstNextStep) {      switch(reverse) {      case 0:        digitalWrite(nextStep, 1);        lstNextStep = (cMs + speedLed);        nextStep++;        if (nextStep > 8) {          reverse = 1;          lstNextStep = cMs+pause;          nextStep--;        }        break;      case 1:        digitalWrite(nextStep, 0);        lstNextStep = (cMs + speedLed);        nextStep--;            if (nextStep < 4) {          reverse = 0;          lstNextStep = cMs+pause;          nextStep++;        }        break;      }                flag1 = 0;      flag2 = 0;                  flag3 = 1;    }    break;  }//end.switch}void pwrOffAllLed() {  for (int i=4;i<=13;i++) digitalWrite(i,0);}void pwrOffAllFrana() {     digitalWrite(ledFr1,0);     digitalWrite(ledFr2,0);     digitalWrite(ledFr3,0);     digitalWrite(ledFr4,0);     stLedFrana = 0;}void franare() {    if ((cMs-lstFranareTmr)>speedFrana) {     lstFranareTmr = cMs;     stLedFrana = !stLedFrana;     digitalWrite(ledFr1,stLedFrana);     digitalWrite(ledFr2,stLedFrana);     digitalWrite(ledFr3,stLedFrana);     digitalWrite(ledFr4,stLedFrana);    }}void readInput(){  stAvarii  = !bitRead(PINC, 0);  stFrana   = !bitRead(PINC, 1);  stSemnStg = !bitRead(PINC, 2);  stSemnDr  = !bitRead(PINC, 3);}
Editat de Vizitator
Link spre comentariu
Vizitator Paul Galbinasu

Multumesc mult pentru ajutor Aw Genetix, ultima varianta imi satisface dorintele dar are o mica problema, luminile de avarii raman aprinse fara a flash-a iar luminile de frana flash-eaza, nu raman aprinse permanent. Crezi ca se poate face ceva in sensul acesta? Eu am tot incercat sa imi dau seama ce trebuie modificat dar nu am gasit, trebuie sa ma pun la punct cu aceste variabile, si sa reusesc sa le inteleg. Iti multumesc.

Link spre comentariu

flash pe frana , asa e facut programul, dar daca doresti pot sa-l fac ON/OFF

referitor la avarii, verifica inca o data daca ai ledurile bine legate si totul.

eu am facut simulare in ISIS, si e ok, cu exceptia ca in simulare nu ai timp real.

 

in orice caz, poftim versiune in care din setari poti alege franare simpla, sau puls.

/*Control lumini - Versiune simplificata - www.upx.ro 	o Semnalizare stanga 	o Semnalizare dreapta 	o Stop FRANARE  	o Semnalizare Avarie *//*Dispunere leduri: STG: (13),(12),(11),(10),(9) 		DR: (4),(5),(6),(7),(8) FRANA: (2), (3), (A4), (A5) Butoanele se leaga la masa(GND) *//*#define btnAvarii A0 #define btnFrana A1 #define btnSemnalizareStg A2 #define btnSemnalizareDr A3  #define ledSt1 13 #define ledSt2 12 #define ledSt3 11 #define ledSt4 10 #define ledSt5	9  #define ledDr1	8 #define ledDr2	7 #define ledDr3	6 #define ledDr4	5 #define ledDr5	4 */ #define ledFr1	2 #define ledFr2	3 #define ledFr3	A4 #define ledFr4	A5//SETUP VARIABLE//////////////////////////////////////////////const unsigned long speedLed = 200UL;  const unsigned long pause    = 1000UL;const unsigned long speedFrana = 250UL;const boolean franareSimpla = true;///////////////////////////////////////////////END SETUP#define LED_OFF	0#define AVARII	1#define SEMNAL_STG 2#define SEMNAL_DR  3byte runMode = LED_OFF;byte nextStep = 0;uint32_t cMs = 0;uint32_t lstNextStep = 0;uint32_t lstFranareTmr = 0;byte stAvarii,stFrana, stSemnStg, stSemnDr;boolean flag1 = 0;boolean flag2 = 0;boolean flag3 = 0;boolean reverse = 0;boolean stLedFrana = 0;;void setup() {  for (int i=2;i<=13;i++) pinMode(i,OUTPUT);    pinMode(A0,INPUT_PULLUP);  pinMode(A1,INPUT_PULLUP);  pinMode(A2,INPUT_PULLUP);  pinMode(A3,INPUT_PULLUP);  pinMode(A4,OUTPUT);  pinMode(A5,OUTPUT);    for (int x=0;x<10;x++){    for (int i=4;i<=13;i++) digitalWrite(i,1);	    delay(250);    for (int i=4;i<=13;i++) digitalWrite(i,0);	    delay(250);	  }  pwrOffAllLed();}void loop() {  readInput();  cMs = millis();  runMode = LED_OFF;  if (stSemnStg) runMode = SEMNAL_STG;  if (stSemnDr) runMode = SEMNAL_DR;  if (stAvarii) runMode = AVARII;  if (stFrana) franare(); else pwrOffAllFrana();  switch(runMode){  case 0: //LED_OFF    pwrOffAllLed();    flag1 = 0;    flag2 = 0;			    flag3 = 0;    break;  case 1: //AVARII    if (!flag1) {	      pwrOffAllLed();      nextStep = 9;      reverse = 0;			     }	if (cMs>=lstNextStep) {    switch(reverse) {    case 0:      digitalWrite(nextStep, 1);      digitalWrite((nextStep-5), 1);      lstNextStep = (cMs + speedLed);      nextStep++;      if (nextStep > 13) {        reverse = 1;         lstNextStep = cMs+pause;         nextStep--;      }      break;    case 1:      digitalWrite(nextStep, 0);      digitalWrite((nextStep-5), 0);      lstNextStep = (cMs + speedLed);      nextStep--;	      if (nextStep < 9) {        reverse = 0;         lstNextStep = cMs+pause;         nextStep++;      }      break;    }		      flag1 = 1;    flag2 = 0;			    flag3 = 0; }		    break;  case 2: //SEMNAL_STG: 9-13    if (!flag2) {      pwrOffAllLed();      nextStep = 9;      reverse = 0;    }	    if (cMs>=lstNextStep) {      switch(reverse) {      case 0:        digitalWrite(nextStep, 1);        lstNextStep = (cMs + speedLed);        nextStep++;        if (nextStep > 13) {          reverse = 1;           lstNextStep = cMs+pause;           nextStep--;        }        break;      case 1:        digitalWrite(nextStep, 0);        lstNextStep = (cMs + speedLed);        nextStep--;	        if (nextStep < 9) {          reverse = 0;           lstNextStep = cMs+pause;           nextStep++;        }        break;      }      flag1 = 0;      flag2 = 1;			      flag3 = 0;    }    break;  case 3: //SEMNAL_DR: 4-8    if (!flag3) {      pwrOffAllLed();      nextStep = 4;      reverse = 0;			     }	    if (cMs>=lstNextStep) {      switch(reverse) {      case 0:        digitalWrite(nextStep, 1);        lstNextStep = (cMs + speedLed);        nextStep++;        if (nextStep > 8) {          reverse = 1;           lstNextStep = cMs+pause;           nextStep--;        }        break;      case 1:        digitalWrite(nextStep, 0);        lstNextStep = (cMs + speedLed);        nextStep--;	        if (nextStep < 4) {          reverse = 0;           lstNextStep = cMs+pause;           nextStep++;        }        break;      }		        flag1 = 0;      flag2 = 0;			      flag3 = 1;    }    break;  }//end.switch}void pwrOffAllLed() {  for (int i=4;i<=13;i++) digitalWrite(i,0);}void pwrOffAllFrana() {	 digitalWrite(ledFr1,0);	 digitalWrite(ledFr2,0);	 digitalWrite(ledFr3,0);	 digitalWrite(ledFr4,0);	 stLedFrana = 0;}void franare() {if (franareSimpla) {	 digitalWrite(ledFr1,1);	 digitalWrite(ledFr2,1);	 digitalWrite(ledFr3,1);	 digitalWrite(ledFr4,1);} else {	if ((cMs-lstFranareTmr)>speedFrana) {	 lstFranareTmr = cMs;	 stLedFrana = !stLedFrana;		 digitalWrite(ledFr1,stLedFrana);	 digitalWrite(ledFr2,stLedFrana);	 digitalWrite(ledFr3,stLedFrana);	 digitalWrite(ledFr4,stLedFrana);	}  }	}void readInput(){  stAvarii  = !bitRead(PINC, 0);  stFrana   = !bitRead(PINC, 1);  stSemnStg = !bitRead(PINC, 2);  stSemnDr  = !bitRead(PINC, 3);}

daca doresti sa pulseze pe frana schimbi

const boolean franareSimpla = true;

in

const boolean franareSimpla = false;
Editat de Vizitator
Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări