Gå til innhold

Trafikklys styr med Arduino


Anbefalte innlegg

Jeg har startet å leke meg med arduino og programmering i c++.

Mitt første prosjekt er trafikklys.

 

Jeg har fått trafikk lyset til å gå slik som et trafikk lys i Norge går men vil nå legge til bryterer som brukes til å indikere at en person vil gå over et kryss.

Har 2 kryss og de skal fungere uavhenging av hverandre.

Se vedlagt bilde.

post-120788-0-68438500-1400746388_thumb.jpg

 

Spørsmålet mitt er da hvordan jeg skal gå frem å få den til å gjøre slik som vist på bildet over.

Noen som veit om hvordan jeg skal gå frem?

Skal jeg bruke if, else if, if eller case?

 

 

-- Arduino Mega 2560 --

 

 

// Pin Config //
const int ButtonA = 2;
const int ButtonB = 13;
const int RedA = 12;
const int YellowA = 11;
const int GreenA = 10;
const int WalkRedA = 9;
const int WalkGreenA = 8;
const int RedB = 7;
const int YellowB = 6;
const int GreenB = 5;
const int WalkRedB = 4;
const int WalkGreenB = 3;

// Time interval //

int Delayyellow = 4000; // 4 seconds
int Delaygreen = 30000; // 30 seconds
int Delayred = 30000; // 30 seconds

int Delaywalkgreen = 20000; // 20 seconds
int Delayblink = 500; // 0.5 seconds

 

// Output/Input setup //
void setup() {
pinMode(ButtonA, INPUT);
pinMode(ButtonB, INPUT);
pinMode(RedA, OUTPUT);
pinMode(YellowA, OUTPUT);
pinMode(GreenA, OUTPUT);
pinMode(WalkRedA, OUTPUT);
pinMode(WalkGreenA, OUTPUT);
pinMode(RedB, OUTPUT);
pinMode(YellowB, OUTPUT);
pinMode(GreenB, OUTPUT);
pinMode(WalkRedB, OUTPUT);
pinMode(WalkGreenB, OUTPUT);
}

Endret av Kimlorentz
Lenke til kommentar
Videoannonse
Annonse

Du skrev jo at "Jeg har fått trafikk lyset til å gå slik som et trafikk lys i Norge...", så da antok jeg at du hadde skrevet mer kode enn det du kom med i innlegget ditt. Og da ville det være vanskelig å komme med konkrete tips på hvordan du skulle gå videre for å løse oppgaven. Hvis så ikke er tilfelle, så vil jeg heller anbefale deg å sette deg inn i grunnleggende C-programmering, og se litt på de forskjellige eksemplene som kommer med Arduino-programvaren. Spørsmål om helt grunnleggende ting som valg av kontrollstrukturer sier meg at du først bør satse på å få en bedre forståelse for disse grunnleggende tingene, før du prøver deg på et prosjekt som dette.

 

Du bør dessuten bruke code-taggen når du poster kode.

Endret av Karl Skapeland
Lenke til kommentar

Her er hvordan jeg ser for meg de forskjellige resultatene som skal skje i normal drift og når en knapp blir trykket.

Så var det å få pakket det inn i et loop system.

 

 

// First Run Only //

digitalWrite(RedA, HIGH);
digitalWrite(WalkRedA, HIGH);
digitalWrite(RedB, HIGH);
digitalWrite(WalkRedB, HIGH);
digitalWrite(YellowA, LOW);
digitalWrite(GreenA, LOW);
digitalWrite(WalkGreenA, LOW);
digitalWrite(YellowB, LOW);
digitalWrite(GreenB, LOW);
digitalWrite(WalkGreenB, LOW);



// Normal loop //

delay(Delayyellow)
digitalWrite(YellowA, HIGH);
delay(Delayyellow)
digitalWrite(YellowA, LOW);
digitalWrite(GreenA, HIGH);
delay(Delaygreen)
digitalWrite(GreenA, Low);
digitalWrite(YellowA, HIGH);
delay(Delayyellow);
digitalWrite(YellowA, LOW);
digitalWrite(RedA, HIGH);
delay(Delayyellow)
digitalWrite(YellowB, HIGH);
delay(Delayyellow);
digitalWrite(YellowB, LOW);
digitalWrite(GreenB, HIGH);
delay(Delaygreen)
digitalWrite(GreenB, LOW);
digitalWrite(YellowB, HIGH);
delay(Delayyellow)
digitalWrite(YellowB, LOW);
digitalWrite(RedB, HIGH);



