Waar zit mijn denkfout ?

Hoi,

ik probeer met 6 led dit werkend te krijgen.

Eerst gaan led 1 tot en met led 6 aan beginnend met led 1 en eindigen met led 6 zodat je eindigt met alle leds brandend.
Daarna gaan led 1 tot en met led 6 uit beginnend met led 1 en eindigen met led 6 zodat je eindigt met alle leds uit.

Maar dan gaat alleen led1 uit .

Zie : https://wokwi.com/projects/438637724390048769

Probeer het onderstaande; het schijnt misschien wat licht op je probleem.

Zoals gewoonlijk, gebruik de seriële monitor voor het debuggen.

uint8_t ledPins[] = {6, 10, 11, 9, 5, 3};
int NUMLEDS = 6;


void setup() {
  Serial.begin(115200);
  
  for (uint8_t cnt = 0; cnt < 6; cnt++) {
    pinMode(ledPins[cnt], OUTPUT);
  }

}

void loop() {
  static uint8_t idx;
  static bool ledOff = false;

  if (idx == NUMLEDS) {
    idx = 0;
    ledOff = true;
  }
  Serial.println(idx);

  if (ledOff) {
    digitalWrite(idx, 0);
    idx -= 1 ;
    if (idx == 0)  {
      ledOff = false;
    }
  } else {

    digitalWrite(idx, 255);
    idx += 1 ;
  }

  delay(500);
}

Die bevestigd wat ik al dacht :

```
0 1 2 3 4 5 0 255 254 253 252 251
```

Deze code laat de goede nummer zien

```
void loop() {

static uint8_t idx;

if (idx == NUMLEDS) {

idx = 0;

}

Serial.println(idx);

idx += 1 ;

delay(500);

}
```

Maar de tweede ronde gaan de juiste leds niet meer aan

Maar even denken waar en hoe ik de flag weer uitzet als alles uit is nadat alles weer aan is.

kom er weer eens niet uit.

Iemand een hint ?

Denk dat ik het gevonden heb
Met deze code :

uint8_t ledPins[] = {6, 10, 11, 9, 5, 3};

int NUMLEDS = 6;

void setup() {

  Serial.begin(115200);

  for (uint8_t cnt = 0; cnt < 6; cnt++) {

       pinMode(ledPins\[cnt\], OUTPUT);
  }
}

void loop() {

    static uint8_t idx;

    static bool ledOff = false;

    if (idx > NUMLEDS) {

         idx = 0;

        ledOff = !ledOff; 
   }

    Serial.println(idx);

    if (ledOff) {

        digitalWrite(ledPins\[idx\], 0);
   }
 
   else {

        digitalWrite(ledPins\[idx\], 255);
    }

    idx += 1;

   delay(500);

}

Ik heb de ontwikkeling niet gezien, zie alleen wat je nu in je Wokwi hebt.
Dat doet wel ongeveer wat je vraagt.
Je beschrijving van wat je in debug zag, had te maken met een fout in de overflow afhandeling, wanneer je aan het aftellen was.

Wel jammer dat je weer de debug eruit hebt gesloopt.
Wat mij opvalt aan de werking, is dat wanneer je je cirkel rond bent, er een extra delay gedaan lijkt te worden.
Dus LED 0 aan of uitzetten, duurt langer dan de tijd die tussen elke andere LED handeling zit.
Wat me ook opvalt, is dat je digitale writes doet met analoge waardes.
Dat werkt, omdat je dan niet de digitale waarde nul schrijft, maar het is niet netjes en gaat jou in de toekomst verwarren.
Ik raad je daarom aan om analoge waardes te schrijven want dat was het uiteindelijke effect wat ik voor ogen had (vergelijkbaar met 'staart').
Dan kun je het wel met een waarde als 255 doen zonder dat dat tot verwarring zou kunnen leiden.

Ik heb weer wat extra debug erin gehackt, en daarmee kan ik verklaren wat ik hierboven zag en een opmerking over maakte, en ik kan je ook zeggen dat je het risico loopt op vastlopen van je sketch omdat je buiten je gedeclareerde geheugen werkt.
Dit zijn wel dingen die je al eerder opgelost hebt.

Nog een laatste tip:
Laat je debug in je code staan.
Als jij er geen gebruik meer van denkt te hoeven maken, maak er dan commentaar van.
Dan kan iemand die met je mee wil kijken, dat commentaar weer weghalen en zien wat er gebeurt, zonder dat die je sketch moet gaan zitten hacken om uit te vinden wat er precies gebeurt.

Hmm.
Nu zie ik dat je wel wat debug had laten staan maar dat dat niet werkte in Wokwi.
Pas nadat ik meer debug erin had gezet, werkt die ene regel van jou ook weer.
Kijk goed naar de LEDs en kijk dan ook naar jouw debug informatie.

Kijk goed naar de idx als je die print. Deze loopt van 0..6 !!

opgelost

 if (idx >= NUMLEDS) {

@MAS3

Dus jij zoekt naar deze code :

uint8_t ledPins[] = {6, 10, 11, 9, 5, 3};
int NUMLEDS = 6;


void setup() {
  Serial.begin(115200);
  
  for (uint8_t cnt = 0; cnt < 6; cnt++) {
    pinMode(ledPins[cnt], OUTPUT);
  }

}

void loop() {
  static uint8_t idx;
  static bool ledOff = false;

  if (idx >= NUMLEDS) {
    idx = 0;
    ledOff = !ledOff; 
  }

  Serial.println(idx);
  

  if (ledOff) {
    analogWrite(ledPins[idx], LOW);

  }
  else {
    analogWrite(ledPins[idx], HIGH);
  } 

  idx += 1; 
  delay(500);
}

Nee.

Het is één van de twee:
digitalWrite(pin, HIGH);
of
analogWrite(pin, 255);

HIGH is gedefinieerd als 1 dus een analogWrite(pin, HIGH) schrijft de PWM waarde 1 naar de pin.

oke

verandert naar :

uint8_t ledPins[] = {6, 10, 11, 9, 5, 3};
int NUMLEDS = 6;


void setup() {
  Serial.begin(115200);
  
  for (uint8_t cnt = 0; cnt < 6; cnt++) {
    pinMode(ledPins[cnt], OUTPUT);
  }

}

void loop() {
  static uint8_t idx;
  static bool ledOff = false;

  if (idx >= NUMLEDS) {
    idx = 0;
    ledOff = !ledOff; 
  }

  Serial.println(idx);
  

  if (ledOff) {
    analogWrite(ledPins[idx], 0);

  }
  else {
    analogWrite(ledPins[idx], 255);
  } 

  idx += 1; 
  delay(500);
}

omdat ik denk dat @MAS3 dat bedoelde.

sterretje heeft gelijk, het is het een of het ander en zijn uitleg klopt ook precies.
Jouw recentste code is inderdaad wat ik in gedachten had, maar het gaat wel ietsje verder.
Want als je alleen maar aan of uit hebt, werken de laatste serie aanpassingen niet zo goed.
Je kunt ze met en zonder fading uitwerken (dat faden gaat je wel wat meer uitdagen), maar ik denk dat met het mooiste resultaat zal geven.

Dit is geen opdracht, maar een voorstel waar je wel of niet (of wat daar ook tussenin te vinden is) kunt oppakken.

@MAS3

Oke, ik moet die laatste aanpassingen even uitproberen.

Nadat ik een foutje hebt opgelost, lijkt het gewoon te werken hier : https://wokwi.com/projects/438637724390048769

Dus wat bedoel je precies met dat de laatste serie aanpassingen niet zo goed werken.

Maar hoe zie jij dan de fading met de laatste effect waar eerst 1 - 6 aangaan en dan 1-6 uitgaan.

en ik moet even kijken wanneer ik dan het faden probeer op te lossen.

Dit staat nog op mijn todo lijst

  1. Implementeren van de led ring in mijn hoofdprogramma met een "onzin" effect.
  2. Overzetten van alle bestaande effecten naar de led ring
  3. Alle effecten een apart bestand geven
  4. Kijken welke effecten werkelijk een richting en/of snelheids regeling nodig hebben.
  5. Implementeren van alle andere effecten die jij of ik nog hebben bedacht.

@sterretje is dit is een goede lijst ?

Als "hoofdprogramma" je huidige LCD/knoppen/LEDs programma is wordt dat een beetje lastig.

Zoals gezegd zou ik een test programma schrijven met aangepaste pins.h, output.h en output.cpp bestanden.
In het ino bestand zou ik een simpel effect implementeren (FastLed blink.ino of Adafruit's simple.ino) dat gebruik maakt van een aangepaste setOutputs() en de aangepaste pwmLed() / pwmAll() functies.

Het geheel zou er zo uit kunnen zien

testProgramma
+-- testProgramma.ino
+-- pins.h
+-- outputs.cpp
+-- outputs.h

En in de simpelste vorm kan het ino bestand er zo uit zien:

...
...
void setup()
{
  Serial.begin(115200);
  setupOutputs();
}

void loop()
{
  simpelEffect();
}

void simpleEffect()
{
  pwmLed(0, CRGB::Red);
  delay(500);
  pwmLed(0, CRGB::Black);
  delay(500);
}

Dit is gebaseerd op de FastLED bibliotheek. Het gebruikt delay() maar dat is geen probleem als je dit gebruikt om je pwmLED() / pwmAll() te testen hetgeen het doel is van de oefening.

Dat is verder aan jou om te beslissen.

oke

dan heb ik je daarin verkeerd begrepen.

Ik dacht dat ik in het huidige LCD/knoppen/LEDS programma was.

IK ga dan vandaag het testprogramma schrijven.

Eerst met een delay en dan zonder delay ??