Toon posts:

[Arduino] NeoPixelBrightnessBus fade in/uit

Pagina: 1
Acties:

Vraag

Ik ben een Sims plumbob lamp (https://www.thingiverse.com/thing:4770371) aan't maken voor een nicht van me (ze speelt nogal veel The Sims zodus), maar ik zit een beetje vast met een aantal effecten en 1 daarvan is als je de lamp afzet dan dimt ie tot 0 maar als je de lamp aanzet moet die natuurlijk terug in faden.

Het uitfaden lukt (lijn 83 tot 89) dus ik dacht, laat ik de code omdraaien (optellen in de plaats van aftellen) en dat is dan klaar.

yeah right.

Bij het aanzetten duurt het even voor de lamp aangaat en zit ineens op het maximum dat is ingesteld.

Hardware in gebruik:
- Arduino nano
- knop met condensator over tussen gnd en pin3
- 28 SK6812 RGBW neopixel achter elkaar op pin 2
- 5V van de pc usb

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
#include <NeoPixelBrightnessBus.h>
//#include <NeoPixelAnimator.h> niet gebruikt in dit stuk code
#include <avr/sleep.h>

#define DATA_PIN 2
#define button 3 //this is what ever pin you have hooked up to the button. I used an arduino nano, and it has an internal pull up resistor the other side of the button should be wired to ground

#define RainbowDelay 25
#define RainbowBrightness 60
#define colorSaturation 255 // saturation of color constants

/*** Button states & timer **/
volatile uint32_t ButtonTimer = 0;

boolean ButtonActive = false;
boolean LongPressActive = false;
boolean MediumPressActive = false;
boolean OffState=true;
boolean BackFromSleep=false;

/*** Pixel and brightness settings ***/
const uint8_t PixelCount = 28; // make sure to set this to the number of pixels in your strip unit8_t = max 255 pixels
const uint8_t c_MinBrightness = 8; 
const uint8_t c_MaxBrightness = 255;
const RgbwColor black(0);
uint8_t LastBrightness=128;

/*** Animation stuff ***/
uint8_t Animation = 1;
uint8_t LastAnimation=0;

NeoGamma<NeoGammaTableMethod> colorGamma; // for any fade animations, best to correct gamma
NeoPixelBrightnessBus<NeoGrbwFeature, NeoSk6812Method > strip(PixelCount, DATA_PIN);

void setup()
{
  Serial.begin(115200); //gebruik ik als debug functie
  strip.Begin();
  SetRandomSeed();
  strip.SetPixelColor(PixelCount-1, RgbwColor(HslColor(random(360) / 360.0f, 1.0f, 0.2f)));
  strip.Show();
  delay(500);
  strip.SetPixelColor(PixelCount-1, black);
  strip.Show();
  strip.SetBrightness(LastBrightness);
  pinMode(button, INPUT_PULLUP);//setting up the button
}

void loop()
{
  /** Button short/long presses **/
  /* https://www.instructables.com/Arduino-Dual-Function-Button-Long-PressShort-Press/ */
  if (digitalRead(button) == LOW)
  {
    if (ButtonActive == false)
    {
      if(OffState)//came back from a off state
      {
        LastAnimation=0;
        Serial.println("Lights on");
        for (uint8_t i = 8; i <LastBrightness ; i++)
        {
          delay(15);
          strip.SetBrightness(i);
          strip.Show();
        Serial.println(i);
        }
        strip.SetBrightness(LastBrightness);
        strip.Show();
        Serial.println("Offstate end");
      }
      LongPressActive = false;
      ButtonActive = true;
      ButtonTimer = millis();
    }

  // check for long press
    if ((millis() - ButtonTimer >= 5000) && (LongPressActive == false))
    {
      LongPressActive = true;
      Serial.println("Lights off");
      //shut off the lights with a fade and get ready to sleep
      LastBrightness= strip.GetBrightness();
      for (uint8_t i = LastBrightness; i > c_MinBrightness ; i--)
      {
        delay(15);
        strip.SetBrightness(i);
        strip.Show();
      }

      /** setting up deep sleep **/
      ButtonTimer = millis();
      OffState=true;
    }
  }else{
    if(ButtonActive == true && LongPressActive == false)
    {
      if(BackFromSleep==false && OffState==false)
      {
        Animation++;
        if(Animation >= 12){Animation = 1;}
      }
      BackFromSleep=false;
      OffState=false;
    }
    LongPressActive = false;
    ButtonActive = false;
  }

  if(OffState==false)//jump over it when in offstate
  {
    /** Do the animations if any**/
    if(LastAnimation!=Animation)
    {
    switch (Animation)
    {
      case 1:Red();break;
      case 2:Green();break;
      case 3:Blue();break;
      case 4:Yellow();break;
      case 5:White();break;
    }
    LastAnimation=Animation;
    }
  
      strip.Show();
   }
  
  }//end of check offstate

/** give 5 to 10s before going to deep sleep **/
  if ((millis() - ButtonTimer > 5000) && OffState)
  {
    /* https://thekurks.net/blog/2018/1/24/guide-to-arduino-sleep-mode */
    Serial.println("Sleep mode activated :zzzzzzzz");
    delay(1000);//only needed to dump the serial
    sleep_enable();
    attachInterrupt(0,WakeUp,LOW);
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
    sleep_cpu();
  }
}