// Button A pressed //

delay(Delayyellow);
digitalWrite(YellowA, HIGH);
digitalWrite(WalkGreenA, HIGH);
delay(Delayyellow);
digitalWrite(YellowA, LOW);
digitalWrite(GreenA, HIGH);
delay(Delaywalkgreen);
digitalWrite(WalkGreenA, LOW);
delay(Delayblink);
digitalWrite(WalkGreenA, HIGH);
delay(Delayblink);
digitalWrite(WalkGreenA, LOW);
delay(Delayblink);
digitalWrite(WalkGreenA, HIGH);
delay(Delayblink);
digitalWrite(WalkGreenA, LOW);
delay(Delayblink);
digitalWrite(WalkGreenA, HIGH);
delay(Delayblink);
digitalWrite(WalkGreenA, LOW);
delay(Delayblink);
digitalWrite(WalkGreenA, HIGH);
delay(Delayblink);
digitalWrite(WalkGreenA, LOW);
delay(Delayblink);
digitalWrite(WalkGreenA, HIGH);
delay(Delayblink);

digitalWrite(WalkGreenA, LOW);
delay(Delayblink);
digitalWrite(WalkGreenA, HIGH);
delay(Delayblink);

digitalWrite(WalkGreenA, LOW);
digitalWrite(WalkRedA, HIGH);
delay(Delayblink);
digitalWrite(GreenA, LOW);
digitalWrite(YellowA, HIGH);
delay(Delayyellow);
digitalWrite(YellowA, LOW);
digitalWrite(RedA, HIGH);



// Button B pressed //

delay(Delayyellow);
digitalWrite(YellowB, HIGH);
digitalWrite(WalkGreenB, HIGH);
delay(Delayyellow);
digitalWrite(YellowB, LOW);
digitalWrite(GreenB, HIGH);
delay(Delaywalkgreen);
digitalWrite(WalkGreenB, LOW);
delay(Delayblink);
digitalWrite(WalkGreenB, HIGH);
delay(Delayblink);
digitalWrite(WalkGreenB, LOW);
delay(Delayblink);
digitalWrite(WalkGreenB, HIGH);
delay(Delayblink);
digitalWrite(WalkGreenB, LOW);
delay(Delayblink);
digitalWrite(WalkGreenB, HIGH);
delay(Delayblink);
digitalWrite(WalkGreenB, LOW);
delay(Delayblink);
digitalWrite(WalkGreenB, HIGH);
delay(Delayblink);
digitalWrite(WalkGreenB, LOW);
delay(Delayblink);
digitalWrite(WalkGreenB, HIGH);
delay(Delayblink);

digitalWrite(WalkGreenB, LOW);
delay(Delayblink);
digitalWrite(WalkGreenB, HIGH);
delay(Delayblink);

digitalWrite(WalkGreenB, LOW);
digitalWrite(WalkRedB, HIGH);
delay(Delayblink);
digitalWrite(GreenB, LOW);
digitalWrite(YellowB, HIGH);
delay(Delayyellow);
digitalWrite(YellowB, LOW);
digitalWrite(RedB, HIGH);

Lenke til kommentar

Den "normale" loopen din tar jo 4 minutter å kjøre. Det er ikke mulig å reagere på knapper i løpet av denne tiden. Du kunne jo "krydret" loopen med flere avlesninger av knapper, men det er heller ingen god løsning.

 

Du bør sette deg inn i begrepet Finite State Machine (FSM), som er bedre egnet til problemer som dette. Du finner et trafikklys-eksempel som benytter FSM her:

 

http://www.geekrant.org/2013/06/23/traffic-light-and-pedestrian-crossing-implemented-with-an-arduino/

  • Liker 1
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...