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.



neopixel ring probl...
 
Deel:
Meldingen
Alles wissen

[Opgelost] neopixel ring probleem +RF functie

4 Berichten
2 Gebruikers
0 Reactions
1,462 Bekeken
(@bartie1967)
Active Member
Deelgenomen: 4 jaar geleden
Berichten: 10
Topic starter  

Goedemiddag

als nieuweling op dit forum wil ik mezelf eerst voorstellen. Mijn naam is Bart , ben 53 jaar en woonachtig te Oostende ,Belgie.

Ik ben een noob in de arduinotaal , ik kan wat parameters aanpassen , maar ik spreek niet de taal.

Ik heb een oude plafondlamp , die ik aan het herbouwen ben met een neo pixel ring.. Die wil ik als kerstcadeau aan mijn dochter geven die gek is op al die kleurtjes van de neopixel

Samen met iemand die de code aanpast voor mij loopt dit project bijna op zijn einde ,

Ik loop nog op enkele problemen en ik hoop dat ik via deze weg mijn "kerstcadeau" kan afwerken .

Het zijn diverse patronen die via een druk op een knop steeds veranderen .

Mijn bedoeling is om bij iedere druk op de knop een nieuw patroon te laten oplichten .

Dat werkt tot ik aan case 7 kom. Bij case 6 faden de pixels en case 7 komt niet tevoorschijn.

De rest werkt perfect.

Graag had ik ook een RF remote gehad die de functie van de push knop vervangt . Ik heb een receivertje en een transmitter , maar weet niet hoe dit te integreren .

Hopelijk kan er iemand me helpen

Mvg  Bart

Hier een voorproefje van de lamp

 

zie hier de code

 

#include <Adafruit_NeoPixel.h>

const unsigned long ButtonDelay = 200;

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

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

#define PIXEL_COUNT 24 // number of neopixel (change this accordingly)

// Parameter 1 = number of pixels in strip, neopixel stick has 8
// Parameter 2 = pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
// NEO_RGB Pixels are wired for RGB bitstream
// NEO_GRB Pixels are wired for GRB bitstream, correct for neopixel stick
// NEO_KHZ400 400 KHz bitstream (e.g. FLORA pixels)
// NEO_KHZ800 800 KHz bitstream (e.g. High Density LED strip), correct for neopixel stick
Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800);

bool oldState = HIGH;
int showType = 0;
bool StateChanged = false;

void setup() {
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  strip.begin();
  strip.setBrightness(100); // Lower brightness and save eyeballs!
  strip.show(); // Initialize all pixels to 'off'
}

void loop() {
  // Get current button state.
  bool 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) {
      showType++;
      if (showType > 8)
        showType = 0;
      StateChanged = true;
    }
  }
  if (StateChanged) {
    startShow(showType);
    StateChanged = false;
  }
  // Set the last button state to the old state.
  oldState = newState;
}

void startShow(int i) {
  switch (i) {
  case 0:
    colorWipe(strip.Color(0, 0, 0), 50); // Black/off
    break;
  case 1:
    colorWipe(strip.Color(255, 255, 255), 50); // White
    break;
  case 2:
    colorWipe(strip.Color(0, 100, 0), 50); // Green
    break;
  case 3:
    colorWipe(strip.Color(255, 165, 0), 50); // Orange
    break;
  case 4:
    colorWipe(strip.Color(255, 0, 0), 50); // Red
    break;
  case 5:
    colorWipe(strip.Color(0, 0, 255), 50); // Blue
    break;
  case 6:
    rainbow(20);
    break;
  case 7:
    rainbowCycle(20);
    break;
  case 8:
    theaterChaseRainbow(50);
    break;
  }
}

// Fill the dots one after the other with a color
void colorWipe(uint32_t c, uint8_t wait) {
  for (uint16_t i = 0; i < strip.numPixels(); i++) {
    strip.setPixelColor(i, c);
    strip.show();
    delay(wait);
  }
}

void rainbow(uint8_t wait) {
  uint16_t i, j;
  delay(ButtonDelay);
  while (true) {
    for (j = 0; j < 256; j++) {
      for (i = 0; i < strip.numPixels(); i++) {
        strip.setPixelColor(i, Wheel((i + j) & 255));
        if (digitalRead(BUTTON_PIN) == LOW) {
          ResetToBlack();
          return;
        }
      }
      strip.show();
      delay(wait);
    }
  }
}

