Go Down

Topic: [opgelost] Vraag stoplicht code arduino (Read 219 times) previous topic - next topic

rdejong2

Dec 08, 2014, 09:44 am Last Edit: Dec 13, 2014, 05:44 pm by Jantje
edited by ron: Verholpen: Dank u Cartoonist
edited by moderator: reentered original content

origineel bericht:
Beste,

Ik ben bezig met het maken van een stoplicht met Arduino, hij moet er als volgt uit komen te zien.

Stoplicht 1 (Voor auto): Rood, Geel, Groen
Stoplicht 2 (Voor fiets): Rood, Groen

De wisselwerking moet worden Rood 1, Groen 2 en daarna Rood 2, Groen 1 en wissel 1 met oranje. (Dit stukje werkt al, zie code onder)

Enkel is mijn vraag nu hoe ik het kan maken dat als een fietser bij stoplicht 2 op een knop (button) drukt dit wordt gemerkt, stoplicht 1 op rood gaat en stoplicht 2 op groen, dus drukken en hij wordt groen.
Dit moet middels een if maar kan iemand mij hierbij helpen want dit lukt niet...

De code die ik nu heb:

 
Code: [Select]
int rood = 6;
int geel = 5;
int groen = 4;
int roodvoetganger = 3;                                                                                                                       
int groenvoetganger = 2;


void setup(){
pinMode(rood,OUTPUT);
pinMode(geel,OUTPUT);
pinMode(groen,OUTPUT);
pinMode(roodvoetganger,OUTPUT);
pinMode(groenvoetganger,OUTPUT);


}
void loop(){
changeLights();
delay(1000);
}
void changeLights(){


digitalWrite(rood,HIGH);
digitalWrite(geel,LOW);
digitalWrite(groen,LOW);
digitalWrite(roodvoetganger,HIGH);
digitalWrite(groenvoetganger,LOW);
delay(800);


digitalWrite(rood,HIGH);
digitalWrite(geel,LOW);
digitalWrite(groen,LOW);
digitalWrite(roodvoetganger,LOW);
digitalWrite(groenvoetganger,HIGH);
delay(4000);


digitalWrite(rood,HIGH);
digitalWrite(geel,LOW);
digitalWrite(groen,LOW);
digitalWrite(roodvoetganger,LOW);
digitalWrite(groenvoetganger,LOW);
delay(300);


digitalWrite(rood,HIGH);
digitalWrite(geel,LOW);
digitalWrite(groen,LOW);
digitalWrite(roodvoetganger,LOW);
digitalWrite(groenvoetganger,HIGH);
delay(300);


digitalWrite(rood,HIGH);
digitalWrite(geel,LOW);
digitalWrite(groen,LOW);
digitalWrite(roodvoetganger,LOW);
digitalWrite(groenvoetganger,LOW);
delay(300);


digitalWrite(rood,HIGH);
digitalWrite(geel,LOW);
digitalWrite(groen,LOW);
digitalWrite(roodvoetganger,LOW);
digitalWrite(groenvoetganger,HIGH);
delay(300);


digitalWrite(rood,HIGH);
digitalWrite(geel,LOW);
digitalWrite(groen,LOW);
digitalWrite(roodvoetganger,LOW);
digitalWrite(groenvoetganger,LOW);
delay(300);


digitalWrite(rood,HIGH);
digitalWrite(geel,LOW);
digitalWrite(groen,LOW);
digitalWrite(roodvoetganger,LOW);
digitalWrite(groenvoetganger,HIGH);
delay(300);


digitalWrite(rood,HIGH);
digitalWrite(geel,LOW);
digitalWrite(groen,LOW);
digitalWrite(roodvoetganger,LOW);

digitalWrite(groenvoetganger,LOW);
delay(300);


digitalWrite(rood,HIGH);
digitalWrite(geel,LOW);
digitalWrite(groen,LOW);
digitalWrite(roodvoetganger,HIGH);
digitalWrite(groenvoetganger,LOW);
delay(800);


digitalWrite(rood,LOW);
digitalWrite(geel,LOW);
digitalWrite(groen,HIGH);
digitalWrite(roodvoetganger,HIGH);
digitalWrite(groenvoetganger,LOW);
delay(4000);

                                                             
digitalWrite(rood,LOW);
digitalWrite(geel,HIGH);
digitalWrite(groen,LOW);
digitalWrite(roodvoetganger,HIGH);
digitalWrite(groenvoetganger,LOW);
delay(1500);
}           

