Pagina1 van 1
Forum

Welkom bij de Tweaking4All gemeenschapsforums!
Voor je gaat deelnemen, bekijk de Forum Regels!

Specifieke onderwerpen: Start het onderwerp met de naam van het programma of systeem.
Bijvoorbeeld “MacOS X – Jouw vraag“, of bijvoorbeeld “MS Word – Jouw Tip of Truc“.

Merk op: Omschakelen naar een andere taal zal niet werken als je een post aan het lezen bent aangezien er waarschijnlijk geen vertaling beschikbaar is.



Arduino - Alle LED ...
 
Deel:
Meldingen
Alles wissen

[Opgelost] Arduino - Alle LED Effecten in een enkele Sketch

18 Berichten
3 Gebruikers
0 Vind-ik-leuks
4,096 Bekeken
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 11 jaar geleden
Berichten: 2676
Topic starter  

Op basis van een verzoek onder het Engelstalige artikel m.b.t Arduino LED Strip Effecten hier alle effecten gebundeld in een enkele Sketch.

Afhankelijk van jouw Arduino en de gebruikte effecten kan het zijn dat je moet opletten op het geheugen verbruik.

Als attachments, een FASTLed en een NEOPixel versie. 

Beiden ongetest, maar compileren wel good.
Je moet in de "loop()" de commentaar tekens weghalen voor de effecten die je wilt gebruiken.


   
BeantwoordenCiteren
(@george)
Active Member
Deelgenomen: 5 jaar geleden
Berichten: 8
 

Oeps Hans, neem het me niet kwalijk, maar na mijn vraag gesteld te hebben op je pagina.
meteen ingelogd op tweakin4all.

Dit omdat ik van je pagina het verzoek begreep er geen lange bestanden te posten (zoals source codes, log bestanden of config bestand). Gebruik het Forum hiervoor. 
Ben bang dat ik er tegen gezondigd heb.
Daarom hier nog een keer (hopelijk op de goede plaats) de vraag wil stellen:

Ik gebruik een arduino nano, met Ledstrip WS2815 en een Rotary encoder (Keyes KY-040).

Deze rotary encoder (heeft een Switch) en door te draaien kan ik de Ledstrip dimmen.
Dit dimmen moet Altijd kunnen, welk effect er ook draait dus daarom zal het ook wel gebruik maken van de “interrupt” PINnen.

Probleem is nu dat als ik in jouw sketch "#define BUTTON 2" of #define BUTTON 3" gebruik ik bij het draaien aan de rotary van het ene effect naar het andere spring. Wat logisch is maar niet wenselijk. Ik wil immers dimmen .

Als ik #define BUTTON 4 gebruik dan werkt het niet bij je script.... ook weer logisch.

Ik ben beslist geen kei in programmeren, maar bijt me al weken vast in het oplossen van het probleem.
Zou mooi zijn als je me op de goede weg kan helpen.

Hieronder eenvoudig script waarmee ik een ledstrip/effect kan dimmen:

/*
** Change brightness Neopixel with Encoder
** Use the Sparkfun Rotary Encoder to vary brightness of Neopixel LEDstrip
**
** Sample the encoder at 200Hz using the millis() function
  Lot's of copy and paste By: G.J. Verboven
*/
#include <FastLED.h>
#define NUM_LEDS 144 //total no. of leds used
#define DATA_PIN 6 //digital pin at which the data pin is connected
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS]; //fast led function