// Slightly different, this makes the rainbow equally distributed throughout
void rainbowCycle(uint8_t wait) {
  uint16_t i, j;
  delay(ButtonDelay);
  while (true) {
    for (j = 0; j < 256 * 5; j++) // 5 cycles of all colors on wheel
    {
      for (i = 0; i < strip.numPixels(); i++) {
        strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
        if (digitalRead(BUTTON_PIN) == LOW) {
          ResetToBlack();
          return;
        }
      }
      strip.show();
      delay(wait);
    }
  }
}

//Theatre-style crawling lights with rainbow effect
void theaterChaseRainbow(uint8_t wait) {
  delay(ButtonDelay);
  while (true) {
    for (int j = 0; j < 256; j++) // cycle all 256 colors in the wheel
    {
      for (int q = 0; q < 3; q++) {
        for (int i = 0; i < strip.numPixels(); i = i + 3) {
          strip.setPixelColor(i + q, Wheel((i + j) % 255)); //turn every third pixel on
          if (digitalRead(BUTTON_PIN) == LOW) {
            ResetToBlack();
            return;
          }
        }
        strip.show();
        delay(wait);
        for (int i = 0; i < strip.numPixels(); i = i + 3) {
          strip.setPixelColor(i + q, 0); //turn every third pixel off
        }
      }
    }
  }
}

// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos) {
  if (WheelPos < 85) {
    return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  } else if (WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  } else {
    WheelPos -= 170;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
}

void ResetToBlack() {
  colorWipe(strip.Color(0, 0, 0), 20);
  StateChanged = true;
  showType = (showType + 1) % 9;
}
Dit onderwerp werd gewijzigd 4 jaar geleden door bartie1967

   
BeantwoordenCiteren
Onderwerp trefwoorden
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 12 jaar geleden
Berichten: 2859
 

Hoi Bart!

Ik heb de vrijheid genomen om de video te comprimeren (geluid ook verwijderd) en in jouw post te zetten en de code wat op te ruimen.
Als nieuweling mag je nog geen aanhangsels in het forum plaatsen (veiligheid dingetje), en soms is het niet altijd even handig hoe code formattering werkt.

Ik hoop dat je dit niet bezwaarlijk vindt. 😉 

 

Misschien handig voor referentie in de toekomst:
Ik heb ooit eens een cursus voor Arduino programmeer beginners geschreven, misschien heb je er wat aan om wat bekender te worden met de Arduino-taal 😉 

 

Als ik naar de code kijk, dan is het eerste probleem dat een loop van een effect niet altijd correct onderbroken wordt.
Voor wat ik zo 1-2-3 kan zien worden zowel "rainbow()" als "rainbowCycle()" alleen maar onderbroken als toevallig de knop op het juiste moment wordt uitgelezen als LOW.
Dit kan dus plaats vinden, of niet plaats vinden, of te vaak plaats vinden.

In het opvolgende project heb ik daarom een interrupt ingebakken die elke functie meteen afbreekt en een ander effect kiest.
Misschien is het een idee om even naar dat nieuwere project te kijken: Arduino – Alle LEDStrip effecten in èèn (NeoPixel en FastLED).

Wat RF besturing betreft; dat wordt wat lastiger, want met een RF ontvanger kun je geen interrupt triggeren, dus als RF gebruik echt nodig is, dan heb je aan die nieuwe aanpak misschien niet veel - misschien wel een goed idee om het toch even door te kijken.

 

In een opkomend project heb ik dat opgelost door een ESP8266 te gebruiken (goedkoper, krachtiger, sneller en kleiner dan een Arduino, en WiFi meteen ingebakken), en een van de veel aangeroepen functies aan te passen. Ik kan in dat project via mijn PC, mobiele telefoon of tablet, de effecten wisselen.
In mijn project doe ik dat door elke aanroep van "strip.show()" te vervangen door mijn eigen functie. Iets wat in jouw geval ook zou kunnen werken.

In plaats van "show.strip()" gebruik ik dan bijvoorbeeld "showstrip()" (let op de punt die ik heb weggehaald), waarbij ik zelf een functie "showstrip()" definieer.
Zoiets als dit:

bool showstrip() {
if (digitalRead(BUTTON_PIN) == LOW) {
ResetToBlack();
return false;
} else {
show.strip();
return true;
}
}

Om te weten dat een functie moet worden afgebroken, laat ik deze nieuwe functie een boolean (bool - dus true of false) terug geven.
Als het resultaat TRUE is, dan gaan we verder met het lopende effect. Komt er echter FALSE terug, dan moet het lopende effect worden afgebroken.

Als we dan (als voorbeeld) naar de rainbow functie kijken:

