Hoe maak ik een staart met led ?

Neem aub je rust, Die is heeel belangrijk.
ik zeg altijd eerst gezondheid, daarna gezin en daarna de rest.

Blijf hetzelfde probleem houden omdat ik denk ik niet helemaal zie wat je bedoeld met eerst de leds aanzetten en dan kijken naar een overflow.
Na mijn idee doen we dit al

Code :

// Alle pinnen van de leds 
const uint8_t ledPins[] = { 9, 11, 10, 6, 3, 5 };

// de pin van de potmeter
byte Potpin = A3;
// de waarde die de potmeter aangeeft
int Potvalue;

// geeft de richting aan waar de led moeten draaien.
byte richting;

// houdt de index bij van de huidige brandende led 
byte currentLed = 0;
// houdt de index bij van de eerste led van de staart
byte trail1 = 0 ;
// houdt de index bij van de tweede led van de staart 
byte trail2 = 0 ; 
// houdt de index bij van de derde led van de staart 
byte trail3 = 0;


void setup()
{
  // Zet de seriele monitor aan
  Serial.begin(115200);
  
  for (uint8_t cnt = 0; cnt < sizeof(ledPins); cnt++)
  {
    // Zet alle leds uit
    analogWrite(ledPins[cnt], 0);
    // Zet de pin mode op output
    pinMode(ledPins[cnt], OUTPUT);
  }
}


void loop()
{
  // Lees de waarde van de potmeter
  Potvalue = analogRead(Potpin);

  ////////////////////////
    // aansturen LEDs
    ////////////////////////
   
    
    // Zet de led die de index currentLed heeft aan.
    analogWrite(ledPins[currentLed], 255);
    analogWrite(ledPins[trail1], 117); 
    analogWrite(ledPins[trail2], 54);
    analogWrite(ledPins[trail3], 25); 

    delay(200); 

    analogWrite(ledPins[trail1],0);
    analogWrite(ledPins[trail2],0);
    analogWrite(ledPins[trail3], 0);
      
    trail3 = trail2; 
    trail2 = trail1;  
    trail1 = currentLed; 

  if (Potvalue < 512)
  {
     // richting wordt linksom
     richting = 1;   
    } else {
       
      richting = -1; 
  }

  
  if (richting = 1) {
    if (currentLed == sizeof(ledPins)) 
      {
        currentLed = 0;
      }
    }

   if (richting == -1) {
     if (currentLed == 0) {
        currentLed = sizeof(ledPins) -1 ; 
     }
   } 
  

  currentLed += richting; 
}

Wat voor werk doe je eigenlijk dat je werkt tot 1 uur nachts ?

Voor mijn werk mag ik vaak elektronische storingen oplossen, en dat ook in het buitenland.
Verder vertel ik daar niet teveel over.

Ik denk dat je nog niet helemaal goed begrijpt hoe loop() werkt of gezien moet worden.
Ik denk dat jij loop() als een lijst met opdrachten ziet, en daar ben ik het dus niet helemaal mee eens.
Voor mij is loop() een grote cirkel (past ook perfect bij de naam).
Wanneer je de regels code in loop() niet als een lijst onder elkaar zet, maar in een cirkel van links naar rechts, dan heb je geen begin en ook geen eind (en zolang je met globale variabelen werkt klopt dit ook).
Maar je hebt wel regels die voor of na elkaar komen.
Kun je je een beetje voorstellen wat ik hiermee bedoel ?

In jouw laatste code hierboven, staat in de lijst inderdaad dat je eerst de LEDs aanzet.
Maar dat is niet helemaal wat ik vertelde.
Ik vertelde dat we eerst de waarde in currentLed ophogen, dan de LEDs aanzetten, en daarna pas gaan we kijken of we met dat eerdere ophogen, op 1 van de 2 waardes zijn uitgekomen die zou gaan leiden tot een overflow.
Wanneer dat zo zou zijn, kunnen we de waarde in currentLed nu kunstmatig aanpassen zodat bij de volgende keer ophogen, we weer op een kloppende waarde uitkomen.
Dat betekent ook dat we met die kunstmatige aanpassing, eigenlijk buiten het nuttige bereik van currentLed zullen uitkomen.

Het is dus belangrijk dat je deze 3 stappen, ook in deze volgorde uitvoert.
Het is niet belangrijk wie van die stappen het eerst in je lijst staat, maar voor het overzicht wellicht wel.
De vergelijking met de cirkel maakt het daarom gemakkelijker dat ook zo te zien.
Tussen deze 3 stappen door zou je eventueel nog van alles en nog wat kunnen doen, zolang daarbij de waarde in currentLed maar niet beĆÆnvloed zal worden.
Als je dit kunt meenemen voor toekomstige aanpassingen (en ook voor heel andere sketches), kun je dit ook gebruiken om loop() heel overzichtelijk te maken, en zelfs om daarmee te bedenken hoe je loop() nog kunt opbreken in aparte functies.
Maar ik denk niet dat we veel functies zullen gaan maken voor dit projectje, tenzij jij daar graag mee wil eindigen.

Ik heb je laatste Wokwi code er even bij gepakt, en daar wat mee zitten spelen.
Daar ben ik flink mee opgeschoten, heb dat werkend gemaakt en mijn ideeƫn voor de toekomst er van ook in uitgewerkt.
Dat zijn 2 aanvullende zaken die je in de toekomst nog zou kunnen doen hiermee.
Ik heb die aanpassingen ook even naar de IDE gekopieerd en opgeslagen, en wat aantekeningen op mijn blaadje papier gemaakt.
Nu is het weer lang voorbij mijn bedtijd, maar heb wel leuk gespeeld en ook weer mijn kunsten een beetje geoefend.
Er zijn een aantal verbeteringen voor de huidige functionaliteit die ik nu heb uitgewerkt, en zaken ook efficiƫnter gemaakt.

Ik hoor graag van je waar jij nu het meest tegenaan loopt en wat we dan samen nog even kunnen aanpakken.
Graag 1 ding tegelijk zodat jij je ook daarop kunt concentreren.

Waar ik vooral tegenaan loop met dit project is overzicht.
Wat gebeurt wanneer en wat zijn de waarden op een bepaald moment.
Dit probleem heb ik meer met "complexe" projecten en dit maakt me ook aan het twijfelen of dit iets voor mij is.

Kan het niet hebben dat het nog steeds niet werkt. Heb voor dat probleem ook proffesionele hulp ingeschakeld. Ben zo streng op mezelf dat ik het lat heel hoog leg met de gedachte dat ik het moet kunnen.

Terugkomend op dit project.
Ik heb de code verandert in volgorde zoals jij het gezegd heb en rechtsom gebeurt er helemaal niks. Geen enkele led brandt. Linksom lijkt nu goed te werken.

Code :

// Alle pinnen van de leds 
const uint8_t ledPins[] = { 9, 11, 10, 6, 3, 5 };

// de pin van de potmeter
byte Potpin = A3;
// de waarde die de potmeter aangeeft
int Potvalue;

// geeft de richting aan waar de led moeten draaien.
byte richting;

// houdt de index bij van de huidige brandende led 
byte currentLed = 0;
// houdt de index bij van de eerste led van de staart
byte trail1 = 0 ;
// houdt de index bij van de tweede led van de staart 
byte trail2 = 0 ; 
// houdt de index bij van de derde led van de staart 
byte trail3 = 0;


void setup()
{
  // Zet de seriele monitor aan
  Serial.begin(115200);
  
  for (uint8_t cnt = 0; cnt < sizeof(ledPins); cnt++)
  {
    // Zet alle leds uit
    analogWrite(ledPins[cnt], 0);
    // Zet de pin mode op output
    pinMode(ledPins[cnt], OUTPUT);
  }
}


void loop()
{

  // Lees de waarde van de potmeter
  Potvalue = analogRead(Potpin);

  if (Potvalue < 512)
  {
     // richting wordt linksom
     richting = 1;   
    } else {
       
      richting = -1; 
  }

  currentLed += richting; 

  ////////////////////////
  // aansturen LEDs
  ////////////////////////
   
    
  // Zet de led die de index currentLed heeft aan.
  analogWrite(ledPins[currentLed], 255);
  analogWrite(ledPins[trail1], 117); 
  analogWrite(ledPins[trail2], 54);
  analogWrite(ledPins[trail3], 25); 

  delay(200); 

  analogWrite(ledPins[trail1],0);
  analogWrite(ledPins[trail2],0);
  analogWrite(ledPins[trail3], 0);
      
  

  if (richting = 1) {
    if (currentLed == sizeof(ledPins)) 
      {
        currentLed = 0;
      }
    }

   if (richting == -1) {
     if (currentLed == 0) {
        currentLed = sizeof(ledPins) -1 ; 
     }
   }

  trail3 = trail2; 
  trail2 = trail1;  
  trail1 = currentLed;  
  
}

Waar ik me nu vooral op concentreer is het weer werkend krijgen van het project.

OK, dan gaan we daar het eerst aan werken.
Dat je het de ene kant op wel werkend hebt en de andere kant op niet, is te verklaren.
Dit wordt veroorzaakt door dat we variabelen een negatieve waarde geven.
Maar bijna alle variabelen zijn gedeclareerd als een byte, want dat neemt minder Arduino geheugen in beslag en zou daarmee dan zuiniger zijn.
Een byte (een samentrekking van de woorden bit en eight), kan alleen maar positieve waardes hebben.
Daarom moet je alle variabelen die negatief kunnen worden, ook een type toewijzen die dat toestaat.
Voor de duidelijkheid: het zijn 2 variabelen.

Wanneer we dit kunnen oplossen, nemen we de volgende stap.
Uiteindelijk gaan we wel alles opruimen en overzichtelijker maken, maar voor nu doen we dus even alles stap voor stap, OK ?

Heel graag.

Ik denk dat de twee variabelen zijn richting omdat die -1 kan zijn en currentLed omdat die als de waarde nul is en ik er een aftrek ook -1 kan zijn nu.

Oplossing misschien om beide een unsigned byte of unsigned int te maken ?

Voor zover ik het weet kunnen die positief en negatief zijn.

Heb de twee variabelen verandert in :

// geeft de richting aan waar de led moeten draaien.
uint8_t richting;

// houdt de index bij van de huidige brandende led 
uint8_t currentLed = 0;

Maar nog steeds geen leds branden

Ik zou ze gewoon als int declareren en met currentLed niet met nul beginnen maar in het midden.
Dan kun je zien of er wel of niet iets gebeurt vanaf het begin., omdat je niet meteen in een overflow terecht komt.

Als ik currentLed op 5 zet, gaat er ook geen lampje branden.

Heel vreemd en heb even geen ideeƫn meer waar dit aan kan liggen.

Code :

// Alle pinnen van de leds 
const uint8_t ledPins[] = { 9, 11, 10, 6, 3, 5 };

// de pin van de potmeter
byte Potpin = A3;
// de waarde die de potmeter aangeeft
int Potvalue;

// geeft de richting aan waar de led moeten draaien.
int richting;

// houdt de index bij van de huidige brandende led 
int currentLed = 5;
// houdt de index bij van de eerste led van de staart
byte trail1 = 0 ;
// houdt de index bij van de tweede led van de staart 
byte trail2 = 0 ; 
// houdt de index bij van de derde led van de staart 
byte trail3 = 0;


void setup()
{
  // Zet de seriele monitor aan
  Serial.begin(115200);
  
  for (uint8_t cnt = 0; cnt < sizeof(ledPins); cnt++)
  {
    // Zet alle leds uit
    analogWrite(ledPins[cnt], 0);
    // Zet de pin mode op output
    pinMode(ledPins[cnt], OUTPUT);
  }
}


void loop()
{

  // Lees de waarde van de potmeter
  Potvalue = analogRead(Potpin);

  if (Potvalue < 512)
  {
     // richting wordt linksom
     richting = 1;   
    } else {
       
      richting = -1; 
  }

  currentLed += richting; 

  ////////////////////////
  // aansturen LEDs
  ////////////////////////
   
    
  // Zet de led die de index currentLed heeft aan.
  analogWrite(ledPins[currentLed], 255);
  analogWrite(ledPins[trail1], 117); 
  analogWrite(ledPins[trail2], 54);
  analogWrite(ledPins[trail3], 25); 

  delay(200); 

  analogWrite(ledPins[trail1],0);
  analogWrite(ledPins[trail2],0);
  analogWrite(ledPins[trail3], 0);
      
  

  if (richting = 1) {
    if (currentLed == 255) 
      {
        currentLed = 0;
      }
    }

   if (richting == -1) {
     if (currentLed == 0) {
        currentLed = sizeof(ledPins) -1 ; 
     }
   }

  trail3 = trail2; 
  trail2 = trail1;  
  trail1 = currentLed;  
  
}

Snap even iets niet helemaal

Ik lees de waarde van de potmeter
en verander de richting variable

if (Potvalue < 512)
  {
     // richting wordt linksom
     richting = 1;   
    } else {
       
      richting = -1; 
  }

Waarom blijft dan de richting 1 als ik het aan het eind zo afdruk

Serial.println(richting); 

Ik zie nu in je huidige Wokwi code heel raar gedrag.

Dit is de fout waar jij nu op stuit:
In regel 73 doe je een if, maar daarbij wijs je die 1 toe.
Je moet de = veranderen in ==

Er staat ook een foutje in je overflow check op regel 74, want daar controleer je op 255; een waarde die we nooit willen bereiken.
Dat verklaart het vreemde gedrag dat ik zag.

Laten we nadat je de zaken hierboven opgelost hebt, even pas op de plaats maken en wat andere zaken die ik gezien heb aanpassen.
Eerder vertelde je dat problemen had om LEDs uit te zetten.
Daarop heb ik vrij snel (na het lezen van je opmerking) gereageerd dat je ook alle LEDs eerst kunt uitzetten voor je weer wat aanzet.
Dat heb je gemaakt en werkt ook wel enigszins, maar het is toch niet de beste oplossing.
Eigenlijk kwam dit doordat we bij de staart de laatste stap niet zetten.
Want de laatste stap is niet dat we de helderheid op 25 zetten, maar op 0.
Dus gaan we dat maar eens aanpassen.
Dat doen we door trail4 toe te voegen, en daar altijd een 0 heen te sturen.
Daarmee kunnen we dan het uitzetten van de LEDs na de delay verwijderen.

Toch weer 2 stappen in dit antwoord, doe ze een voor een.
Als je dat niet ziet zitten dan alleen de eerste stap.
Ik ben nu weer even weg, en zal denk ik vanavond weer even kijken hoe het er dan uitziet.

zie weer wat raars

De eerste keer draait alles goed
Maar als je bijvoorbeeld eerst de potmeter lager zet dan 512 . dan hoger en dan weer lager dan lijkt in de wokwiki net alsof de code even helemaal niet reageert.

Ik zag ook al dat er rare dingen gebeuren met die potmeter.
Denk dat dat aan Wokwi ligt.

bummer

Misschien toch een alternatief zoeken totdat ik weer bij mijn werk kom.
Dan kan ik dit nabouwen.

Als je weet dat dit gebeurt, kun je er wel rekening mee houden hoor.

Ok, nu heb je de 2 problemen van vanmiddag opgelost.
Kun je nu het tweede in post #71 bekijken ?


Dit dus:
Eerder vertelde je dat problemen had om LEDs uit te zetten.
Daarop heb ik vrij snel (na het lezen van je opmerking) gereageerd dat je ook alle LEDs eerst kunt uitzetten voor je weer wat aanzet.
Dat heb je gemaakt en werkt ook wel enigszins, maar het is toch niet de beste oplossing.
Eigenlijk kwam dit doordat we bij de staart de laatste stap niet zetten.
Want de laatste stap is niet dat we de helderheid op 25 zetten, maar op 0.
Dus gaan we dat maar eens aanpassen.
Dat doen we door trail4 toe te voegen, en daar altijd een 0 heen te sturen.
Daarmee kunnen we dan het uitzetten van de LEDs na de delay verwijderen.

dat wilde ik doen als dit goed werkt
Ga er nu even aan werken.

Is ook veranderd.
Hopelijk heb ik het gedaan zoals jij het bedoeld hebt.

OK, zie je dat dit slimmer en eigenlijk de juiste aanpak is voor het doven van de LEDs ?

Het kan nog weer wat beter en soepeler verlopen.
Daarvoor draai je dan ook de volgorde van het aanzetten van de LEDs om, net als je een tijdje terug al deed met de volgorde van het kopiƫren van de trails.
Dus dan begin je met trail4 en eindig je met currentLed.
Waarschijnlijk ga je het effect hiervan nog niet zien, maar ik beloof je dat dat wel zal komen.

Gedaan en ik zie wel wat verschil maar niet heel erg groot.

Goed bezig.

Niet gemeen bedoeld, maar ik ga nu even je autisme aanspreken.
Het valt mij op, dat we linksom draaien als we de potmeter rechtsom hebben staan, en rechtsom draaien als we de potmeter linksom hebben staan.
Zou dat nog intuĆÆtiever kunnen ?