Page 1 of 1
Forum

Welcome to the Tweaking4All community forums!
When participating, please keep the Forum Rules in mind!

Topics for particular software or systems: Start your topic link with the name of the application or system.
For example “MacOS X – Your question“, or “MS Word – Your Tip or Trick“.

Please note that switching to another language when reading a post will not bring you to the same post, in Dutch, as there is no translation for that post!



Trafic light effect
 
Share:
Notifications
Clear all

[Solved] Trafic light effect

4 Posts
2 Users
1 Reactions
1,499 Views
 lars
(@lars)
New Member
Joined: 4 years ago
Posts: 2
Topic starter  

Beste mensen,

Voor een school opdracht moet ik een code schrijven in Arduino voor de werking van een verkeerslicht.
Een tijdje terug heb ik de volgende code geschreven en ingeleverd:

int autoRood = 12; // Om de stoplichten voor auto toe te wijzen

int autoGeel = 11;

int autoGroen = 10;

int voetgangerRood = 9; // Om de stoplichten voor voetganger toe te wijzen

int voetgangerGroen = 8;

int knop = 2; // Indrukbare knop

int oversteektijd = 4000; // Tijd om als voetganger te kunnen oversteken

unsigned long changeTime; // Tijd sinds de knop is inngedrukt

void setup() {

  pinMode(autoRood, OUTPUT);

  pinMode(autoGeel, OUTPUT);

  pinMode(autoGroen, OUTPUT);

  pinMode(voetgangerRood, OUTPUT);

  pinMode(voetgangerGroen, OUTPUT);

  pinMode(knop, INPUT); // Drukknop op pin 2

  digitalWrite(autoGroen, HIGH); // Als standaard groen aan

  digitalWrite(voetgangerRood, HIGH); // Als standaard rood aan

  attachInterrupt(digitalPinToInterrupt(0), changeLights, RISING);

}

void loop() {
  int state = digitalRead(knop);
  if (state == HIGH && (millis() - changeTime) > 5000) // Bij het passeren van 5000 wordt Changetime weer bijgewerkt naar de starttijd
  {

    changeLights();

  }

}

void changeLights() // De functie om de lichten te veranderen

{

  digitalWrite(autoGroen, LOW); // groen uit

  digitalWrite(autoGeel, HIGH); // geel aan

  delay(500); // wacht 0,5 seconden

  digitalWrite(autoGeel, LOW); // geel uit

  digitalWrite(autoRood, HIGH); // rood aan

  delay(1000); // wacht 1,0 seconde

  digitalWrite(voetgangerRood, LOW); // voetganger rood uit

  digitalWrite(voetgangerGroen, HIGH); // voetganger groen aan

  delay(oversteektijd); // de vooraf ingestelde wachttijd

  digitalWrite(voetgangerGroen, LOW);

  {

  }

  digitalWrite(voetgangerRood, HIGH); // voetganger rood aan

  digitalWrite(autoRood, LOW); // rood gaat uit

  digitalWrite(autoGroen, HIGH);

  digitalWrite(autoGeel, LOW); // geel gaat uit

  changeTime = millis(); // Changetime heeft de waarde van millis

} // Herhaal / Loop

 

Hierbij kreeg ik het volgende als opmerking:

''Je mist nog 1 onderdeel, namelijk de interrupt  of de statemachine. In je code heb je wel een interrupt gedeclareerd echter gebruik je nog steeds een digitalread. MAW de interrupt doet niets.''

 Oftewel ik moet de interrupt werkend zien krijgen en daarbij de digitalread verwijderen. 

Iemand enig idee hoe ik de code zo kan veranderen dat het aan deze eisen voldoet en daarbij ook werkend is ??

 

Met Vriendelijke Groet,
Lars

This topic was modified 4 years ago 2 times by lars

   
ReplyQuote
 Hans
(@hans)
Famed Member Admin
Joined: 12 years ago
Posts: 2832
 

Hoi Lars,

Ik denk dat je per ongeluk dit gepost het in het Engelstalige forum, waar de voertaal Engels is.
Het had beter geweest de vraag in het Engels te stellen of in het Nederlands maar dan in het Nederlandstalige Arduino forum.

