Stap 3: Software, deel 2
void loop() { for (i=0; i<steps; i++) { duty = lookup[i] * 5; for (j=0; j<sunrisespeed; j++) { // one pulse of PWM digitalWrite(pulsepin, HIGH); delayMicroseconds(duty); digitalWrite(pulsepin, LOW); delayMicroseconds(5000-duty); } } }
Dit is het deel van het programma dat de pulsen produceert. De binnenste lus geeft een reeks van pulsen bij een bepaalde helderheid. Het Hiermee schakelt u de LED's voor een aantal microseconden bepaald door de huidige helderheid niveau, dan wordt ze uitgeschakeld voor de rest van 5 milliseconden. Dit betekent dat het programma genereert een constante frequentie signaal, waardoor timing eenvoudiger. Het aantal pulsen wordt bepaald door sunrisespeed, die beurtelings bepaalt hoe snel de lamp helderder.
De buitenste lus doorlopen de matrix met helderheidswaarden, ze in volgorde uit te lezen en produceren een reeks van pulsen van de opgegeven helderheid. In dit geval, vergroot het de waarde uit de opzoektabel door 5, omdat ik in eerste instantie berekend van de waarden naar bereik van 0-1000, maar de Arduino is niet nauwkeurig timing tussenpozen minder dan 5 microseconden. Ik gebruikte 5 milliseconden als de frequentie van de puls als een compromis-proberen om sneller dan dit het aantal mogelijke helderheidswaarden vanwege beperkingen in de Arduino van timing vermindert, maar peulvruchten veel langer dan 5ms beginnen te worden zichtbaar voor het menselijk oog als flikkering pulse.
Zodra de lus bereikt zou het einde gewoon opnieuw wordt gestart op de laagste helderheid instelling - ideaal op dit punt u wakker, zodat de timeswitch de Arduino uitschakelen na de tijd die een volledige cyclus (in mijn geval ongeveer 25 minuten) kunt instellen.