void rainbow(uint8_t wait) {
  uint16_t i, j;
  delay(ButtonDelay);
  while (true) {
    for (j = 0; j < 256; j++) {
      for (i = 0; i < strip.numPixels(); i++) {
        strip.setPixelColor(i, Wheel((i + j) & 255));
        if (digitalRead(BUTTON_PIN) == LOW) {
          ResetToBlack();
          return;
        }
      }
      strip.show();
      delay(wait);
    }
  }
}

dan moet deze worden aangepast naar:

void rainbow(uint8_t wait) {
  uint16_t i, j;
  delay(ButtonDelay);
  while (true) {
    for (j = 0; j < 256; j++) {
      for (i = 0; i < strip.numPixels(); i++) {
        strip.setPixelColor(i, Wheel((i + j) & 255));
      }
      if (!stripshow()) { return; } // let op het uitroepteken voor "stripshow()"
delay(wait); } } }

Een paar voordelen hiervan:

Je hoeft de code voor het testen van de knop maar 1x te schrijven
Daardoor worden de andere functies ook overzichtelijker.

Ook nog een puntje: drukknoppen kunnen een "bounce" effect hebben, waardoor het voor de Arduino lijkt alsof de knop meerdere keren ingedrukt werd.
Uiteraard niet de bedoeling, dus wat men dan vaak doet is het uitlezen van de knop status voorzien van een kleine pauze.

Omdat we de test nu doen na het opzetten van alle kleuren, dus bij strip.show() in plaats van bij strip.setPixelColor, hebben we eigenlijk al een kleine pauze automatisch ingebouwd.
Het KAN zijn dat de pauze dan toch nog te kort is. In dat geval moeten we even naar de verlopen tijd kijken, wanneer de laatste keer de knop was getest.
Daar kijken we dan wel naar mocht dat nodig zijn.

Misschien helpt dit je op weg of maakt dit het verhaal nog verwarrender haha - ik hoop dat het helpt.

 

Nog een tip: de FastLED bibliotheek is een betere keuze dan de NeoPixel bibliotheek.
FastLED is volwassener, wordt actiever bijgehouden, en is over het algemeen aanzienlijk sneller. 😊 


   
BeantwoordenCiteren
(@bartie1967)
Active Member
Deelgenomen: 4 jaar geleden
Berichten: 10
Topic starter  

Hey Hans

 

T ja , met die newbies niets anders dan last hé .... Alvast bedankt voor de forum tips....

Als het al Chinees was dan is het nu Japanees geworden ....

Het ziet er allemaal interessant uit . Maar ik wil eerst dit project afwerken voor mijn dochter alvorens ik terug een andere berg beklim.

Ik heb de sequenties wat kunnen aanpassen , en nu heb ik een werkende lamp . Er zitten nog een paar hickups in , maar daar kan ik mee leven .

Ik dacht dat een RF toets de gewone toets kon vervangen .

Het is de bedoeling dat er slechts 1 toets zal worden gebruikt om de volgende sequentie op te vragen .

ik dacht aan een simple RF M4 receiver en daar een bijhorende afstandsbediening voor te gebruiken .

Ik zal me zeker nog eens verdiepen in de materie , maar ik ken mijn grenzen ....Daarom vraag ik hulp aan mensen om dit project tot een mooi einde te kunnen brengen en het pakje onder de kerstboom te kunnen leggen ....

 

is het de bedoeling dat ik bovenstaande codes in mijn bestaande code aanpas , of zijn dit voorbeelden dat je gaf ?

mvg Bart

 

 


   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 12 jaar geleden
Berichten: 2859
 

Hoi Bart!

Ik had al een vermoeden dat het even als Chinees over zou kunnen komen 😉 
Begrijp ik goed dat jij Bartie1967 bent in de comments?

Wat RF betreft: als je iets hebt wat "schakelt", dus 1:1 een schakelaar kan vervangen, dan zou je dat kunnen gebruiken.
Ik heb zelf nog niets met RF gedaan (met een Arduino), en ik ben ook niet bekend met de M4 waar je over spreekt.

Het probleem is vaak dat zoiets als dit zich misschien niet als "echte" schakelaar gedraagt, en in dat geval zal het geen interrupt triggeren.
Als het echter dit model betreft, dan zou het weleens erg simpel kunnen zijn.
De datasheet die hier bij hoort suggereert dat het zichzelf als schakelaars gedraagt.
De spec sheet is wat uitgebreid, en ik weet niet of je er wat aan hebt, maar dit zou de spec sheet van het IC moeten zijn.
Ik weet niet of je meer documentatie hebt.

 

Heb jij misschien meer info?


   
BeantwoordenCiteren
Deel: