Nu wil je waarschijnlijk naar die 8 LEDs toe en dan zou je die blokjes moeten herhalen. Daarom is het beter een andere oplossing te kiezen waar je met een for-loop door de bits kunt lopen.
De rest van de puzzel laat ik even aan jou over; je kunt een array van pinnen gebruiken voor de LEDs en cnt gebruiken om een element uit dat array te pikken en de pin hoog of laag te maken.
Ik ga het bestuderen.
Maar wat ik bedoel is hoe zorg ik ervoor als ik geen delay gebruik , de led die ik wil laat branden 1 sec brandt en dan een "pauze" heeft van 1 sec.
Ik had begrepen dat je een binaire teller wilde maken en dacht dat je met het binaire stuk vast zat. Het demo programma demonstreert het binaire teller gedeelte.
Ik heb delay() gebruikt omdat ik voor de demo lui ben. Als je blink-without-delay begrijpt is het eenvoudig om de implementatie te veranderen. Als je blink-without-delay nog niet begrijpt moet je dat eerst onder de knie krijgen voordat je verder gaat.
Als je een uitleg nodig hebt van blink-without-delay moet je het laten weten. Ik weet niet zeker of je je wokwi programma doet wat je ervan verwacht; voor mijn gevoel zit er iets niet goed maar ik weet niet wat het programma veronderstelt wordt te doen.
counter is een globale variabele en globale variabelen worden geïnitialiseerd met 0 als je niet specifiek een specifieke waarde meegeeft.
Op dit moment doet het niet wat ik verwacht. Was aan het toewerken naar de binaire teller.
Eerst een kleine om daarna het meer complex te maken.
Wat ik begrijp tot nu toe, is dat je een interval stelt
daarna laat je de interne klok lopen en checked of de interval verlopen is.
Met een led snap ik hoe het werkt, maar zoals ik al probeer te vragen zie ik niet hoe ik dan 2 leds' kan besturen die dan aangaan als ik wil en weer uitgaan wanneer ik wil.
Als ik dit ga begrijpen, kan ik denk ik ook verder werken aan de binaire teller.
Terug naar (1), door naar (2), terug naar (1) enz.
Uiteindelijk zal de seconde verstreken zijn. Dat kan zijn zijn aan het begin van loop() of tussen de twe testen (if) of aan het eind van loop(). Laten we zeggen dat dat gebeurt vlak voordat je (1) controleert. De rode LED zal nu omgeschakeld worden en je zet een nieuwe start tijd.
Je komt weer bij (2) terecht maar omdat je net een nieuwe start tijd gezet hebt zal de conditie niet waar zijn en wordt de blauwe LED dus niet omgeschakeld worden.
Weer een aantal keer (1) en (2) totdat er een seconde verstreken is; dit keer bv tussen (1) en (2). Dus zal de blauwe LED nu omgeschakeld worden en een nieuwe tijd zal gezet worden. Als een resultaat is er geen kans dat de rode LED omgeschakeld worden voordat er weer een seconde verstreken is.
Als je de twee LEDs volledig onafhankelijk van elkaar wilt laten knipperen zul je twee nextTime variabelen moet gebruiken (bv nextTimeRed en nextTimeBlue); als je ook nog verschillende intervallen nodig hebt zul je ook twee INTERVAL constanten nodig hebben.
Het zal een zooitje worden als je dit voor acht LEDs wilt doen, dan ben je beter af met een andere benadering.
dat zie ik,
Dan wordt de code een mooi zootje met 8 keer een nextTime en 8 keer een interval.
Eens goed nadenken en experimenteren hoe het dan op te lossen.
Makkelijke oplosing is dan toch delay te gebruiken maar om te oefenen is het ook goed om eens buiten de gebaande paden te kijken.
En oefenen is de enigste manier om te leren hoe iets kan zonder delay te gebruiken.
Kan heel handig zijn denk ik als de projecten echt complex worden.
Één opmerking: nextTick += INTERVAL; zal je bij de millis() overflow (dus na zo'n 49 dagen) een probleem opleveren. De reden is dat nextTick ineens van een heel groot getal naar een klein getal gaat en millis() op dat moment nog een heel groot getal is en de conditie dus nog steeds waar is.
Het is beter of iets te gebruiken als
IK denk dat je de variable ledPinRed vergeten bent te declaren,
Ik ga eens dit goed bestuderen om te kijken of ik dit idee kan gebruiken van de teller.
eerst met 2 led's en dan steeds uitbreiden tot het werkt met 8 led's .
en het idee is nog steeds om te kijken of ik het kan laten werken maar dan zonder delay te gebruiken.
En eens goed nadenken welke kleine stappen ik kan doen om van deze code naar een teller toe te komen.
// macro to calculate number of elements in an array of any size
#define NUMELEMENTS(x) (sizeof(x) / sizeof(x[0]))
// struct for LED
struct LED
{
uint8_t pin; // the pin
uint32_t lastTime; // last time that timing lapsed
const uint32_t interval; // interval
};
LED leds[] = {
{ 6, 0, 666 },
{ 4, 0, 333 },
};
void setup()
{
for (uint8_t cnt = 0; cnt < NUMELEMENTS(leds); cnt++)
{
pinMode(leds[cnt].pin, OUTPUT);
}
}
void loop()
{
}
Door gebruik te maken van een for-loop blijft je programma schoon. Geen twee of acht regels om de pinMode te zetten voor je LEDs.