//project bij Raymon

Bij voorbaat dank,

Raymon                                   

cartoonist

#1
Dec 08, 2014, 10:43 am Last Edit: Dec 08, 2014, 12:01 pm by cartoonist
Je hoeft alleen maar de veranderingen te programmeren.
De hele changeLights is tot een derde in te korten tot

Code: [Select]


void changeLights(){

/* *** auto geel *** */
digitalWrite(geel,HIGH);
digitalWrite(groen,LOW);
delay(1500);

/* *** auto rood *** */
digitalWrite(rood,HIGH);
digitalWrite(geel,LOW);
digitalWrite(roodvoetganger,HIGH);
digitalWrite(groenvoetganger,LOW);
delay(800);

/* *** voetganger groen  *** */
digitalWrite(roodvoetganger,LOW);
digitalWrite(groenvoetganger,HIGH);
delay(3700);                                   // 3700 + 300 = 4000
/* *** voetganger knippert *** */C
for (int teller=1;teller<=4;teller=teller+1){
  digitalWrite(groenvoetganger,HIGH);
  delay(300);
  digitalWrite(groenvoetganger,LOW);
  delay(300);
}
/* *** voetganger rood *** */
digitalWrite(roodvoetganger,HIGH);
delay(800);
/* *** auto groen *** */
digitalWrite(rood,LOW);
digitalWrite(groen,HIGH);
delay(4000);        // edit: deze delay mag weg maar kan ook blijven staan om er voor te zorgen dat auto minstens 4 seconde groen blijft als voetganger te snel op knop drukt nadat voetganger rood wordt.
}


dat maakt de code overzichtelijk. Je ziet dan misschien ook hoe je de if statement moet gaan plaatsen.
Ik heb de volgorde enigszins aangepast zodat de cyclus begint met auto geel en eindigt met auto groen.
In principe moet auto-groen HIGH zijn en roodvoetganger moet HIGH zijn totdat je de knop indrukt waarna je eenmalig de void changeLights aanroept.


[edit: commentregel gewijzigd aan het einde van de code.]
You do not need a new P.C., you need a new O.S.  Linux is free, safe, fast and reliable.

shooter

leuk programma gemaakt, werkt prima, voor een begin.
zoals je zelf ook wel snapt doet je programma steeds een regel en dan een delay dan stopt je programma.

je moet er eigenlijk voor zorgen dat de loop zo vaak mogelijk wordt doorlopen.
en dan af en toe een zijsprong maken om iets te veranderen.

kijk eens hoe switch case werkt.
dan is elke toestand een bepaald cijfer.
als een toestand klaar is dan naar de volgende springen door de toetsandsgetal te veranderen.

de volgende stap is als er op een knop gedrukt wordt dan is de toestandsgetal ineens anders.
ofwel if button ){getal=45} of zo.
dan alle delays eruit werken en met een millis() constructie kijken of de tijd voorbij is.
je zult dan een loop krijgen waarbij maar een toestand telkens herhaalt wordt.

