Nu wil ik hetzelfde effect maken voor de 16 leds die aan de led-ring (ws 2812) zitten.
Hoe kan ik dit het beste aanpakken.
ik kan alle 16 leds aanschrijven maar dat lijkt me niet goed programmeren.
Wat ik bereiken wil is dit effect
leds ronde 1 ronde 2
1 aan uit
2 aan uit
3 uit aan
4 uit aan
5 aan uit
6 aan uit
7 uit aan
8 uit aan
9 aan uit
10 aan uit
11 uit aan
12 uit aan
13 aan uit
14 aan uit
15 uit aan
16 uit aan
Zo alle oneven rondes zijn hetzelfde als ronde 1
Alle even rondes zijn hetzelfde als ronde 2
Je hebt hier twee patronen die elkaar afwisselen. Je kunt overwegen die patronen als arrays in het geheugen te zetten en als LED0 nul is één patroon te kopiëren naar het leds array en als LED0 1 is het andere patroon te kopiëren. Je hebt in je "meneer van dalen" onderwerp al gebruik gemaakt van memcpy(); dat kun je nu ook gebruiken.
Als je het slim aanpakt ga je een twee-dimensionaal array gebruiken voor de patronen; dan kun je LED0 gebruiken als de index (er even van uitgaande dat LED0 een int-achtig type is).
Er moet me wel iets van het hart. Ik snap dat je dit in kleine stapjes wilt doen maar waarom gebruik je nog steeds leds[X] = ...?
In al je testen (om een effect werkend te krijgen met de NeoPixel ring) zou je gebruik moeten maken van bestaande functionaliteiten (in dit geval wat in de output bestanden zit van je LCD/knoppen/LEDs programma); je hebt deze al herschreven als ik me niet vergis. Als je dat niet doet bezorg je jezelf hele stapels werk.
Er zijn twee pwm functies in output, pwmLed() en pwmAll(). Het zou dus eenvoudig moeten zijn om wat je nu hebt om te zetten naar het gebruik van pwmLed(); iets als
Als je de benadering met de twee patronen gaat gebruiken kun je pwmAll() gebruiken; deze moet mogelijk nog enigszins aangepast worden omdat we deze nog niet gebruikt hebben en dus niet getest.
bool tweeKeer(int potVal)
{
LED0 = !LED0;
for (uint8_t i = 0; i < NUM_LEDS; i++) {
uint8_t x = i / 2;
x = x % 2; // en deze 2 kunnen in 1 keer x = (i / 2) % 2;
if (x == 0) { // of if(x) { of dus zelfs if ((i / 2) % 2) {
digitalWrite(ledPins[i], LED0);
}
else {
digitalWrite(ledPins[i], !LED0);
}
}
return true;
};
Het gebruik van een (for) loop is bij het roteren door meer dan 2 velden van de array al aan te raden, maar bij 6 zeker. Het gebruik van wiskundige berekening is de manier om dan te bepalen wat er moet gebeuren.
Ik heb net de code aangepast aan mijn situatie en er branden twee om twee maar er is geen beweging (dus ronde 1 wordt wel uitgevoerd maar ronde 2 niet).
nee, maar probeer nu wel de code te bouwen die @sterretje voorstelde
maar dan krijg ik deze compile error :
/sketch/effects.cpp: In function 'bool tweeKeer(int)':
/sketch/effects.cpp:132:40: error: cannot convert 'CRGB::HTMLColorCode' to 'CRGB*' for argument '1' to 'bool pwmAll(CRGB*, uint8_t)'
pwmAll(CRGB::Blue, leds_working[LED0]);
^
Error during build: exit status 1
't is allemaal een beetje verwarrend, je probeert een code voor individuele leds aan te passen aan een ledstrip, maar in principe zou je opnieuw moeten beginnen.
Dit is ook een beetje een probleem met al die verschillende bestanden. Er is voor mij totaal geen overzicht meer tenzij ik de gehele code opzoek op wokwi, maar dan kan ik weer niet inzoomen.
Maak gewoon per idee een voorbeeld sketch en ga daarna deze implementeren. Dan weet je of iets werk en kan je zonder link eenvoudig gehele werkende (of niet werkende) sketches plaatsen.
Je laat niet zien wat je veranderd hebt, en je laat niet zien waar vanuit je iets aanroept en hoe. Dus 'het werkt niet' is gewoon heel vaag. Of het werkt of niet is dan niet te zien. @sterretje Dit soort berekenmatige bewerkingen en loop berekeningen zijn wat mij btreft echt veel meer van belang dan hoe je dat in allemaal verschillende bestanden zet.
Dit is een voorbeeld dat werkt, zo moet je het doen
#include <FastLED.h>
#define NUM_LEDS 16
#define DATA_PIN 3
CRGB leds[NUM_LEDS];
void setup() {
FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS);
}
void loop() {
static bool LED0 = true;
LED0 = !LED0;
for (uint8_t i = 0; i < NUM_LEDS; i++) {
uint8_t x = i / 2;
x = x % 2; // en deze 2 kunnen in 1 keer x = (i / 2) % 2;
if (x == 0) { // of if(x) { of dus zelfs if ((i / 2) % 2) {
if (LED0) leds[i] = CRGB::Blue;
else leds[i] = CRGB::Red;
}
else {
if (!LED0) leds[i] = CRGB::Blue;
else leds[i] = CRGB::Red;
}
}
FastLED.show();
delay(500);
}
Je zou zelfs de waarde van x & LED0 kunnen combineren