Ledstrip ws2812b aansturen

Hallo allemaal,

Ik ben aan het proberen om het arduino programmeren onder de knie te krijgen, ik heb al een led matrix schermpje gemaakt met wat tutorials. Verder heb ik de eenvoudige tutorials doorgewerkt, nu ben ik met een projectje voor mijn zelf bezig maar dit wil nog niet zo goed lukken.

Allereerst is de led strip een RGB digitale led strip met ws2812b microcontrollers. Ik gebruik een arduino Uno en de eerder genoemde led strip. In eerst instantie gebruik ik niet meer dan 6 leds van de strip dus gebruik ik als voeding de usb poort van mijn PC. Ik maak gebruik van de FastLed bibliotheek

Ik ben begonnen met een stukje code waarmee elke individuele led aangestuurd kan worden, dit is prima gelukt. Ik kan nu handmatig elke led van de strip in elke gewenste kleur aansturen. Wat echter mijn bedoeling is met dit project is het maken van een knipperlichtje voor op de zijkant van mijn auto. Ik wil dan graag dat als ik mijn verlichting inschakel dat de led strip gaat branden. Mijn idee is om de led strip met het knipperlicht oranje mee te laten knipperen met eventueel een patroontje.

Ik dacht op mijn verlichting een relaitje aan te sluiten en ook op mijn knipperlicht. Zodat er voor beide functies een maak/breek contact is. (Voor de testopstelling gebruik ik twee drukknopjes waarbij bij het indrukken van de ene drukknop de ledjes moeten gaan branden, en bij het indrukken van de andere knop moeten ze ook gaan branden maar dan oranje en eventueel een patroontje)

Mijn vraag is hoe ik de led strip aan kan laten gaan d.m.v een druk knop Ik heb het volgende stukje code geschreven maar dit werkt niet, bij deze code blijven de lampjes constant branden. ( ik heb geprobeerd om het in en uitschakelen van een ledje te combineren met de code van de ledstrip)

#include <FastLED.h>

#define LED_PIN 7
#define NUM_LEDS 6

int ButtonValue = 0;

int Button = 3;

CRGB leds[NUM_LEDS];

void setup() {

FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
pinMode(Button, INPUT);
}

void loop() {

ButtonValue = digitalRead(Button);

if(ButtonValue !=0){
leds[0] = CRGB(0, 64, 0);
FastLED.show();
leds[5] = CRGB(0, 64, 0);
FastLED.show();
}

}

Is er iemand die mij een stukje op weg kan helpen?

Alvast bedankt

Groetjes Jorrit

svp code tags gebruiken (meest linker knopje boven de editor “</>”.
blink_without_delay zou ik bestuderen en zorgen dat je die helemaal door hebt anders wordt het dweilen met de kraan open.
Verder zou ik jouw probleem uit elkaar trekken:
a) functie om de knop te lezen en een timer (zie blink without delay) starten
b) Daar het moet knipperen een tweede timer (wederom blink without delay)
Omdat je nog vrij on ervaren bent, zie eerst maar eens het knipperen tot stand te brengen voordat je ook nog eens een patroon gaat inbouwen.

Beste Nico,

Bedankt voor je reactie, ik ga blink_without_delay bestuderen. Ik zal laten weten hoe ver ik ermee kan komen.
Groeten Jorrit

Hoi JorritSmit, welkom !

Gefeliciteerd, jouw eerste post is behoorlijk uitgebreid en je probeert goed en uitgebreid te omschrijven wat er aan de hand is.
Dat zien we niet erg vaak bij een eerste post op het forum.
Als je even de tijd neemt om het voorstel onderwerp (klik !) hier in het Nederlandstalige forum te lezen, dan kom je ook mijn eerste speeluurtjes met de Arduino tegen.
Daar beschrijf ik heel ruw wat ik allemaal gespeeld heb met een (en later wat meer) LEDs (natuurlijk daar ook de bijbehorende weerstanden) en een potmetertje.
Met die paar onderdelen kun je al heel leuk spelen en tegelijk leren.

Nico gaf al dezelfde tip, maar kijk eens naar mijn handtekening hier onder.
Die staat daar omdat het eigenlijk altijd een goede tip blijkt te zijn.