void WakeUp()
{
  sleep_disable();
  detachInterrupt(0);
  Serial.println("Target practice :x");
  BackFromSleep=true;
}

void Red()
{
  for (uint16_t i = 0; i < PixelCount; i++)
  {
     strip.SetPixelColor(i, RgbwColor(colorSaturation,0,0,0));
  }
  strip.Show();
}

void Green()
{
  for (uint16_t i = 0; i < PixelCount; i++)
  {
     strip.SetPixelColor(i, RgbwColor(0,colorSaturation,0,0));
  }
  strip.Show();
}

void Blue()
{
  for (uint16_t i = 0; i < PixelCount; i++)
  {
     strip.SetPixelColor(i, RgbwColor(0,0,colorSaturation,0));
  }
  strip.Show();
}

void Yellow()
{
  for (uint16_t i = 0; i < PixelCount; i++)
  {
     strip.SetPixelColor(i, RgbwColor(colorSaturation,colorSaturation,0,0));
  }
  strip.Show();
}
void White()
{
  for (uint16_t i = 0; i < PixelCount; i++)
  {
     strip.SetPixelColor(i, RgbwColor(255));
  }
  strip.Show();
}


Ik dacht eerst dat de functie niet werd uitgevoerd maar bij het aanzetten gaat ie er wel degelijk door, dit door Serial.println(i); in die loop (zie lijn 66)

Al wat ik aanraak werk niet meer zoals het hoort. Damic houd niet van zijn verjaardag

Alle reacties


  • DrivinUCrazy
  • Registratie: Oktober 2004
  • Nu online

DrivinUCrazy

Vechte, valle en opstoan

Je declareert lastbrightness direct met de waarde 128. zie regel 26.

Die loop gaat dus niet vanaf 0 tellen. ;)

Edit: hoewel, bij nader inzien lees ik het misschien verkeerd.
Die loop telt wél vanaf 0. Maar direct daarna schrijf je Lastbrightness er weer naar toe in regel 68, maar dat is wel nog steeds de waarde 128.

[Voor 50% gewijzigd door DrivinUCrazy op 06-03-2021 20:50]

't Is een kwestie van geduld, rustig wachten op de dag, dat heel Holland Limburgs lult.

Euhm jawel de loop begint vanaf 0 en eindigt op de waarde van LastBrightness dit had ik al gechecked met de serial.println functie daar kun je mooi zien dat ie vanaf 0 tot 128 telt :)

Al wat ik aanraak werk niet meer zoals het hoort. Damic houd niet van zijn verjaardag


  • Tom-Z
  • Registratie: Augustus 2010
  • Laatst online: 14:13
In setup doe je strip.SetPixelColor(PixelCount-1, black);. Daardoor blijven alle pixels donker totdat de fade-in klaar is en een animation de pixels een kleurtje geeft.
@Tom-Z dat klopt bij de eerste startup, daar had ik nog niet aan gedacht omdat eruit tehalen maar bij gekleurde pixels doet ie het ook.

Ik heb er normaal een video van maar weet niet of ik er momenteel aankan want Windows is aan't kutten, sata schijven zijn weg, nvme waar windows opstaat doet het wel nog.

[Voor 38% gewijzigd door Damic op 06-03-2021 23:24]

Al wat ik aanraak werk niet meer zoals het hoort. Damic houd niet van zijn verjaardag


Acties:
  • 0Henk 'm!
  • Pinned

  • Tom-Z
  • Registratie: Augustus 2010
  • Laatst online: 14:13
Het probleem is dat SetBrightness de kleuren in de pixels zelf aanpast. Als je SetBrightness(128) doet dan halveert hij de helderheid van alle pixels. Als je vervolgens SetBrightness(256) doet verdubbelt hij alles weer.
Het probleem is dat dit door afronden niet lossless is. Als een pixel bijvoorbeeld rood 250 is wordt dat na SetBrightness(128) teruggebracht naar 125, en door SetBrightness(256) teruggebracht naar 250. Maar als de pixel 249 is dan wordt hij na SetBrightness(128) 124, en als je dan weer SetBrightness(256) doet krijg je 248 terug (1tje minder dan de oorspronkelijke waarde).

Je fade-out maakt de pixels volledig zwart en vanuit daar kun je nooit meer terug naar niet-zwart (want nul keer iets is nul).
Ow dat is een goede :Y

Al wat ik aanraak werk niet meer zoals het hoort. Damic houd niet van zijn verjaardag

Pagina: 1


Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee