Leds op PWM uitgang laten faden

Hoi mede Arduino,ers

Even kort voorstellen ik ben Daan normaliter meer bezig meer bezig met reparatie en bouwen van elektronika (hardwired) maar sinds kort ook de smaak te pakken gekregen nadat ik op eigen houtje met wat gerommel het Nightrider effect voor elkaar heb kunnen krijgen.

Maar nu loop ik vast op de Curly braces { in mijn sketch ik probeer in ipv van een led meerdere leds om de beurt te laten faden.

Om te beginnen met uitgang pin 10 en pin 11

Maar krijg steeds de melding dat de invoer niet correct is.

Ik heb uiteraard eerst gegoogled op de foutcode's die ik kreeg maar dat gaf mij niet de juiste richting tot in tegenstelling van mijn eerdere project.

Wie zou me hier wat wijzer kunnen maken?

Welkom

Plaats a.u.b. geen plaatjes van je programma of van foutmelding; het is een nachtmerrie om dat over te typen / kopiëren. Zie Hoe haal je het meeste uit het forum.

De eerste opvallende fout lijkt int led = 10.11; te zijn.

Hoi SterretjeToo

Dank voor je antwoord.

Inderdaad scherp opgemerkt. (van de interne led)

Waarin moet ik dit dan veranderen? want als ik deze 3 regels verwijder dan werkt het helemaal niet meer.

Maar als ik deze file aanpas met alleen pinMode naar pin 10 en analogWrite naar pin 10 en ik laat dan int led op 9 staan dan werkt het wel dan licht pin 10 op.

grt Daan

Je hebt twee LEDs op pinnen 10 en 11; dan zou het bv het volgende kunnen worden:

int led1 = 10;
int led2 = 11;

Dan moet je ook twee pinMode() gebruiken, één voor iedere LED. En twee analogWrite(), één voor iedere LED.

Hoi sterretje

Als eerste bedankt voor je antwoord .

Oke dus:

int led1 = 10;
int led2 = 11;

En ga zo maar door naar de aantal pwm pinnen die de arduino heeft.?

Ik had wel al 2x de pinMode en analogWrite gebruikt maar wat is beter of werkt beter?

Zo:
void setup () {
pinMode(10 OUTPUT) ;

Void setup() {
pinMode(11 OUTPUT);

}

void loop() {
analogwrite(10, brightness);

void loop() {
analogWrite(11, brightness);

En dan de rest van de onderstaande tekst?

Of

void setup() {
pinMode( 10, OUTPUT);

}

void loop() {
analogWrite( 10, brightness);

En dan de rest van de onderstaande tekst met daarachter het complete stukje van de aansturing voor de volgende led? (led 11 )

Rest me nog een vraag ik zit ook op Circuits Online daar wordt het gewaardeerd dat je ook oplossingen achterlaat zodat anderen er ook wat aan hebben is hier ook een sectie of een draadje dat als het werkt dat ik het hier kan posten zodat ik iemand anders er mee kan helpen?

Grt daan

Je kunt maar 1 setup en 1 loop hebben...
Je moet de code dus samenvoegen...

Lees a.u.b. Hoe haal je het meeste uit het forum nog eens en specifiek "Plaats je volledige programma tussen zogenaamde code tags".

Kijk eerst eens naar onderstaand voorbeeld; het is geen "faden" maar geeft het idee weer hoe twee LEDs kunt aansturen met een Arduino.

int led1 = 10;
int led2 = 11;

void setup()
{
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
}

void loop()
{
  digitalWrite(led1, HIGH);
  delay(500);
  digitalWrite(led1, LOW);
  digitalWrite(led2, HIGH);
  delay(500);
  digitalWrite(led2, LOW);
  delay(500);
}

Dit is niet optimaal. Je geeft zelf aan "En ga zo maar door naar de aantal pwm pinnen die de arduino heeft.?" en als je meer PWM pinnen wilt gebruiken wordt het een zooitje.

Dan kun je beter arrays gaan gebruiken. Hieronder een voorbeeld


// array met led pinnen
int ledPins[] = { 10, 11 };

void setup()
{
  // zet all led pinnen als uitgang
  for (uint8_t cnt = 0; cnt < 2; cnt++)
  {
    pinMode(ledPins[cnt], OUTPUT);
  }
}

void loop()
{
  digitalWrite(ledPins[0], HIGH);
  delay(500);
  digitalWrite(ledPins[0], LOW);
  digitalWrite(ledPins[1], HIGH);
  delay(500);
  digitalWrite(ledPins[1], LOW);
  delay(500);
}

Wees je er van bewust dat het eerste element van een array de index 0 heeft.

loop() zal nog steeds wat gecompliceerd zijn op deze manier maar de juiste benadering hangt ervan af wat je uiteindelijk wilt bereiken.

Als je het aanpast naar 3 LEDs wordt de eerste regel b.v. int ledPins[] = { 10, 11, 12 }; en moet je de for-loop aanpassen naar for (uint8_t cnt = 0; cnt < 3; cnt++).

Er is altijd een kans dat je één van de twee vergeet en je programma niet doet wat je verwacht. Dat kun je oplossen door een macro te gebruiken die berekent hoeveel elementen er in een array zitten. Zet het onderstaande aan het begin van je programma.

// macro die het aantal elementen van enig array (byte, int, float, struct etc) berekent
#define NUMELEMENTS(x) (sizeof(x) / sizeof(x[0]))

en de for-loop wordt dan

 // zet all led pinnen als uitgang
  for (uint8_t cnt = 0; cnt < NUMELEMENTS(ledPins); cnt++)

Op deze manier is het gemakkelijk aan te passen (pin meer, pin minder) en is er geen risico op fouten.

1 Like

Build 1971 en Sterretje bedankt voor jullie antwoorden

Ik ga er aankomende weekend eens mee stoeien kijken of ik het voor elkaar krijg.

grt daan

int ledPin1 = 3;    // LED connected to digital pin 9
int ledPin2 = 5;
int ledPin3 = 6;
int ledPin4 = 9;
int ledPin5 = 10;
int ledPin6 = 11;

void setup()  { 
  // nothing happens in setup 
} 

void loop()  { 
  // fade in from min to max in increments of 5 points:
  for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) { 
    // sets the value (range from 0 to 255):
    analogWrite(ledPin1, fadeValue);   
    // wait for 30 milliseconds to see the dimming effect    
    delay(50);                            
  } 

  // fade out from max to min in increments of 5 points:
  for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) { 
    // sets the value (range from 0 to 255):
    analogWrite(ledPin1, fadeValue);    
    // wait for 30 milliseconds to see the dimming effect    
    delay(50);                            
  } 

for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) { 
    // sets the value (range from 0 to 255):
    analogWrite(ledPin2, fadeValue);   
    // wait for 30 milliseconds to see the dimming effect    
    delay(50);                            
  } 

  // fade out from max to min in increments of 5 points:
  for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) { 
    // sets the value (range from 0 to 255):
    analogWrite(ledPin2, fadeValue);    
    // wait for 30 milliseconds to see the dimming effect    
    delay(50);                            
  } 

for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) { 
    // sets the value (range from 0 to 255):
    analogWrite(ledPin3, fadeValue);   
    // wait for 30 milliseconds to see the dimming effect    
    delay(50);                            
  } 

  // fade out from max to min in increments of 5 points:
  for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) { 
    // sets the value (range from 0 to 255):
    analogWrite(ledPin3, fadeValue);    
    // wait for 30 milliseconds to see the dimming effect    
    delay(50);                            
  } 

