Waarom werkt pulstimer anders dan verwacht?

Met behulp van Blink without delay heb ik geprobeerd om een timer te maken waarbij de puls maar een korte tijd hoog is en de rest van de intervaltijd laag.

Na vele niet goed werkende versies heb ik eindelijk een versie die zoals ik het wil werkt. Alleen ben ik verbaasd dat het deel met intervaltijd variabele p=HIGH maakt maar de led juist op dat moment niet brand.

Maak ik ergens een denkfout of gebeurt er iets wat toevallig goed gaat?

bool puls = LOW;
int interval = 2000;                                     // Interval tussen pulsen


void setup () {

   pinMode(5, OUTPUT);

}

void loop () {
  pulsGever (interval, puls);
  digitalWrite(5, puls);
}

// Functie voor pulsgever

void pulsGever (int i, bool &p) {                        // pulsGever(interval, puls) als eerste de interval ingeven en daarna variabele voor HIGH/LOW. Het & teken zorgt voor terugkoppeling vanuit functie.
static unsigned long timerNu=0;                          // Variabele voor timer
static unsigned long timerOud=0;                         // Variabele voor timer

// Deel intervaltimer
  timerNu = millis();                                    // Start intervaltimer
  if (timerNu - timerOud > i && p == LOW) {              // Controleer of intervaltijd voorbij is
    timerOud = timerNu;                                  // timer 'resetten'
    p = HIGH;
  }

// Deel pulstimer
 if (timerNu-timerOud> 25 && p == HIGH) {                // Controleer of pulstijd voorbij is
    timerOud = timerNu;
    p = LOW;
  }
}

De pulsfunctie wordt gebruikt in een 8 led's looplicht met meerdere patronen. Met de standaard blink code werd er 30 seconden lang van patroon gewisseld om daarna 30 seconden lang 1 patroon te blijven weergeven. Door de bovenstaande code werkt het looplicht nu zoals ik het wil hebben.

is de anode van de LED (via een weerstand) met de +5V verbonden en de kathode van de LED met de Arduino pin?

Dan is het normaal dat het werkt zoals je beschrijft.

Nee, om de led aan te sturen moet ik de uitgang hoog maken. Dat is ook de reden dat ik verbaasd ben dat deze code werkt.

jrheuwing:
Nee, om de led aan te sturen moet ik de uitgang hoog maken. Dat is ook de reden dat ik verbaasd ben dat deze code werkt.

Nog eens die post lezen en goed nadenken.

@Jantje: Zoals ik het bericht van Ardlab_Gent lees gaat hij van het linker schema in de afbeelding uit. In het rechter schema is het zoals ik het heb aangesloten. Of bedoel je wat anders?

Om een led goed aan te sluiten gebruik ik altijd het ezelsbruggetje KNAP.

Kathode = Kort = Negatief
Anode = Positief

Nu ik mijn eigen code nog eens goed heb bekeken, begin ik het te begrijpen. Zolang de 'if' statement met interval nog niet waar is wordt de led nog niet aangestuurd. Dat gebeurt pas nadat de intervaltijd voorbij is.

Die shema’s zijn correct en het ljkt me nu dat je dat ook goed begrijpt.
Ik zie echter geen verband tussen je uitleg en je code. looplicht met 1 pin?
Volgens mij geeft je code om de 2000ms een hoog puls van 25 ms.

Deze code is er alleen om te testen of de pulsgever werkt zoals ik wil. De code komt in een project waarin een looplicht zit met 8 led’s. Met de standaard blink without delay bleef het looplicht tussen de patronen wisselen zolang als de blink HIGH was. Door de HIGH puls in te korten kan ik wel een interval van 30 seconden aanhouden zonder dat er 30 seconden lang van patroon wordt gewisseld.

In de bijlage het .ino bestand van het looplicht. Er is nog wel wat te doen om de code optimaal te krijgen.

Looplicht_8X.ino (12.7 KB)