// ------------------------------------------------------------------
// Parameters for Encoder
// Sample the encoder at 200Hz using the millis() function
// ------------------------------------------------------------------
int brightness = 127; // how bright the Neopixel is, start at half brightness (255 is max.)
int fadeAmount = 5; // how many points to fade the Neopixel with each step
unsigned long currentTime;
unsigned long loopTime;
const int pin_A = 3; // DT from encoder
const int pin_B = 2; // CLK from encoder
unsigned char encoder_A;
unsigned char encoder_B;
unsigned char encoder_A_prev = 0;
void setup() {
  FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
  // ------------------------------------------------------------------
  // setup_rotary
  // ------------------------------------------------------------------
  pinMode(pin_A, INPUT);
  pinMode(pin_B, INPUT);
  currentTime = millis();
  loopTime = currentTime;
}
// ------------------------------------------------------------------
// Reading Rotary Encoder
// ------------------------------------------------------------------
void loop() {
  // get the current elapsed time
  currentTime = millis();
  if (currentTime >= (loopTime + 5)) {
    // 5ms since last check of encoder = 200Hz
    encoder_A = digitalRead(pin_A); // Read encoder pins
    encoder_B = digitalRead(pin_B);
    if ((!encoder_A) && (encoder_A_prev)) {
      // A has gone from high to low
      if (encoder_B) {
        // B is high so clockwise
        // increase the brightness, dont go over 255
        if (brightness + fadeAmount <= 255) brightness += fadeAmount;
      }
      else {
        // B is low so counter-clockwise
        // decrease the brightness, dont go below 0
        if (brightness - fadeAmount >= 0) brightness -= fadeAmount;
      }
    }
    encoder_A_prev = encoder_A; // Store value of A for next time
    loopTime = currentTime; // Updates loopTime
  }
  // ------------------------------------------------------------------
  // Just whilst we debug, view output on serial monitor
  // ------------------------------------------------------------------
  Serial.begin(115200);
  Serial.println(brightness);
  // ------------------------------------------------------------------
  // Other processing can be done here (Fill with One color)
  // ------------------------------------------------------------------
  // Hue (Nederlands: tint), is wat we gewoonlijk 'kleur' noemen, zeg een punt op de regenboog.
  // de kleur uitgezet op een cirkel, en wordt de plek aangeduid in graden: Hue loopt dus van 0 tot 360 (graden).
  //
  // Saturation (Nederlands: verzadiging) dit geeft een hoeveelheid (of felheid) van een kleur aan.
  // Wordt uitgedrukt in procenten, en loopt van 0% (flets, grijs) naar 100% (volle kleur).
  //
  // Value of Brightness (Nederlands: intensiteit): staat voor de lichtheid van de kleur.
  // Wordt uitgedrukt in procenten, en loopt van 0% (zwart) naar 100% (wit).Bij HSV
  fill_solid(leds, NUM_LEDS, CHSV(10, 250, brightness));
  FastLED.show(); //fastled function, without this function the colors won't be updated
}

   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 11 jaar geleden
Berichten: 2676
Topic starter  

Hi George,

geen probleem hoor 

Wat het dimmen van LEDs zou ik eigenlijk een andere methode gebruiken.
Het nadeel van een interrupt is dat het de sequence onderbreekt en dat kan wat knipperen met zich mee brengen.
Daarom zou ik eerder de weg nemen van een potentiometer. Je moet daarbij wel opletten hoeveel vermogen er door de potentiometer gaat. Een enkel LEDje zal zonder meer werken, maar een LED strip jaagt er een redelijk vermogen doorheen en dan zal de potentiometer waarschijnlijk uitbranden (niet handig dus). Voor een enkele LED zou de schakeling zoiets zijn als "DimEenLed.png" (aanhangels - bron). Maar voor een strip gaat dat waarschijnlijk fout.

We moeten dan een transistor gebruiken, en omdat de belasting best hoog kan zijn zou ik naar b.v. een TIP64 kijken (kan tot 10 Ampere aan, maar koeling kan nodig zijn - als je minder dan 3A nodig hebt, dan kan een TIP32 ook, maar ook hier kan koeling nodig zijn), en de volgende opstelling proberen: bron (aanhangsel LedDimmenMetTransistor.png). Je ziet in het schema dat het dimmen gebeurt via de +5V en de GND van de LED strip, en er dus niets met de Arduino gedaan hoeft te worden.

Ik heb deze opstelling zelf niet gebouwd, maar het is geen ongebruikelijke opstelling en bespaard je ellende met de interrupts.

Mocht je toch interrupts gebruiken dan moeten we een impuls genereren wanneer de helderheid verandert moet worden - willen we een potentiometer gebruiken.
Een rotary switch kan ook, maar dan wordt het e.e.a. wel wat complexer.


   
BeantwoordenCiteren
(@george)
Active Member
Deelgenomen: 5 jaar geleden
Berichten: 8
 

Hoi Hans,

Allereerst bedankt voor je reactie.
Ik maak bewust geen gebruik van een potentiometer, wil ook niet sturen op stroom/spanning maar op PWM.
Dat werkt via de data lijn van de Ledstrip WS2812 perfect.
(Vergt geen vermogen - al is het een strip van 5 meter.)

Dat dimmen via de sketch die ik gestuurd heb, was inderdaad was gecompliceerder maar werkt perfect.
Van het nadeel van een interrupt - dat het wat knipperen met zich mee kan brengen - heb ik geen last.

Ik heb nu een Teensy 3.2 bordje besteld, daarvan hebben alle digitale pinnen interrupts en ik hoop daarmee het huidige probleem opgelost te hebben.

Als het goed is kan ik dan je sketch Alle LEDStrip effecten in èèn gebruiken om te dimmen via encoder (2 interrupts)... én switchen van het ene effect naar de ander, door de push schakelaar op een andere interrupt aan te sluiten.

Dat wordt weer een paar avondjes stoeien 


   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 11 jaar geleden
Berichten: 2676
Topic starter  

Ik snap helemaal waarom je de potentiometer niet gebruikt - zeker het feit dat het wat "groener" met de stroom omgaat 

Ik ben wel benieuwd hoe de uiteindelijke sketch er uit gaat zien. Helaas heb ik (door recente verhuis) weinig Arduino/LED spullen handig in de buurt liggen, dus ik kan zelf even niet veel uitproberen. Maar ik ben wel benieuwd! 


   
BeantwoordenCiteren
(@george)
Active Member
Deelgenomen: 5 jaar geleden
Berichten: 8
 

Hoi Hans,

Het teensy 3.2 bordje is binnen, maar het lijkt erop dat ik het probleem met te weinig interrupts op de Nano heb kunnen ondervangen.
Mijn project: 1 rotary om ledstrip te dimmen (= 2 interrupts op pin 2 & 3) en 1 schakelaar om te switchen tussen effect (= ander interrupt, die er dus niet meer is).

Ik heb namelijk de rotary op pin 2 & 4 aangesloten.... daardoor reageert de interrupt (alleen pin 2) misschien iets later, maar daar merk je in de praktijk niks van.
Op pin 3 (de andere interrupt) heb ik de schakelaar aangesloten.

In mijn test script werkt het in ieder geval prima.
Maar nu kom ik op de volgende uitdaging:
Zou je me op weg kunnen helpen door uit te leggen hoe ik in je geweldige script van AllEffects LEDStrip Effect (FastLED) de helderheid/brightness van de ledstrip kan veranderen?

In mijn test script laat ik bijvoorbeeld de waarde van "brightness" bepalen door de encoder.
bijvoorbeeld: fill_solid(leds, NUM_LEDS, CHSV(100, 255, brightness));

I.p.v. CHSV kan ik dat ook bij RGB bijvoorbeeld door"