for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) { 
    // sets the value (range from 0 to 255):
    analogWrite(ledPin4, fadeValue);   
    // wait for 30 milliseconds to see the dimming effect    
    delay(50);                            
  } 

  // fade out from max to min in increments of 5 points:
  for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) { 
    // sets the value (range from 0 to 255):
    analogWrite(ledPin4, fadeValue);    
    // wait for 30 milliseconds to see the dimming effect    
    delay(50);                            
  }

  for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) {
    //sets the value ( range from 0 to 255):
    analogWrite(ledPin5, fadeValue) ;
    // wait for 30 milliseconds to see the dimming effect
    delay(50);
  }

  //fade out from max to min in increments of 5 points:
  for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) {
    //sets the value (range from 0 to 255):
    analogWrite(ledPin5, fadeValue);
    // wait for 30 milliseconds to see the dimming effect
    delay(50) ;
  }

  for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) {
    //sets the value ( range from 0 to 255):
    analogWrite(ledPin6, fadeValue) ;
    // wait for 30 milliseconds to see dimming effect
    delay(50) ;
  }

  //fade out from max to min in increments of 5 points:
  for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) {
    //sets the value ( range from 0 to 255):
    analogWrite (ledPin6, fadeValue);
    // wait for 30 milliseconds to see the dimming effect
    delay(50) ;
 }
}

Ik heb het voor elkaar gekregen door op via google voorbeelden te bekijken hoe ik de sketch kon uitbreiden of samen kon voegen.

En met ook jullie hulp werkt het nu.

Door nu op de uitgangen mosfetts ( transistors) aan te sluiten kun je er meerdere heldere leds of nog mooier gloeilampjes mee aansturen.

Dit kun je doen door een transistor in de low side aan te sturen.

Zo kun je een kerstboompje laten twinkelen of een sterrenhemel maken voor de kinderkamer.

Ik hoop dat anderen er wat aan hebben.

Nogmaals bedankt .

grt Daan


1 Like

Dus het is nu opgelost?

Je hebt wel een erg vreemde delay. Een delay(50) die 30ms duurt :smiley: Oftewel: een commentaar dat niet overeenkomt met wat het programma doet kun je net zo goed achterwege laten :wink:

Nog meer gezeur over commentaren:
Ledpin1 = 3; wordt er van beschuldigd dat ie op pin 9 terechtkomt, en daar geloof ik helemaal niets van.

Verder nog iets over de delays:
Elke LED loopt nu van maximaal naar minimaal, en dan weer andersom, daarna is de volgende LED aan de beurt.
Iedere LED heeft daar dus 102 stapjes van 50 milliseconden voor nodig, ruim 5 seconden.
Dat is prima voor een voorbeeld, maar hiermee is de code niet erg efficient.
Verder zul je het dimmen, wanneer je er heel goed op let, niet mooi zien verlopen.
Want voor het oog zal er niet veel gebeuren tussen het ene stapje en de volgende.
Dat komt omdat onze licht sensoren (ogen) een meer logarithmische gevoeligheid hebben.
Het opbouwen kun je daarom beter doen door de waarde telkens te verdubbelen, en hoe je het afbouwen dan kunt doen kun je wel raden.
Daarmee kom je wel op minder stapjes uit.
Wanneer je werkelijk een sterrenhemel wil maken, kom je er met deze code niet, omdat je dan niet een voor een je lampjes wil aansturen.

Het klopt dat er nog kleinere verbeteringen aan kunnen worden gedaan.

Het is in mijn geval de basis (toekomst) om mee verder te gaan.

Door de tijd iets te versnellen experimenteel en de lampjes te mengen krijg je al een idee van een sterrenhemel.

In de toekomst wil ik een overlap erin maken.

Uiteraard zijn er verbeteringen maar nu heb ik andere prioriteiten ( cursussen v.d zaak)

En inderdaad de tekst achter de ledpin1 had ik ff weg moeten halen dit is alleen uitleg.

In ieder geval bedankt voor de feedback.

Grt daan

Dan zien we je in de toekomst wel terug :slight_smile: Want delay() zal dat niet erg gemakkelijk maken :wink:

Succes met de werk cursussen.

A post was split to a new topic: Modelspoor schemerlicht

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.