Hallo Mas3,

Hartelijk bedankt, ik ga er naar kijken.

Groetjes Jorrit

Hallo allemaal,

Ik heb de tutorial blink without delay bekeken en ik begrijp wat er in deze tutorial gedaan wordt. Wat ik ook gelezen heb is dat het commando delay alle andere bezigheden in de arduino onderbreekt. Ik begrijp dat dit in veel situaties onpraktisch is, wat ik echter nog niet helemaal zie is hoe dit in mijn probleem een belemmering vormt?

Ik heb ook de projectjes bekeken in het voorstel topic en deze projectjes zijn redelijk vergelijkbaar met de door mij reeds uitgevoerde projectjes.

Verdergaand op het probleem met het knipperlicht lampje denk ik dat ik daar mijn vraag nog iets verder kan specificeren. Waar ik eigenlijk daadwerkelijk niet uit kom is het aansturen van het uitgangssignaal, ik weet namelijk aan de hand van de tutorial 'button' hoe ik een bepaalde pin hoog kan maken door een bepaald ingangssignaal. Het probleem bij de ledstrip is echter dat deze niet luistert naar hoog of laag maar een stukje data moet ontvangen van de arduino.
Ik begrijp niet hoe ik aan de hand van het inputsignaal dit binnen de arduino kan omzetten naar een stukje data dat op een van de uitgangen weggestuurd kan worden.

In eerst in stantie dacht ik namelijk dat ik een if functie kon gebruiken en onder deze if functie het programmatje kon zetten dat ik eerder gebruikte om de ledstrip aan te sturen. Dit blijkt niet helemaal zo te werken maar ik kan nog niet zo goed achterhalen hoe het wel werkt?

Als iemand ideeën heeft hoor ik het graag

Groeten Jorrit

Die led stripmoet je gewoon zien als een array van leds. Elke keer als je show() doet wordt de hele array dus strip bijgewerkt.

Hoi Jorrit.

Binnen 12 uur de blink without delay () sketch zien en helemaal begrijpen is een hele prestatie.
Ik betwijfel daarom wel of je alles wat daar in zit wel meegekregen hebt, maar je krijgt het voordeel van de twijfel.

Delay() is in bijna alle gevallen een probleem.
Maar delay() is in dit geval niet direct je probleem (of de oplossing).

Waar je hier meer naar moet kijken, is registreren dat er iets gebeurd is en dat onthouden.
Verder moet je dan ook nog zien of datgene dat gebeurde, al afgelopen is, of nog steeds aan de hand is.
En dat is een les die je ook uit die blink without delay() sketch kunt halen maar die men er zelden direct in terug vindt.

Verder vraag ik me af of je hebt getest hoe het signaal in je voertuig gemaakt word.
Want ik vermoed dat dat anders is als waar je nu je sketch mee aan het bouwen bent.
En dat zou wel jammer zijn; heb je iets gemaakt, kun je het nog niet gebruiken.

Ook zie ik in de code die je tot nog toe getoond hebt, alleen maar dat LED nul en LED vijf ingeschakeld worden onder bepaalde omstandigheden.
Ik zie niet dat ze ook uitgeschakeld worden.
Dus dan klopt het dat de LEDs blijven branden.

Als de LEDs ook weer uit moeten, moet je daar wel voor zorgen.
Enneh, tadaaaa: blink without delay () !

Er zijn meerdere voorwaarden waaraan voldaan moet worden om de LEDs aan te zetten, en ook meerdere om ze uit te zetten.
Moet je allemaal in de gaten houden.

Je moet dus maar eens goed gaan bedenken wat er eigenlijk precies moet gebeuren, want als jij het niet regelt in je code, dan gebeurt het dus ook niet.
Je zult zien dat dingen uit veel meer stapjes bestaan dan je eigenlijk zou verwachten.

Leuk he, dat programmeren :wink:

Beste Nico en Mas3,

Allereerst hartelijk dank voor jullie reacties, tof dat jullie er tijd en energie in willen stoppen me te helpen.

Wat betreft het zien van de strip als een array ik ga even kijken of ik precies kan achterhalen hoe ik dit commando moet gebruiken. Zo ver als ik het nu begrijp definieer ik een keer deze array en vervolgens roep ik deze op met het Show() commando.