De functie "attachInterrupt" roep je inderdaad netjes aan in setup, en koppel je aan de functie "changeLights".
(hier een ander voorbeeld van het gebruik van een interrupt)

Merk op: Het kan nodig zijn om de pin van de interrupt know op "PULLUP" te zetten, maar dat kan ik niet met 100% zekerheid zeggen;

pinMode(knop,INPUT_PULLUP);  // internal pull-up resistor

 

Het stukje code in loop draagt echter niks bij, die kan zelfs leeg zijn wat dit voorbeeld betreft.
Ik neem aan dat de "knop" het knopje is voor de voetgangers, voor als ze willen oversteken.

Dus in loop zou je de gewone gang van zaken voor auto's kunnen laten lopen, zoiets als hieronder.
Het lezen van de knop (digitalRead(knop);) is hier overbodig.
Het indrukken van de knop zorgt er namelijk al voor dat changeLights() wordt aangeroepen.

void loop() {
  if ( (millis() - changeTime) > 5000) // Bij het passeren van 5000 wordt Changetime weer bijgewerkt naar de starttijd
  {
    changeLights();
  }
}

 

Beetje verwarrende opmerking van jouw leraar ... maar ik denk dat dit is wat hij/zij bedoelt.

 


   
ReplyQuote
 lars
(@lars)
New Member
Joined: 4 years ago
Posts: 2
Topic starter  

@hans
Hoi Hans,

Bedankt voor de reactie!
Naar aanleiding van de feedback is dit nu de code:

int autoRood = 12; // Om de stoplichten voor auto toe te wijzen

int autoGeel = 11;

int autoGroen = 10;

int voetgangerRood = 9; // Om de stoplichten voor voetganger toe te wijzen

int voetgangerGroen = 8;

int knop = 2; // Indrukbare knop

int oversteektijd = 4000; // Tijd om als voetganger te kunnen oversteken

unsigned long changeTime; // Tijd sinds de knop is inngedrukt


void setup() {

pinMode(autoRood, OUTPUT);

pinMode(autoGeel, OUTPUT);

pinMode(autoGroen, OUTPUT);

pinMode(voetgangerRood, OUTPUT);

pinMode(voetgangerGroen, OUTPUT);

pinMode(knop, INPUT_PULLUP); // Drukknop op pin 2

digitalWrite(autoGroen, HIGH); // Als standaard groen aan

digitalWrite(voetgangerRood, HIGH); // Als standaard rood aan

attachInterrupt(digitalPinToInterrupt(0), changeLights, RISING);

}

void loop() {
if ( (millis() - changeTime) > 5000) // Bij het passeren van 5000 wordt Changetime weer bijgewerkt naar de starttijd
{

changeLights();

}
}

void changeLights() // De functie om de lichten te veranderen

{

digitalWrite(autoGroen, LOW); // groen uit

digitalWrite(autoGeel, HIGH); // geel aan

delay(500); // wacht 0,5 seconden

digitalWrite(autoGeel, LOW); // geel uit

digitalWrite(autoRood, HIGH); // rood aan

delay(1000); // wacht 1,0 seconde

digitalWrite(voetgangerRood, LOW); // voetganger rood uit

digitalWrite(voetgangerGroen, HIGH); // voetganger groen aan

delay(oversteektijd); // de vooraf ingestelde wachttijd

digitalWrite(voetgangerGroen, LOW);

{

}

digitalWrite(voetgangerRood, HIGH); // voetganger rood aan

digitalWrite(autoRood, LOW); // rood gaat uit

digitalWrite(autoGroen, HIGH);

digitalWrite(autoGeel, LOW); // geel gaat uit

changeTime = millis(); // Changetime heeft de waarde van millis

} // Herhaal / Loop

Ik ga dit zo snel mogelijk opsturen naar mijn docent, de feedback daarvan zal ik doorgeven.
In iedergeval heel erg bedankt voor het verbeteren.

Groet,
Lars

This post was modified 4 years ago by lars

   
Hans reacted
ReplyQuote
 Hans
(@hans)
Famed Member Admin
Joined: 12 years ago
Posts: 2832
 

Ik ben benieuwd! 😊  Success! 👍 


   
ReplyQuote
Share: