ws 2812b push button 2 funtie's

Arduino specifieke Software
Berichten: 5
Geregistreerd: 18 Sep 2017, 21:12

ws 2812b push button 2 funtie's

Berichtdoor Ron » 13 Mrt 2020, 18:21

hallo,
ik heb een vraagje, en hoop dat iemand van jullie mij op weg kan helpen.
Ten eerste: geloof me ik heb avonden gezocht op het web maar kan niets vinden.
ik wil graag een ws2812 leestrip dmv een analoge schakelaar van kleur laten veranderen.
dat is me gelukt dmv van een sketch aan te passen naar mijn wensen.(button cycler).
alleen nu zou ik ook graag willen als ik bv een kleur geselecteerd heb, bv blauw en ik houd de drukschakelaar vast dat de geselecteerde kleur van lichtsterkte wijzigt.(fade in fader out)


1: is dit mogelijk
2: is dit ook te doen voor een leek als ik.
3: waar moet ik naar zoeken op internet.\
4: zijn er misschien al zulke projecten waar ik wat van af kan kijken.

ik hoop dat er iemand is die mij op weg kan helpen, en het hoeft geen kant en klare oplossing te zijn.

groeten Ron.

Advertisement

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: ws 2812b push button 2 funtie's

Berichtdoor Koepel » 14 Mrt 2020, 00:10

1. Ja, zo'n beetje alles wat je kunt bedenken met tijd en optellen en aftellen en dingen die veranderen kun je in code maken.
2. Nee, niet als het één knop is voor alles.
3. Zoek een op forum.arduino.cc naar "button" en "fade".
4. Ik kwam dit tegen: https://forum.arduino.cc/index.php?topic=372413.msg2568188#msg2568188.

Wil je één knop voor alles ?
Dan is een hele goede beschrijving nodig:
Bijvoorbeeld de knop gebruiken om de kleur te wijzigen, als de knop na het loslaten niet langer ingedrukt was dan een halve seconde. Het faden pas starten als de knop een halve seconde ingedrukt is. Beginnen met een lineaire toename tot 255 en daarna afname naar 0 enzovoorts. Misschien vier seconden van helemaal uit naar helemaal aan (en andersom). Voor een update van leds gebruik ik vaak 25 keer per seconde een update, dus iedere 40ms. Ik zie al een Finite State Machine in de verte opdoemen, maar het kan ook zonder. Een Finite State Machine is een handige manier om door verschillende stappen te lopen. De naam klinkt ingewikkelder dan het is: https://majenko.co.uk/blog/finite-state-machine

Maar hier gaat het heel vaak mis. Als ik vraag om een goede beschrijving, dan haken de meesten af. Als het je lukt om een goede beschrijving te geven, dan heb je de helft van de code al.

Als je meer dingen wilt doen in de loop() dan is het nodig om geen delay() te gebruiken. Dan zou ik de Bounce2 library gebruiken en met de functies van die library het proberen te maken. Er is een extra variabele nodig, die bijhoudt of het faden toeneemt of afneemt. Dan krijg je een sketch die gebruikt maakt van millis().

Wat is een analoge schakelaar ?

Onder het motto: "if you can do it, you can overdo it" heb ik meer dan 40 verschillende functies aan een schakelaar toegekend: https://github.com/Koepel/Fun_with_millis/blob/master/Too_Much_For_One_Button.ino. Dus ja, zo'n beetje alles is mogelijk met een paar variabelen en millis().

Berichten: 5
Geregistreerd: 18 Sep 2017, 21:12

Re: ws 2812b push button 2 funtie's

Berichtdoor Ron » 14 Mrt 2020, 09:32

hartelijk dank voor je snelle antwoord.
Idd het is precies zo als jij omschrijft.
als de pushbutton niet langer ingedrukt wordt dan een halve seconde, moet de ledstrip(ws2812b) de kleur wit weergegeven
op volle lichtsterkte.
wil ik de brightness wijzigen zou ik zoals je beschrijft de knop een halve seconde ingedrukt moeten houden waarna het fade start.
laat ik de knop dan los als de juiste lichtsterkte bereikt is moet de situatie zo blijven.
druk ik weer op de knop korter dan een halve seconde ,dan ga ik naar de volgende kleur(bv blauw).
en druk ik hem langer dan een halve sec in moet deze kleur gaan fade.
dit proces moet zich herhalen tot de laatste kleur, en dan moet de strip uit gaan.
zoals ik al zei heb ik het al werkend door met een pushbutton om van kleur te wisselen(daar ben ik al blij mee).
en op mijn vraag of het te doen is voor een leek, is het antwoord nee( als het 1 knop is voor alles.)
Ik denk dat je gelijk hebt, er komt veel bij kijken.
Maar ik geef het nog niet op, want met jou uitleg ben ik toch weer een stapje verder en weet ik in welke richting ik moet denken.
ik heb trouwens de sketch toegevoegd die ik verder aan zou willen passen .
dit project wil ik straks in mijn nieuwe vrachtauto gaan gebruiken als indirect licht rond het dakluik.
Het is ook als accessoire verkrijgbaar bij Mercedes voor meer als 500 euro, maar dat vind ik te gortig.
mocht het mij toch lukken om het werkend te krijgen, zeer kleine kans. dan laat ik het je weten.
Nogmaals hartelijk dank voor je tijd en uitleg.

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: ws 2812b push button 2 funtie's

Berichtdoor shooter » 14 Mrt 2020, 10:36

een schakelaar is bijna altijd digitaal, omdat er maar twee toestanden in voorkomen, maar ach.
vervolgens moet je ook aan de hand van koepel afvragen welke toestand je hebt, en dan telkens afvragen of de tijd verstreken is die je duwt. is dat zo dan naar de volgende toestand en dus nieuwe waarden naar de ledstrip verzenden.
En ja dat is zeker mogelijk er zijn voorbeelden te over.
paul deelen
shooter@home.nl

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: ws 2812b push button 2 funtie's

Berichtdoor Koepel » 14 Mrt 2020, 10:37

Als je wilt faden, dan wil je natuurlijk niet dat eerst de kleur wijzigt.
Dus het wijzigen van de kleur gebeurt niet bij het indrukken van de knop, maar bij het loslaten. Dan bij het loslaten kijken of hij minder dan een halve seconde was ingedrukt. Daar kun je mee beginnen, dan zit je al vollop met millis() te werken.
Als dat te ingewikkeld is, dan zou ik overschakelen naar de Bounce2 library. Die heeft functies om te kijken of een knop is ingedrukt met "read()", maar ook functies die kijken of een knop op dat moment werd ingedrukt of losgelaten met "rose()" en "fell()".

https://github.com/thomasfredericks/Bounce2.
In de loop() zet je een "update()" functie neer, en laat de loop() zo snel en zo vaak mogelijk uitvoeren. Dus zonder delay() te gebruiken.

Een boolean variabele die bijhoudt of de knop is ingedrukt is niet nodig als je de Bounce2.read() gebruikt.
Een boolean variabele die bijhoudt of het faden bezig is, is niet nodig als dat samen wordt genomen met de stapgrootte van het faden.
Een boolean variabele die bijhoudt of het faden omhoog gaat of omlaag is niet nodig, dan kan in diezelfde stapgrootte.

Hieronder staat pseude code, waarin ik probeerde om afzonderlijke brokjes te maken die elk hun ding doen, en uiteindelijk samen werken. Als je elk afzonderlijk brokje begrijpt, dan komt het goed. Ik kreeg vier brokjes:

Code: Alles selecteren
Eén knop is één Bounce2 object
unsigned long knopMillis;   // het moment waarop een knop werd ingedrukt
unsigned long updateMillis();  // voor de millis() timer om de leds te updaten tijden het faden
unsigned long updateInterval = 40; // 40 ms voor update interval van leds
int fadeStep = 0;  // 0 = niet faden, +1 = fade up, -1 = fade down
int brightness;  // helderheid voor de leds.

loop():
  Bounce2 update()

  if fell()    // als fell() betekent indrukken
  {
    knopMillis = millis();   // timestamp dit moment
  }

  if rose()   // rose() is losgelaten ?
  {
    elapsedMillis = millis() - knopMillis;
   
    if elapsedMillis < halve seconde
    {
      kleur veranderen
    }

    fadeStep = 0;     // stop het faden
  }

  if read() == ingedrukt && fadeStep == 0   // nog niet aan het faden ?
  {
    elapsedMillis = millis() - knopMillis;
   
    if elapsedMills > halve seconde
    {
      fadeStep = 1;       // of +4 of -2 of iets anders, de stapgrootte, start het faden
    }
  }

  if fadeStep != 0    // is op dit moment het faden actief ?
  {
    if millis() - updateMillis >= updateInterval    // een millis timer
    {
      updateMillis = millis();

     Stuur de brightness naar de RGB leds

      brightness += fadeStep;
      if brightness over de limiet van 0 of 255
      {
         corrigeer brightness voor de zekerheid dat de waarden binnen de grenzen is
         fadeStep = -fadeStep;  // andere kant op
      }
    }
  }


Als je wilt dat de helderheid van de leds zijn waarde behoudt bij het wijzigen van de kleur dan hoort dat nog bij de beschrijving.

Berichten: 5
Geregistreerd: 18 Sep 2017, 21:12

Re: ws 2812b push button 2 funtie's

Berichtdoor Ron » 14 Mrt 2020, 11:02

hartelijk dank heren.
ik heb het ff snell bekeken en ga er vanavond mee aan de slag moet nu weg.
jullie zijn super.
ik houd jullie op de hoogte.
groet,

Berichten: 5
Geregistreerd: 18 Sep 2017, 21:12

Re: ws 2812b push button 2 funtie's

Berichtdoor Ron » 19 Apr 2020, 13:25

inderdaad het is te hoog gegrepen, ondanks jullie hulp.
ik zou niet weten hoe de code te verwerken in de code die ik nu heb.
dit is wat ik nu werkend heb.
Misschien weet iemand van jullie of er al een soortgelijk project te vinden is op internet met code die ik dan aan
kan passen, ik heb nog niets kunnen vinden.

groet, Ron


#include <Adafruit_NeoPixel.h>

// Simple demonstration on using an input device to trigger changes on your
// NeoPixels. Wire a momentary push button to connect from ground to a
// digital IO pin. When the button is pressed it will change to a new pixel
// animation. Initial state has all pixels off -- press the button once to
// start the first animation. As written, the button does not interrupt an
// animation in-progress, it works only when idle.

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif

// Digital IO pin connected to the button. This will be driven with a
// pull-up resistor so the switch pulls the pin to ground momentarily.
// On a high -> low transition the button press logic will execute.
#define BUTTON_PIN 2

#define PIXEL_PIN 6 // Digital IO pin connected to the NeoPixels.

#define PIXEL_COUNT 60 // Number of NeoPixel
// Declare our NeoPixel strip object:
Adafruit_NeoPixel strip(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800);
// Argument 1 = Number of pixels in NeoPixel strip
// Argument 2 = Arduino pin number (most are valid)
// Argument 3 = Pixel type flags, add together as needed:
// NEO_KHZ800 800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
// NEO_KHZ400 400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
// NEO_GRB Pixels are wired for GRB bitstream (most NeoPixel products)
// NEO_RGB Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
// NEO_RGBW Pixels are wired for RGBW bitstream (NeoPixel RGBW products)

boolean oldState = LOW;
int mode = 0; // Currently-active animation mode, 0-9

void setup() {
pinMode(BUTTON_PIN, INPUT_PULLUP);
strip.begin(); // Initialize NeoPixel strip object (REQUIRED)
strip.show(); // Initialize all pixels to 'off'
}


void loop() {
// Get current button state.
boolean newState = digitalRead(BUTTON_PIN);

// Check if state changed from high to low (button press).
if((newState == LOW) && (oldState == HIGH)) {
// Short delay to debounce button.
delay(20);
// Check if button is still low after debounce.
newState = digitalRead(BUTTON_PIN);
if(newState == LOW) { // Yes, still low
if(++mode > 7) mode = 0; // Advance to next mode, wrap around after #8
switch(mode) { // Start the new animation...
case 0:
colorWipe(strip.Color( 0, 0, 0), 2); // Black/off
break;
case 1:
colorWipe(strip.Color(225, 255, 255),2); // wit
break;
case 2:
colorWipe(strip.Color( 0xff, 0x4d, 0x76),2); // roze
break;
case 3:
colorWipe(strip.Color( 0xbb, 0x33, 0x00), 2); // amber
break;
case 4:
colorWipe(strip.Color( 225, 0, 0), 2); // rood
break;
case 5:
colorWipe(strip.Color(0, 225, 0),2); // groen
break;
case 6:
colorWipe(strip.Color( 0x0c, 0xf0, 0xe8),2); // turquoise
break;
case 7:
colorWipe(strip.Color( 0, 0, 225), 2); // Blue
break;

}
}
}

// Set the last-read button state to the old state.
oldState = newState;
}

// Fill strip pixels one after another with a color. Strip is NOT cleared
// first; anything there will be covered pixel by pixel. Pass in color
// (as a single 'packed' 32-bit value, which you can get by calling
// strip.Color(red, green, blue) as shown in the loop() function above),
// and a delay time (in milliseconds) between pixels.
void colorWipe(uint32_t color, int wait) {
for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip...
strip.setPixelColor(i, color); // Set pixel's color (in RAM)
strip.show(); // Update strip to match
delay(wait); // Pause for a moment
}
}

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: ws 2812b push button 2 funtie's

Berichtdoor shooter » 20 Apr 2020, 08:54

begin eens met dat if ++mode uit elkaar te zetten
zet een default bij die switch
en controleer welke case aanstaat met serial.print
en wanhoop niet, probeer het eens met commentaar erbij schrijven, dan weet je zelf wat er gebeurt, ipv dat je kopieeert.
paul deelen
shooter@home.nl

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 12 gasten