als je een stuk verder bent dan moet je de toestand inschakelen, en dan niet meer naar kijken tot er iets verandert (bijvoorbeeld door een tijd of een knop

rdejong2

#3
Dec 10, 2014, 11:56 am Last Edit: Dec 10, 2014, 01:32 pm by Jantje
Ik heb nu de volgende code:

Code: [Select]
int rood = 7;
int geel = 6;
int groen = 5;
int roodvoetganger = 4;                                                                                                                      
int groenvoetganger = 3;


void setup(){
pinMode(rood,OUTPUT);
pinMode(geel,OUTPUT);
pinMode(groen,OUTPUT);
pinMode(roodvoetganger,OUTPUT);
pinMode(groenvoetganger,OUTPUT);


}
void loop(){
changeLights();
delay(1000);
}

void changeLights(){

/* *** auto geel *** */
digitalWrite(geel,HIGH);
digitalWrite(groen,LOW);
delay(1500);

/* *** auto rood *** */
digitalWrite(rood,HIGH);
digitalWrite(geel,LOW);
digitalWrite(roodvoetganger,HIGH);
digitalWrite(groenvoetganger,LOW);
delay(800);

/* *** voetganger groen  *** */
digitalWrite(roodvoetganger,LOW);
digitalWrite(groenvoetganger,HIGH);
delay(3700);                                   // 3700 + 300 = 4000
/* *** voetganger knippert *** */
for (int teller=1;teller<=4;teller=teller+1){
 digitalWrite(groenvoetganger,HIGH);
 delay(300);
 digitalWrite(groenvoetganger,LOW);
 delay(300);
}
/* *** voetganger rood *** */
digitalWrite(roodvoetganger,HIGH);
delay(800);
/* *** auto groen *** */
digitalWrite(rood,LOW);
digitalWrite(groen,HIGH);
delay(4000);        // edit: deze delay mag weg maar kan ook blijven staan om er voor te zorgen dat auto minstens 4 seconde groen blijft als voetganger te snel op knop drukt nadat voetganger rood wordt.
}


Maar het probleem is nu dat er een knop moet komen die er voor zorgt dat de auto rood krijgt en de fiets groen. Hier kom ik niet uit?

Update: code tags toegevoegd. Jantje

Jantje

gelieve code tags te gebruiken.
De moderator.
Do not PM me a question unless you are prepared to pay for consultancy.
Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -

cartoonist

Alle begin is moeilijk he ?

Ik schreef gisteren al dat die void changelight aangeroepen moet worden doordat je een knop hebt ingedrukt.
Als eerste de delay(1000) die je in de loop hebt staan halen we eruit, die blokkeert de loop van je programma.
Dan kijken we naar het voorbeeld dat bij de arduino IDE zit : voorbeelden:  deel2 'digital', de sketch 'Button'.

Code: [Select]

const int buttonPin = 2;     // the number of the pushbutton pin
const int ledPin =  13;      // the number of the LED pin

// variables will change:
int buttonState = 0;         // variable for reading the pushbutton status


void setup() {
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);     
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);     
}

void loop(){
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);

  // check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH:
  if (buttonState == HIGH) {     
    // turn LED on:   
    digitalWrite(ledPin, HIGH); 
  }
  else {
    // turn LED off:
    digitalWrite(ledPin, LOW);
  }
}

Dit ga je met je eigen sketch combineren.

1) voeg de defenities toe voor buttonPin, ledPin en de int buttonState.
2) in setup voeg je de twee pinMode regels toe.

3) In de loop:
maak je loop helemaal leeg
Neem de loop over van de Button sketch en voeg de regel changeLights(); toe achter de regel digitalWrite(ledPin,HIGH);
De laatste delay(4000) in de changeLights routine kan beter weg. Wil je toch een kleine vertraging tussen het moment dat de knop wordt ingedrukt en het moment dat autoGeel begint te branden dan moet je die opnemen voor de aanroep changeLights().

Ik heb het niet uitgeprobeert, dat mag je zelf doen.
You do not need a new P.C., you need a new O.S.  Linux is free, safe, fast and reliable.

cartoonist

Verholpen Danku Cartoonist
Graag gedaan,  kom gerust ook nog eens terug met een ander beginners of gevorderd-beginners probleem.
You do not need a new P.C., you need a new O.S.  Linux is free, safe, fast and reliable.

robtillaart

@rdejong2

Het zou fijn zijn als je de oorspronkelijke vraag had laten staan,
nu kan niemand meer zien welk probleem hier opgelost is,
het idee van het forum is juist dat mensen dat delen.

Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

cartoonist

@ robtillaart

Mee eens.

rdejong2 had beter een nieuwe reaktie kunnen plaatsen i.p.v. zijn oorspronkelijke vraag en uitgebreide sketch te editen tot een simpel "verholpen"
Het is natuurlijk allemaal nog een beetje nieuw voor hem, volgende keer beter zullen we maar denken.
You do not need a new P.C., you need a new O.S.  Linux is free, safe, fast and reliable.

MAS3

#9
Dec 12, 2014, 07:06 pm Last Edit: Dec 12, 2014, 07:12 pm by MAS3
Het is nog niet te laat.

jdejong2 kan nog steeds de titel veranderen in:

[opgelost] Vraag stoplicht code arduino

Oeps, toch wel te laat.
Hij heeft ook de originele vraag gewist.
Das niet alleen jammer, persoonlijk word ik er ook boos om als iemand gebruik maakt van de community, en het vervolgens probeert te wissen (al dan niet bewust), zeker als ik er zelf ook mijn kostbare tijd ingestoken heb.
Maar goed dat ik dat tot nog toe niet gedaan had in deze thread dus.

Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

Rene4312

#10
Dec 12, 2014, 11:44 pm Last Edit: Dec 12, 2014, 11:51 pm by Rene4312
Nog niet te laat: Even de originele vraag uit google cache geplukt:


Quote
Beste,

Ik ben bezig met het maken van een stoplicht met Arduino, hij moet er als volgt uit komen te zien.

Stoplicht 1 (Voor auto): Rood, Geel, Groen
Stoplicht 2 (Voor fiets): Rood, Groen

De wisselwerking moet worden Rood 1, Groen 2 en daarna Rood 2, Groen 1 en wissel 1 met oranje. (Dit stukje werkt al, zie code onder)

Enkel is mijn vraag nu hoe ik het kan maken dat als een fietser bij stoplicht 2 op een knop (button) drukt dit wordt gemerkt, stoplicht 1 op rood gaat en stoplicht 2 op groen, dus drukken en hij wordt groen.
Dit moet middels een if maar kan iemand mij hierbij helpen want dit lukt niet...

De code die ik nu heb:

 
int rood = 6;
int geel = 5;
int groen = 4;
int roodvoetganger = 3;                                                                                                                       
int groenvoetganger = 2;


void setup(){
pinMode(rood,OUTPUT);
pinMode(geel,OUTPUT);
pinMode(groen,OUTPUT);
pinMode(roodvoetganger,OUTPUT);
pinMode(groenvoetganger,OUTPUT);


}
void loop(){
changeLights();
delay(1000);
}
void changeLights(){


digitalWrite(rood,HIGH);
digitalWrite(geel,LOW);
digitalWrite(groen,LOW);
digitalWrite(roodvoetganger,HIGH);
digitalWrite(groenvoetganger,LOW);
delay(800);


digitalWrite(rood,HIGH);
digitalWrite(geel,LOW);
digitalWrite(groen,LOW);
digitalWrite(roodvoetganger,LOW);
digitalWrite(groenvoetganger,HIGH);
delay(4000);


digitalWrite(rood,HIGH);
digitalWrite(geel,LOW);
digitalWrite(groen,LOW);
digitalWrite(roodvoetganger,LOW);
digitalWrite(groenvoetganger,LOW);
delay(300);


digitalWrite(rood,HIGH);
digitalWrite(geel,LOW);
digitalWrite(groen,LOW);
digitalWrite(roodvoetganger,LOW);
digitalWrite(groenvoetganger,HIGH);
delay(300);


digitalWrite(rood,HIGH);
digitalWrite(geel,LOW);
digitalWrite(groen,LOW);
digitalWrite(roodvoetganger,LOW);
digitalWrite(groenvoetganger,LOW);
delay(300);


digitalWrite(rood,HIGH);
digitalWrite(geel,LOW);
digitalWrite(groen,LOW);
digitalWrite(roodvoetganger,LOW);
digitalWrite(groenvoetganger,HIGH);
delay(300);


digitalWrite(rood,HIGH);
digitalWrite(geel,LOW);
digitalWrite(groen,LOW);
digitalWrite(roodvoetganger,LOW);
digitalWrite(groenvoetganger,LOW);
delay(300);


digitalWrite(rood,HIGH);
digitalWrite(geel,LOW);
digitalWrite(groen,LOW);
digitalWrite(roodvoetganger,LOW);
digitalWrite(groenvoetganger,HIGH);
delay(300);


digitalWrite(rood,HIGH);
digitalWrite(geel,LOW);
digitalWrite(groen,LOW);
digitalWrite(roodvoetganger,LOW);

digitalWrite(groenvoetganger,LOW);
delay(300);


digitalWrite(rood,HIGH);
digitalWrite(geel,LOW);
digitalWrite(groen,LOW);
digitalWrite(roodvoetganger,HIGH);
digitalWrite(groenvoetganger,LOW);
delay(800);


digitalWrite(rood,LOW);
digitalWrite(geel,LOW);
digitalWrite(groen,HIGH);
digitalWrite(roodvoetganger,HIGH);
digitalWrite(groenvoetganger,LOW);
delay(4000);

                                                             
digitalWrite(rood,LOW);
digitalWrite(geel,HIGH);
digitalWrite(groen,LOW);
digitalWrite(roodvoetganger,HIGH);
digitalWrite(groenvoetganger,LOW);
delay(1500);
}           

//project bij Raymon

Bij voorbaat dank,

Raymon                                                               
Misschien kan Raymon hem in het originele bericht terugplakken?

René.

Go Up