Wat betreft de signalen uit de auto had ik eigenlijk een heel simpel idee, ik wil 3 relais in de auto plaatsen waarvan er een parallel aan de verlichting komt te staan, een parallel aan het rechter knipperlicht en een parallel aan het linker knipperlicht. Dit betekent dat bij het inschakelen van de verlichting het relais wordt ingeschakeld en zo de 'drukknop' wordt ingedrukt. Door dit zelfde te doen bij beide knipperlichten zal er in het arduino geen knipperende functie ingebouwd hoeven te worden en zo loopt het knipperlicht ook altijd synchroon met de andere knipperlichten. (als het knipperlicht brand wordt het relais gemaakt en als hij uit is is hij niet gemaakt)

In de code die ik reeds getoond had klopt het inderdaad dat ik alleen led nul en vijf ingeschakeld had, mijn doel was om een programmatje te schrijven dat als ik een drukknop indrukte dat led nul en vijf zouden oplichten. (dit was puur om te kijken of ik zo een geschakelde functie met de ledstrip kon bouwen. Het klopt ook dat de leds niet uitgezet worden, als ik stroom op de arduino zetten gingen ze gelijk al branden zonder dat ik de drukknop een maal bekrachtigd had.

Uit de tutorial blink without delay had ik inderdaad nog niet direct gehaald dat simpele wiskundige formule in feite gebruikt kan worden om te kijken of iets al is afgelopen of nog bezig is. :o

Alvast bedankt en ik ga kijken hoe ver ik kan komen :slight_smile:

Groetjes Jorrit

Klopt de strip is gewoon een array (of tabel hoe je het noemen wilt) van het type CRGB. Die kan je elk individueel vullen met een kleuren combi. Bij het aanroepen van de show() wordt die hele tabel in de strip gepompt.

Hallo allemaal,

Na de nodige uurtjes prutsen ben ik best een stuk gekomen :slight_smile: :slight_smile: . Ik kan de ledstrip bedienen met het indrukken van de drukknop, bij het bedienen van de ene drukknop schakelt de verlichting in en bij het inschakelen van de andere drukknop start het knipperlicht patroon. Ik heb dit voor elkaar gekregen met jullie hulp en een ander stukje code dat ik gevonden heb waarvan ik wat onderdelen gebruikt heb.

Tot zo ver heb ik in ieder geval een werkend begin principe. Omdat de auto natuurlijk links en rechts knipperlichten heeft moet ik voor de ledstrip aan de andere kant nog een stukje code zien te maken. Ik wilde hiervoor een andere uitgang gebruiken om de ledstrips aan de andere kant aan te sturen, ik heb geprobeerd om een tweede uitgang te gebruiken maar dit krijg ik niet voor elkaar.

Dit is mijn code tot nu toe:

#include "FastLED.h"

#define NUM_LEDS_PER_STRIP 6                // zes ledjes per strips
CRGB leds[NUM_LEDS_PER_STRIP];              // type 

const int buttonPin = 2;                    // knop 1 is het Linker knipperlicht
const int buttonPin2 = 3;                   // knop 2 is de gewone verlichting
int buttonState = 0;                        // werking knoppen

void setup() { 
  
  pinMode(buttonPin, INPUT);                // knop 1 is een input
  pinMode(buttonPin2, INPUT);               // knop 2 is ook een input
 [b] FastLED.addLeds<WS2812B, 7>(leds, NUM_LEDS_PER_STRIP);[b][/b][/b]  //definiëren van het soort strip en de uitgang
  
  FastLED.clear();
  FastLED.show();

}

void KnipperlichtL() {                      // het patroon van het knipperlicht
  leds[0] = CRGB(200, 0, 0);
      FastLED.show();
  delay(200);
  leds[1] = CRGB(200, 0, 0);
      FastLED.show();
  delay(200);
  leds[2] = CRGB(200, 0, 0);
      FastLED.show();
  delay(200);
  leds[3] = CRGB(200, 0, 0);  
      FastLED.show();
  delay(200);  
  leds[4] = CRGB(200, 0, 0);   
      FastLED.show();
  delay(200);
  leds[5] = CRGB(200, 0, 0);
      FastLED.show();
  delay(200);
  leds[0] = CRGB(0, 0, 0);
  leds[1] = CRGB(0, 0, 0); 
  leds[2] = CRGB(0, 0, 0);
  leds[3] = CRGB(0, 0, 0); 
  leds[4] = CRGB(0, 0, 0);
  leds[5] = CRGB(0, 0, 0);
   
   
    FastLED.show();
  }

 void Verlichting(){                    // de gewone verlichting
FastLED.showColor(CRGB::White);
 }


void loop() {

  buttonState = digitalRead(buttonPin);    // leest het inputsignaal

  if (buttonState == HIGH) {
    
    KnipperlichtL();                       // laat het knipperpatroon starten
    FastLED.clear();
    
    
  } else {
    FastLED.showColor(CRGB::Black);       // iniden knop niet hoog ledstrip uit
  } 


    buttonState = digitalRead(buttonPin2);  // leest het inputsignaal
    if (buttonState == HIGH) {
    Verlichting();                        // start de gewone verlichting
    FastLED.clear();
    
    
  } else {
    FastLED.showColor(CRGB::Black);        // als gewone verlichting laag is led strip wordt zwart
  } 
}

(ik hoop dat al mijn comentaar klopt in de code :confused: )

Ik heb geprobeerd om deze regel: FastLED.addLeds<WS2812B, 7>(leds, NUM_LEDS_PER_STRIP); Nog eens te schrijven alleen dan voor een andere uitgang. Dit lukte mij niet omdat hij de waarde FastLED al kent en ik deze niet nogmaals kan definieren. Ook heb ik andere titels gebruikt maar ik krijg het niet voor elkaar.

Ik heb ook twee andere opties bedacht maar zo los ik het liever niet op (tenzij het niet anders kan)

optie 1
Voor beide kanten van de auto een eigen arduino zodat ze allebei een eigen ledstrip voor hun rekening kunnen nemen.

Optie 2
Ik zou de twee ledstrips in serie aan elkaar kunnen koppelen, ik kan dan een tweede Void knipperlicht schrijven die de andere kant aanstuurt (ik kan tenslotte elk ledje van de strip apart aansturen)

Kan iemand mij vertellen of ik ook gewoon een extra uitgang kan aanmaken voor de andere kant?

Nogmaals hartelijk dank voor de hulp!

Groetjes Jorrit Smit

Heb je de documentatie van fastled al bekeken?

3e optie:

2 LED strips (of 1 die is doorgeknipt, komt op het zelfde neer), die je in 1 keer aanstuurt.

Bedenk eens wat het verschil is tussen links en rechts aansturen.
Dus zie het als 1 LED strip van 10 LEDs (ik noem maar wat), en laat alleen de linkse 3 of de rechtse 3 knipperen.
Dat is niet erg moeilijk hoor, maar je moet er even over nadenken.
Daar hoef je geen 2 aparte functies (jij noemde dat void) voor te maken, dat zou het alleen maar onnodig ingewikkeld maken.

Hallo allemaal,
Nogmaals dank voor de reacties

@nicoverduin Als je met de documentatie het stukje uitleg die hier https://github.com/FastLED/FastLED onder staat bedoeld dan heb ik dat gelezen. Als er meer documentatie is hoor ik graag waar en dan ga ik dat zeker lezen.

@Mas3 Ik heb ook nagedacht over het gebruiken van een 'void knipper' voor beide situaties(links en rechts dus) ik kom hier eigenlijk nog niet helemaal uit om eerlijk te zijn. In mijn 'void knipper' defineer ik namelijk de specifieke ledjes die moeten gaan branden. Als ik dus bij het inschakelen van het knipperlicht deze functie oproep zullen toch altijd de ledjes gaan branden die ik vooraf heb aangegeven? Of zie ik nu iets over het hoofd waardoor ik in een functie toch twee kanten kan ingeven?

Nog even ter illustratie het is de bedoeling dat aan elke zeide van de auto 3 stukjes ledstrip komen van 8 ledjes lang. Dat was eigenlijk de hoofd reden dat het mij handig leek om voor links en rechts een aparte uitgang te gebruiken zodat ik een kabel minder hoef te leggen. Als het niet anders kan is het zeker geen probleem maar ik ben vooral nieuwsgierig of het mogelijk is.

Sorry voor al mijn vragen ik kom er nog niet zo goed uit

Groeten Jorrit Smit

Fastled.io is dacht ik de site zelf

Je hebt het over vooraf gedefinieerde (dat is dus een constante) LEDs in je array.
Wat als je die constantes nou eens als variabele zou gaan benaderen ?

Houd er wel rekening mee dat je uiteindelijk de strips in de juiste richting plaatst, anders krijg je gespiegelde effecten (afhankelijk van het effect natuurlijk).

Hallo allemaal,

Bedankt voor de ideeen ik ga kijken hoe ver ik er mee kan komen.

Het idee van de variabelen is inderdaad best een goede, ik moet dan wel vooraf elk lampje een aparte variabele geven maar ik hoef dan inderdaad niet twee keer een eigen void knipper te schrijven. Ik ga ook nog verder zoeken of ik niet toch een tweede ledstrip op een andere uitgang kan krijgen.

Groeten Jorrit Smit

Hoi Jorrit.

Ik raad je sterk aan om eens te duiken in wat een array eigenlijk is en wat je er mee kunt doen.
Want de consequentie die je aan mijn vorige tip verbindt, is er nauwelijks als je je dat eigen maakt.

Hallo allemaal,

Na de nodige uurtjes proberen en zoeken heb ik het geheel werkend gekregen, ik heb de testopstelling gebouwd en dit lijkt goed te werken. Ik heb het inmiddels ook draaiend met een Arduino Nano dus volgens mij ben ik goed op weg.

Ik heb nog een ding wat ik eigenlijk niet uit kan staan, als ik het knipperlicht naar links aanzet terwijl de gewone verlichting brand wil ik dat links de lampjes gaan knipperen en rechts wil ik dat de gewone verlichting blijft branden. Om dit voor elkaar te krijgen heb ik een functie gemaakt die de gewone verlichting aan een kant aanzet als de andere kant knippert. Om dit voor elkaar te krijgen moest ik elk ledje apart specificeren, dit kost heel veel regels maar ik kan bijna niet geloven dat dit niet anders kan. Het moet toch mogelijk zijn om een bepaald bereik aan te sturen, ik heb van alles geprobeerd en gezocht maar ik krijg het nog niet voor elkaar. Ik dacht bijvoorbeeld: leds[1][20] (ledje 1 tot 20) dit lijkt niet te werken zo heb ik verschillende dingen geprobeerd maar ik krijg het niet voor elkaar.

Hierbij ook de code zodat iemand in de toekomst het misschien kan gebruiken.

#include "FastLED.h"

#define NUM_LEDS_PER_STRIP 48                        // totaal ledjes per strips
CRGB leds[NUM_LEDS_PER_STRIP];                       // type 
#define Lampjes_per_licht 8                          // aantal lampjes per knipperlicht


const int buttonPin = 2;                    // knop 1 is het Linker knipperlicht
const int buttonPin2 = 13;                  // knop 2 is de gewone verlichting
const int buttonPin3 = 4;                   // knop 3 is het Rechter knipperlicht
int buttonState = 0;                        // werking knoppen



void setup() { 
  
  pinMode(buttonPin, INPUT);                // knop 1 is een input
  pinMode(buttonPin2, INPUT);               // knop 2 is ook een input
  pinMode(buttonPin3, INPUT);               // knop 3 is ook een input
  FastLED.addLeds<WS2812B, 7>(leds, NUM_LEDS_PER_STRIP);  //definiëren van het soort strip en de uitgang
  
  FastLED.clear();
  FastLED.show();

}


 void Verlichting(){                    // de gewone verlichting
FastLED.setBrightness(250) ;            // dimmen indien nodig
FastLED.showColor(CRGB::White);         // kleur gewone verlichting
 }


void KnipperlichtL() {                      // het patroon van het knipperlicht
    for(int i = 0; i < Lampjes_per_licht; i++) {
    // set our current dot to red
    leds[i] =   CRGB(40,255,0);
    leds[i+Lampjes_per_licht] = CRGB(40,255,0);
    leds[i+2*Lampjes_per_licht] = CRGB(40,255,0);
    FastLED.show();
    delay(70);
  }
    delay(1000);                            // vertraging aan het eind van de cyclus
  }

  
void KnipperlichtR() {                      // het patroon van het knipperlicht
    for(int i = 0; i < Lampjes_per_licht; i++) {
    // set our current dot to red
    leds[i+3*Lampjes_per_licht] =   CRGB(40,255,0);
    leds[i+4*Lampjes_per_licht] = CRGB(40,255,0);
    leds[i+5*Lampjes_per_licht] = CRGB(40,255,0);
    FastLED.show();
    delay(70);
  }
  delay(1000);                              // vertraging aan het eind van de cyclus
  }






void loop() {

 
 buttonState = digitalRead(buttonPin);    // leest het inputsignaal van het knipperlicht
   if (buttonState == HIGH) {

    
    buttonState = digitalRead(buttonPin2);  // leest het inputsignaal en kijkt of de verlichting aan staat, als de verlichting aan is zullen de volgende lampjes blijven branden als het knipperlicht aan staat
    if (buttonState == HIGH) {
    leds[24] = CRGB::White;                  // de lampjes die niet uit moeten gaan
    leds[25] = CRGB::White;
    leds[26] = CRGB::White;
    leds[27] = CRGB::White;
    leds[28] = CRGB::White;
    leds[29] = CRGB::White;
    leds[30] = CRGB::White;
    leds[31] = CRGB::White;
    leds[32] = CRGB::White;
    leds[33] = CRGB::White;
    leds[34] = CRGB::White;
    leds[35] = CRGB::White;
    leds[36] = CRGB::White;
    leds[37] = CRGB::White;
    leds[38] = CRGB::White;
    leds[39] = CRGB::White;
    leds[40] = CRGB::White;
    leds[41] = CRGB::White;
    leds[42] = CRGB::White;
    leds[43] = CRGB::White;
    leds[44] = CRGB::White;
    leds[45] = CRGB::White;
    leds[46] = CRGB::White;
    leds[47] = CRGB::White;                   
    }
    
    KnipperlichtL();                      // laat het knipperpatroon starten
    FastLED.clear();
  }

 

 
 buttonState = digitalRead(buttonPin3);    // leest het inputsignaal en kijkt of de verlichting aan staat, als de verlichting aan is zullen de volgende lampjes blijven branden als het knipperlicht aan staat
   if (buttonState == HIGH) {
    
    buttonState = digitalRead(buttonPin2);  // leest het inputsignaal
    if (buttonState == HIGH) {
    leds[0] = CRGB::White;                  // de lampjes die niet uit moeten gaan
    leds[1] = CRGB::White;
    leds[2] = CRGB::White;
    leds[3] = CRGB::White;
    leds[4] = CRGB::White;
    leds[5] = CRGB::White;
    leds[6] = CRGB::White;
    leds[7] = CRGB::White;
    leds[8] = CRGB::White;
    leds[9] = CRGB::White;
    leds[10] = CRGB::White;
    leds[11] = CRGB::White;
    leds[12] = CRGB::White;
    leds[13] = CRGB::White;
    leds[14] = CRGB::White;
    leds[15] = CRGB::White;
    leds[16] = CRGB::White;
    leds[17] = CRGB::White;
    leds[18] = CRGB::White;
    leds[19] = CRGB::White;
    leds[20] = CRGB::White;
    leds[21] = CRGB::White;
    leds[22] = CRGB::White;
    leds[23] = CRGB::White;
                
    }
    
    KnipperlichtR();                       // laat het knipperpatroon starten
    FastLED.clear();
  } 


buttonState = digitalRead(buttonPin2);    // leest het inputsignaal
 if (buttonState == HIGH) {
    Verlichting();                        // start de gewone verlichting
    FastLED.clear();
    
    
  } else {
    FastLED.showColor(CRGB::Black);        // als gewone verlichting laag is led strip wordt zwart
  } 
}

Hartelijk bedankt voor alle hulp en als ik nog vragen heb laat ik het weer weten :slight_smile:

Groeten Jorrit

Heb je al eens naar die code gekeken die je zelf neerzet? En dan ook nog eens begrepen? Want daar staat gewoon de oplossing.......
En je weet dat uitgebreide beginners tutorials zijn voor de arduino?