void loop() {
fill_solid(leds, NUM_LEDS, CRGB(255,255,255));
LEDS.setBrightness(20); //setting brightness of LED (0 to 255)
FastLED.show(); //fastled function, without this function the colors won't be updated

Waarbij ik de waarde - in dit voorbeeld 20 - laat bepalen door de Encoder.

Maar hoe verander/bepaal ik de waarde van brightness / hoeveelheid licht van de strip in jouw script?

Ps.: Ik besef dat het voor jouw weer een tijdje terug is dat je deze sketch (sketch/script.... ik gebruik het een beetje door elkaar ) hebt geschreven, maar je bent in deze toch mijn steun en toeverlaat omdat wat je gemaakt hebt voor 99% is wat ik wil.
En - hoewel ik je niet ken - je erg sociaal en hulpvaardig over komt....

Op andere Engelstalige forums zie ik vaak reacties in de trend van: "eerst leren programmeren en dan pas vragen stellen"

Vriendelijke groet, en een fijn weekend.

Ps.: Ik zou je - als je dat wil - graag wat info sturen over mijn project (foto's, 3D cad files etc) maar heb zo geen idee hoe ik dat kan doen.
ik kan hier nl. geen foto's toevoegen.


   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 11 jaar geleden
Berichten: 2676
Topic starter  

Hi George,

als eerste heel erg bedankt voor het mooie compliment.
Ik ben het met je eens dat er nogal wat websites zijn waar de gebruikers een beetje een arrogante houding hebben. Ik ben daar zelf niet zo van gediend (tolereer het op mijn website ook niet). Zeker niet als iemand om hulp vraagt. Men neemt dan wel de moeite om iemand uitgebreid de grond in te boren, maar een antwoord of oplossing wordt er niet gegeven.
Of waar ik zelf ook best een hekel aan heb; je vraagt iets en men doet er dan alle moeite voor (lijkt het) om geen antwoord te gegeven, maar in plaats daarvan je dwingt het op een andere manier te doen waar men niet om gevraagd heeft.

Anyhoo - ik ben een fan van kennis delen en elkaar helpen. In mijn ervaringen is dat altijd veel leuker, en het laat een fijn gevoel achter als je iemand hebt kunnen helpen. Ik ben zelf ook geen expert, maar ik vindt met dit soort dingen prullen erg leuk dus ... als ik dit nou mijn baan kon maken dan was ik helemaal blij hahaha 

Terugkomende naar jouw vraag; hoe stuur je helderheid aan in m,ijn all-in-one sketch?
Als je FastLED gebruikt (uitgaande van deze sketch):

FastLED.setBrightness(100); //setting brightness of LED (0 to 255)

NeoPixel kent (voor zover ik weet) geen vergelijkbare functie.

Als ik de documentatie goed begrijp, kun je dit overal in de code gebruiken, en de veranderde helderheid wordt dan pas actief na de volgende showStrip() aanroep.
Het kan dus nodig zijn om het zo te doen:

FastLED.setBrightness(100); //setting brightness of LED (0 to 255)
showStrip();

De LED array ("leds") heeft nog steeds de waarden die men gebruikte bij de laatste showStrip() aanroep.
Dus deze twee regels stellen de helderheid in en voeren de (aangepaste) showStrip() uit.

Hopelijk helpt dit - en vraagt gerust verder als je meer vragen hebt.

Overigens;
Als je foto's, tekeningen, sketches etc hebt, dan kun je die onder deze editor toevoegen door op "selecteer bestand" te klikken. Als ik me niet vergis kun je tot 4Mb erbij hangen per bericht dat je in het forum plaatst.
Gebruik daarbij geen zip, omdat men deze dan moet downloaden en uitpakken voor men het kan bekijken. Gebruik voor plaatjes PNG, JPG en/of GIF. Voor text TXT of PDF. En voor specifieke bestanden (zoals INO voor een sketch) kun je proberen de betreffende formaten te plaatsen. Als een browser er niet mee overweg kan, dan gaat deze het bestand vanzelf downloaden 
3D CAD files mag je dus ook uploaden, maar zonder 3D CAD heeft men er niet veel aan. Misschien is een export naar VRML (.wrl file), X3D (.x3d file) of X3DOM (.x3d.html file) omdat de browser deze kan weergeven. Of natuurlijk de standaard van AutoCAD (.dwg formaat).

Uiteraard staat het je vrij om het formaat zelf te kiezen 


   
BeantwoordenCiteren
(@george)
Active Member
Deelgenomen: 5 jaar geleden
Berichten: 8
 

Hi Hans,

Ha, Ha.... Hoe simpel kunnen sommige oplossingen zijn. .

Dat ik het zelf niet gezien had.... gebruik notabene zelf in mijn rotary-dim-sketch-probeerseltjes de opdracht "LEDS.setBrightness".

Dus een beetje copy en paste en dit werkt prima.... alweer een stap dichter bij het resultaat.

Ik heb nu dit gebruikt:

LEDS.setBrightness(100); //setting brightness of LED (0 to 255)
FastLED.show(); //fastled function, without this function the colors won't be updated

Weet niet wat feitelijk het verschil is tussen:

FastLED.setBrightness(100);

en 

LEDS.setBrightness(100);

Maar beide werkt.
Ook het verschil tussen:

showStrip();

en 

FastLED.show();

weet ik niet..... eens een keertje uitzoeken.
Maar eerst een Radler om het te vieren en dan weer verder met de volgende stap.


   
BeantwoordenCiteren
(@george)
Active Member
Deelgenomen: 5 jaar geleden
Berichten: 8
 

Een kijken of ik Mp4 kan toevoegen.


   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 11 jaar geleden
Berichten: 2676
Topic starter  

Hey George!

Dat ziet er gaaf uit!!! Ik wilde zoiets maken (x2) als VU meters. Een project voor de toekomst 

Wat betreft showStrip() en FastLED.show();
Ik heb zelf de functie showStrip() gemaakt, omdat ik de routines universeel wilde houden voor FastLED en NeoPixel.
Omdat jij FastLED gebruikt, kan ik net zo goed meteen FastLED.show() gebruiken - de showStrip functie roept dit namelijk ook aan.

LEDs vs FastLED
"leds" is een array van FastLed kleuren die we gedefinieerd hebben. FastLEDs daarin tegen is de array die FastLED zelf intern gebruikt.

Het ziet er echt goed uit! 
Wat voor buis heb je gebruikt? (materiaal)


   
BeantwoordenCiteren
(@george)
Active Member
Deelgenomen: 5 jaar geleden
Berichten: 8
 

Hoi Hans,

Ik gebruik plexiglas satijn buizen van 1 meter

Binnenste heeft een buiten diameter van 20 mm en wanddikte van 3 mm

Buitenste buis heeft een  buiten diameter van 80 mm en wanddikte van 3 mm

Ik heb gekozen voor 2 buizen omdat de Led's dan extra diffuus zijn en omdat ik de buitenste buis gebruik om het licht te dimmen (door er aan te kunnen draaien)

Maar je kan natuurlijk ook een ander materiaal kiezen, (was voor mij ook maar een gokje)


   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 11 jaar geleden
Berichten: 2676
Topic starter  

Nice! Dank je wel voor de info!

Slimme en elegante aanpak voor de dim functie!   -- ik zie dat ik me weer mag gaan verdiepen in 3D printers. 

Ik had ooit eens de eerste en tweede generatie van LeapFrog - maar dat bleek niks dan ellende en problemen.
Na een paar jaar heb ik beiden van de hand gedaan, en heb nooit echt iets fatsoenlijks kunnen printen. Uiteraard is LeapFrog ook verder gegroeid, dus hun producten zullen vast beter zijn geworden. Overigens: fantastische support destijds, maar dat mocht niet baten. Een 3D printje maken bleef een ellende.
Welke 3D printer gebruik jij? De prints zien er erg netjes uit!

Ik had niet in de gaten dat dit soort buizen zo eenvoudig te vinden zijn - ook dank je wel voor de link!
Destijds heb ik het met WC papier gedaan, en was verbaasd hoe mooi dat werkte. Uiteraard is WC papier niet iets wat je in een project gaat gebruiken, dus de buizen zijn een erg mooie vondst.
Ook dank voor de tip om een dubbele buis te gebruiken! 


   
BeantwoordenCiteren
(@george)
Active Member
Deelgenomen: 5 jaar geleden
Berichten: 8
 

Mijn zoon heeft 2 jaar terug een recht-toe-recht-aan 3D printer gekocht.
Een "Geeetech Full Acrylic Prusa I3 unassembled DIY KIT Pro X 3D Printer".... Op zich al een hobby om hem in elkaar te zetten.

Al heel wat onderdelen vervangen, maar hij doet het redelijk.
Was wel even stoeien met de goede settings in Ultimaker Cura, maar print aardig.

Dat de prints er netjes uitzien komt ook omdat ik de voet na het printen heb geschuurd en zwart gespoten, dan ziet het er een stuk "strakker" uit.

Grappig dat je het over wc-papier hebt, dat had ik namelijk ook eerst gedaan.

Ps.: Ik ben nog even aan het stoeien geweest met de Teensy 3.2, omdat die sneller en meer geheugen heeft dan de Arduino Nano.
Komt zeker van pas als de lamp ook nog als VU-meter zou moeten werken (dan loop je bij de Nano tegen geheugen probleem aan)
Maar ik kom er nu achter dat de Teensy 3,2 volt heeft als uitgangen en dat is weer te weinig voor de data lijn van de LED-strip .

Moet daarvoor dus aan de slag met een level shifter.....
Denk dat ik dat maar bewaar als 2de project, anders komt de lamp nooit af.....
Mechanisch en elektronisch lukt het me allemaal wel, maar voor het programmeren......
Te oud ?

Vandaag nog een paar foto's gemaakt van het project en "Quik - GoPro Video" er een filmpje van laten maken.

Fijne week nog
en tot horens.


   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 11 jaar geleden
Berichten: 2676
Topic starter  

Hi George,

Ja het geknutsel en gestoei met de 3D printer is ook mijn ervaring. Inderdaad een hobby apart!
Toch zou ik graag weer met 3D printen aan de gang gaan, maar het e.e.a. is best kostbaar als je het goed wilt doen. Ik hou dus nog even af, tot ik verbetering zie in de markt van 3D printers .

Het nabewerken heb je inderdaad erg netjes gedaan! 
In het verleden gebruikte ik daarvoor aceton dampen om het e.e.a. strakker te krijgen.
Gewoon een grote glazen pot met wat aceton op de bodem, en dan het geprinte item er boven hangen. Niet te lang natuurlijk - het vereist wat experimenteren.

Gaaf videootje! 

Ach te oud ben je nooit he? Ik ben zelf ook niet meer de jongste.
Kwestie van een paar keer doen en babbelen met like-minded mensen. Zo heb ik het ook geleerd. Dus vraag gerust!

Ja, dat 3.2 V probleem is iets waar ik me soms een beetje aan erger. Jaren lang alles 5V en nu ineens naar 3.2 V.
De level shifter (en zeker voor die prijs) lijkt me een goede oplossing - voor "later" haha 

Jij ook nog een fijne week, en dank je wel voor het delen van jouw project. Ziet er mooi uit! 


   
BeantwoordenCiteren
(@ab1976)
New Member
Deelgenomen: 4 jaar geleden
Berichten: 1
 

Vraagje volgens mij is het jullie gelukt om de brightness in het All Effect script te laden via 2 select options

Kan ik het uiteindelijk script ook ergens terug vinden.

Alvast bedankt


   
BeantwoordenCiteren
Pagina 1 / 2
Deel: