[Help] Probleem Met For Loop

Hallo allemaal,

Ik ben bezig met een code voor een spoorwegovergang. Hierbij wil ik graag spoorbomen laten bewegen en LEDjes laten knipperen. Deze LEDjes laat ik knipperen door middel van een For Loop. Maar hoe kan ik deze For Loop eerder eindigen doordat een LDR-sensor (LDRValue2 in de code) een hoog signaal afgeeft. Nadat de for loop is gestopt moet de code die na de For Loop staat meteen gaan werken.

Het gaat om de volgende code:

      for (int i = 0; i < numberBlinks; i++) 
      {
        digitalWrite(LED1, HIGH);
        digitalWrite(LED2, LOW);
        delay(interval);
        digitalWrite(LED1, LOW);
        digitalWrite(LED2, HIGH);     
        delay(interval); 
      } 
}
    if(LDRValue2 > Light_sensitivity) 
    digitalWrite(IN3,LOW);//spoorbomen naar boven
    digitalWrite(IN4,HIGH);

Hopelijk heb ik mijn probleem goed genoeg uitgelegd en kan iemand mij helpen.

Groetjes, Knaxmax

Als je een loop wil onderbreken gebruik je het break; statement

Hoi hoi,

Welkom hier! Zou je je post willen aanpassen en de code in code-tags willen zetten? Zoals dit

[code]
//hier alle code
[/code]

Dat maakt de code op het forum een stuk leesbaarder. Ook is het vaak niet handig om maar stukjes (snippets) te plaatsen. Zie http://snippets-r-us.com/

Maar goed, terug naar het probleem. Iets buiten de for loop kan nooit de loop beïnvloeden. Dus je zal het in de loop moeten doen.

for (int i = 0; i < numberBlinks; i++)
{
  digitalWrite(LED1, HIGH);
  digitalWrite(LED2, LOW);
  delay(interval);
  digitalWrite(LED1, LOW);
  digitalWrite(LED2, HIGH);     
  delay(interval);
  if(LDRValue2 > Light_sensitivity)
  {
    break; //hiermee wordt uit de loop gebroken
  }
}

Maarrrrrrrr, dit zal nog steeds niet op ieder moment de for loop stoppen. Pas aan het einde van de loop wordt gekeken of er gestopt moet worden. Stel dat LDRValue2 boven Light_sensitivity uit komt terwijl LED1 brandt (aan het begin van de loop) dan zal er pas actie ondernomen worden na de delay() over is, led1 uit gedaan wordt, LED2 aan gedaan wordt en er WEER een delay() afgelopen is.

Dit is waarom het gebruik van delay() voor problemen zorgt. Tijdens een delay() kan er helemaal niets gebeuren, niet eens reageren op een schakelaar of iets. Daarom is het beter om millis() te gebruiken. Aangezien je variabelen in het Engels zijn ga ik er vanuit dat je Engels kunt lezen. Google daarom eens op Blink without delay en zie wat ze doen

En dan nog twee tips

  1. Hoe dezelfde stijl voor namen vast. Je hebt nu variabelenNamenZoalsDit, Maar_ook_als_dit en ZELFS_ALS_DIT. Dit maakt het er niet makkelijker op om te onthouden hoe je de variabelen naam schrijft. De standaard in Arduino land is omDitAlsNormaleVariabele (bijvoorbeeld unsigned int ldrValue) te gebruiken, EnDitVoorEenConst (bijvoorbeeld const unsinged int LightSensitivity)

  2. Zodra je variabelen nummers gaat geven, gebruik een array :slight_smile: Dus

//in plaats van
const byte LedPin1 = 5;
const byte LedPin2 = 6;

//doe je
const byte LedPins[] = {5, 6}; //let op, meervoud

//en nu kan je de eerste gebruiken als
LedPins[0]; //let op, tellen begint zoals alles in de digitale wereld bij 0

Bedankt voor de handige tips nicoverduin en septillion.
Ik zal me is even gaan verdiepen in Blink without delay.

Jullie horen nog wel van me wanneer het is gelukt of wanneer ik nog verdere vragen heb.

Groetjes,
Knaxmax

maak er dan gelijk een functie van het knipperen (dat is handig voor later)
en de lampjes gaan pas uit als de bomen omhoog zijn.
en de lampjes gaan aan 10 seconden voor de bomen naar beneden gaan.
Je start is overigens prima hoor, is ook logisch he dat je er een paar keer laat knipperen.
Liefst volgende keer wel het hele programma, want dat geeft wat meer inzicht, helaas voor jou ook meer commentaar.