WS2812 ledstrip regelen

Blue Sky

Cableguy

Ik heb nog een flinke WS2812 ledstrip liggen die ik voorheen gebruikte voor ambilight achter de tv maar sinds ik een nieuwe tv heb past die niet meer. Nu ben ik bezig om mijn zend-shack opnieuw in te richten en wil ik die strip gebruiken voor verlichting.

Mijn idee is het volgende: ik wil met een potmeter de kleur kunnen bepalen en via een 2e pot de lichtsterkte. Ik heb helaas geen verstand van programmeren met een Arduino (wel om een sketch te laden) dus ik moet het van kant en klare sketches hebben. Heeft iemand een idee of een sketch liggen (of een link) die zoiets kan? Ik heb Arduino's en Raspberry Pi's liggen dus kwa hardware geen probleem.

Waar rook is, is stroom
buckfast_beekeeper

Golden Member

Mooi project om mee te starten. De kans dat er op het www iets te vinden is, wat perfect past is niet zo groot. Voor WS2812 bestaat er ongetwijfeld wel een librarie. De potmeters zou ik vervangen door rotary encoder. Is ook geen hogere wiskunde. Van beiden zijn haast zeker voorbeeldjes te vinden. Het is dan nog alleen samen brouwen.

Waarom geen ESP8266? Kan je ook programmeren met de arduino omgeving. Zit wifi in zodat je ook kan bedienen via een webinterface. Kosten bij ali amper iets.

edit: https://www.hackster.io/wirekraken/esp8266-websockets-and-ws2812b-leds…
https://www.youtube.com/watch?v=4wc182qlB7o

edit 2: de kleur via een potmeter? Met 1 voor elke kleur zal het eenvoudiger zijn.

Van Lambiek wordt goede geuze gemaakt.

Bekijk eens een artikel over HSL, HSV, en RGB (bijvoorbeeld op wikipedia). Een vraag die je wilt beantwoorden is hoe je wit licht wilt kunnen krijgen. Is dat door een derde potmeter/encoder, of wil je dat je met de lichtsterkte van uit, naar volle kleur, naar wit kan regelen?

Meep! Meep!

edit 2: de kleur via een potmeter? Met 1 voor elke kleur zal het eenvoudiger zijn.

Als je, zoals je zelf suggereert, een rotary encoder gebruikt kun je zo veel kleuren kiezen als je wilt. Als je ze maar in je code stopt.

buckfast_beekeeper

Golden Member

Elke kleur afzonderlijk regelen zal een stuk eenvoudiger zijn dan alle 16 776 216 kleuren na elkaar te doorlopen. Op bijna alle, zo niet alle, afstandsbedieningen wordt er gebruik gemaakt van 3 kleuren en elke kleur een + en - toets. In software of webinterface wordt meestal gebruik gemaakt van 3 sliders. Elk met een waarde 0-255. TS kan bij een 3 rotary encoder ook kiezen om 0 en 255 als uitersten te behouden zodat verder draaien in dezelfde richting effectloos wordt. Maar hij kan ook kiezen om van 255 naar 0 te gaan of omgekeerd.

Van Lambiek wordt goede geuze gemaakt.
Blue Sky

Cableguy

Met 255 stappen via een rotary heb je al aardig wat kleuren en dat is voor mij genoeg. Elke kleur apart regelen mag ook, het gaat er mij om dat ik niet altijd fel wit licht wil hebben.

Waar rook is, is stroom

Persoonlijk vind ik de FastLED library mooi.
Dan zou het voor aan arduino met drie potmeters (HSB) zoiets worden:

c code:

 

// HSB voorbeeld; AS 092020

#include <FastLED.h>

// How many leds are in the strip?
#define NUM_LEDS 60

// Data pin that led data will be written out over
#define DATA_PIN 3

// This is an array of leds.  One item for each led in your strip.
CRGB leds[NUM_LEDS];

