[opgelost] Vraag stoplicht code arduino

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:

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

Je hoeft alleen maar de veranderingen te programmeren.
De hele changeLights is tot een derde in te korten tot

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.]

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

Ik heb nu de volgende code:

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

gelieve code tags te gebruiken.
De moderator.

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'.

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.

rdejong2:
Verholpen Danku Cartoonist

Graag gedaan, kom gerust ook nog eens terug met een ander beginners of gevorderd-beginners probleem.

@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.

@ 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.

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.

Nog niet te laat: Even de originele vraag uit google cache geplukt:

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é.