#define colourInPin A0
#define satInPin A1
#define brightInPin A2

// This function sets up the ledsand tells the controller about them
void setup() {
	// sanity check delay - allows reprogramming if accidently blowing power w/leds
  delay(2000);
  FastLED.addLeds<WS2812, DATA_PIN, RGB>(leds, NUM_LEDS);
}

// This function runs over and over, and is where you do the magic to light
// your leds.
void loop() {
   int mappedHue = map(analogRead(colourInPin), 0, 1023, 0, 255);
   int mappedSat = map(analogRead(satInPin), 0, 1023, 0, 255);
   int mappedBright = map(analogRead(brightInPin), 0, 1023, 0, 255);
  
   // Fill array
   for(int i = 0; i < NUM_LEDS; i = i + 1) {
      // Turn our current led to the HSB values
      leds[i] = CHSV(mappedHue, mappedSat, mappedBright);
   }
   // Show the leds 
   FastLED.show();
}

Ik heb even geen tijd om het te testen, en weet ook niet of ik WS2812's in huis heb.

Blue Sky

Cableguy

Thanks! Ik ga dit binnenkort eens testen. Hoe sluit ik de potmeters aan? 1 pen op de plus, de andere op de min en de loper op de gedefinieerde pin van de arduino?

Waar rook is, is stroom
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Blue Sky

Cableguy

Net getest met 3 potmeters op een breadboard en het werkt perfect, precies zoals ik het in gedachten had. Thanks Aart voor de code !

Met de 1e pot regel je de kleur, de 2e de helderheid en met de derde kan je van iedere kleur naar helder wit.

Waar rook is, is stroom

Bedankt voor het terugmelden, mooi dat het werkt !
Dat het in 1x werkt gebeurd mij voor eigen programmeerwerk dus nooit ;)

Blue Sky

Cableguy

We zijn dik 2 jaar verder en ik heb eindelijk de nieuwe shack klaar. De led verlichting werkt perfect maar nu ontstaat er een nieuw probleem: storing. Ik heb op alle banden storing als de led verlichting aan is maar als de ledstrip volledig wit is is de storing nihil maar nog wel aanwezig op sommige frequenties. Is deze storing te onderdrukken want op deze manier heb ik weinig aan mijn zendontvangers en de led verlichting maakt de shack knus ;-)

Waar rook is, is stroom
buckfast_beekeeper

Golden Member

c code:

// Fill array
   for(int i = 0; i < NUM_LEDS; i = i + 1) {
      // Turn our current led to the HSB values
      leds[i] = CHSV(mappedHue, mappedSat, mappedBright);
   }
   // Show the leds 
   FastLED.show();

Voer dit eens alleen uit als er een waarde wijzigt.

Van Lambiek wordt goede geuze gemaakt.

Dat helpt als het de data-transmissies zijn, maar niet als het 't PWMen van de WS2812 is....

Edit: Dus een prima experiment om uit te zoeken waar het vandaan komt.

[Bericht gewijzigd door rew op zaterdag 14 januari 2023 21:37:00 (29%)

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
buckfast_beekeeper

Golden Member

Waarom überhaupt WS2812 PWM-en? Met brightness kan je regelen van niks te zien tot vol licht.

Heb je zeg maar 300 leds (5m 60leds/m) dan zit je telkens data te sturen voor 300 leds en dan een FastLED.show();

Als ze allemaal dezelfde kleur hebben, wat hier blijkbaar het geval is, gebruik ik.

c code:


CRGB leds[NUM_LEDS];


FastLED.setBrightness(brightness);
fill_solid(leds, NUM_LEDS, CRGB(rood1, groen1, blauw1));
FastLED.show();

Verder worden er 4 rotary encoders gebruikt. Rood, Groen, Blauw en helderheid.

Ik zag wel een hapering bij regenboog weergave en het opvragen van DS18B20 temperatuur. Dan is er een delay van 750ms. Met sensors.setWaitForConversion(false); is dat ook opgelost.

Van Lambiek wordt goede geuze gemaakt.

Op 14 januari 2023 22:32:28 schreef buckfast_beekeeper:
Waarom überhaupt WS2812 PWM-en? Met brightness kan je regelen van niks te zien tot vol licht.

Hoe denk je dat de WS2812 zelf "helderheid 117/255" regelt? Die PWMt binnen het chipje.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Blue Sky

Cableguy

Als ik het goed begrijp verzoorzaakt PWM de storing?

Waar rook is, is stroom
buckfast_beekeeper

Golden Member

Op 15 januari 2023 10:45:08 schreef rew:
[...]Hoe denk je dat de WS2812 zelf "helderheid 117/255" regelt? Die PWMt binnen het chipje.

Doen ze trouwens om elke mogelijke kleur te 'maken'. Maar dat gaat geen knipperen van de pixels veroorzaken. Waarom iets wat de led zelf goed doet proberen slechter te maken?

Het is trouwens de librarie die de helderheid 'herrekent' naar kleur waarde. De helderheid wordt niet als byte meegegeven alleen RGB.

Van Lambiek wordt goede geuze gemaakt.

Waarom begin jij steeds over PWM, alsof dat door de arduino gedaan zou worden???? Er wordt een zwik WS2812 leds aangestuurd, die intern 3 PWM controllers hebben om de R, G en B leds op de gewenste helderheid te krijgen. Of dat er iets gaat flikkeren. Reageer je op tussen-resultaten van 2 jaar geleden of zo?

@Blue Sky: Er zijn twee "dynamische" dingen in het systeem: 1: De transmissies van de arduino naar de WS2812 leds en 2: De PWM van de WS2812 leds zelf.

ALS het aan de transmissies van de arduino naar de leds ligt, dan lost: "Doe dat maar zelden" hoogst waarschijnlijk je probleem snel op. Als het niet helpt, dan weten we dus dat het aan de PWM van de leds ligt. Dus het is iets wat je makkelijk (het is alleen software) kan proberen. Je moet dan na het uitlezen van de potmeters kijken of de waarden significant veranderd zijn en dan de leds updaten. Als ze niet of nauwelijks veranderd zijn (de uitlezing zal niet 100% stabiel zijn), dan sla je de update van de leds over.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Blue Sky

Cableguy

Op 15 januari 2023 14:50:26 schreef rew:
@Blue Sky: Er zijn twee "dynamische" dingen in het systeem: 1: De transmissies van de arduino naar de WS2812 leds en 2: De PWM van de WS2812 leds zelf.

ALS het aan de transmissies van de arduino naar de leds ligt, dan lost: "Doe dat maar zelden" hoogst waarschijnlijk je probleem snel op. Als het niet helpt, dan weten we dus dat het aan de PWM van de leds ligt. Dus het is iets wat je makkelijk (het is alleen software) kan proberen. Je moet dan na het uitlezen van de potmeters kijken of de waarden significant veranderd zijn en dan de leds updaten. Als ze niet of nauwelijks veranderd zijn (de uitlezing zal niet 100% stabiel zijn), dan sla je de update van de leds over.

Ik begrijp er eerlijk gezegd niet veel van... Wat moet ik doen (of zou ik kunnen) om het probleem te verhelpen? Moeten die stukjes code in de bestaande code verwerkt worden? Ik ben helaas geen programmeur ;-)

Waar rook is, is stroom

ik vind het gebruik van een strip met ws2812 leds niet echt geschikt voor het verlichten van een ruimte. Je wilt namelijk denk ik de hele led vaak gelijk van kleur, en niet elke led afzonderlijk. Die strips zijn leuk voor effecten en animaties, maar produceren ook een hoop emissie door hoge schakel frequenties.
Kun je niet beter een gewone rgb(W) led strip nemen met een descent led drivertje? Dat pwmt ook, maar wellicht minder problemen, ook al is de schakel stroom dan wel hoger. Als je helemaal geen pwm wilt moet je een stroomgestuurde ledstrip nemen (CV)

@stijnos: Je hebt gelijk. Maar mensen gebruiken wat ze hebben liggen.

@blue sky: Het voorstel is om een experiment te doen. Mogelijk is het resultaat van het experiment: "En zo is het goed, niets meer aan doen", en mogelijk is het resultaat: "OK. Dan weten we dat het daar niet aan ligt". Dus geen garantie dat het 't probleem oplost, maar zowiezo zijn we een stap verder.

Wat is het experiment: De code aanpassen zodat ...

Als jij dat niet zelf kan, dan kan je kijken of iemand hier dat wil doen. Maar dan is het wel het makkelijkst als je de exacte code die je nu gebruikt even post. Als ik zou gokken dat het stuk hierboven is wat je gebruikt, en jij hebt daarna nog wijzigingen gedaan dan moet jij die wijzigingen opnieuw doen, dat soort dingen. Gewoon even "actuele situatie" posten en dan werken we daarvandaan verder.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Blue Sky

Cableguy

Jullie slaan de spijker op zijn kop, ik had ze inderdaad liggen en het is niet de bedoeling om de shack er als een regenboog uit te laten zien, het gaat mij om een warm witte tint te maken.

@rew: de exacte code staat hier boven in de post van Aart.

Ik had in mijn vorige shack ook een ledstrip maar daar vielen na verloop van tijd steeds meer leds uit dus daar heb je niet zo veel aan. Die WS 2812 hebben al een hele tijd probleemloos gewerkt als ambilight en ze branden allemaal nog en er komt flink wat licht vanaf.

Ik kan helaas niet programmeren dus het zou mooi zijn als iemand mij met de code zou helpen.

Ik heb in de keuken een Philips Hue ledstrip hangen die je met een app kan regelen, ik kan eens testen of die storing veroorzaken.

Waar rook is, is stroom

c code:



// HSB voorbeeld; AS 092020

#include <FastLED.h>

// How many leds are in the strip?
#define NUM_LEDS 60

// Data pin that led data will be written out over
#define DATA_PIN 3

// This is an array of leds.  One item for each led in your strip.
CRGB leds[NUM_LEDS];

#define colourInPin A0
#define satInPin A1
#define brightInPin A2

// This function sets up the ledsand tells the controller about them
void setup() {
	// sanity check delay - allows reprogramming if accidently blowing power w/leds
  delay(2000);
  FastLED.addLeds<WS2812, DATA_PIN, RGB>(leds, NUM_LEDS);
}

// This function runs over and over, and is where you do the magic to light
// your leds.
void loop() {
   int mappedHue = map(analogRead(colourInPin), 0, 1023, 0, 255);
   int mappedSat = map(analogRead(satInPin), 0, 1023, 0, 255);
   int mappedBright = map(analogRead(brightInPin), 0, 1023, 0, 255);

   static int oldh, olds, oldb;
   if ((abs (oldh - mappedHue) > 3) ||
       (abs (olds - mappedSat) > 3) || 
       (abs (oldb - mappedBright) > 3)) {
     // Fill array
     for(int i = 0; i < NUM_LEDS; i = i + 1) {
        // Turn our current led to the HSB values
        leds[i] = CHSV(mappedHue, mappedSat, mappedBright);
     }
     // Show the leds 
     FastLED.show();
     oldh = mappedHue;
     olds = mappedSat;
     oldb = mappedBright;
   }
}

Als ie zeurt over dat je "abs" niet hebt, dan moet je boven de eerste aanroep toevoegen:

code:


#define abs(x) (((x)>=0)?x:-x)
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Blue Sky

Cableguy

Dank je wel, ik ga het deze week nog proberen !

Waar rook is, is stroom