Neopixels aansturen

Geachte,

Ik probeer een "klein" project te maken met maar 6 neopixels.

er zijn 3 drukknoppen, en met iedere drukknop moeten 2 pixels van kleur veranderen.
Startkleur is blauw, en wordt de knop bediend dan moet die over faden naar rood.

Dit geldt voor alle 3 de drukknoppen alleen sturen ze alle een andere set pixels aan.

Ik heb een code geschreven, alleen op dit moment blijft de kleur rood wanneer de drukknop niet bedient is van 0 naar 256 faden in een loop. dit gebeurd voor 2 pixels.

als dit gedaan is gebeurt daarna hetzelfde voor de 2 volgende pixels.

Ik krijg het niet voor elkaar om alles tegelijk te laten verlopen, en dat er ook wordt ingegrepen wanneer er een knop bediend word. Nu loopt alles gewoon na elkaar af. Druk ik een knop in, maakt hij eerst de cyclus van de pixels af, om vervolgens de pixels van de bediende knop aan te gaan passen.

Uiteindelijk moet het nog zelfs een soort van crossfade functie gaan worden. Dus knop niet bediend dan zal hij blauw branden, wordt de knop dan bediend dan zal hij faden van blauw naar rood. Wordt de knop weer los gelaten dan moet hij faden van rood naar blauw.

Ik kom er alleen even niet meer uit. Wie kan me helpen.

// constants won't change. They're used here to
// set pin numbers:
const int Ring1 = A1;     // the number of the pushbutton pin
const int Ring2 = A2;     // the number of the pushbutton pin
const int Ring3 = A3;     // the number of the pushbutton pin

// variables will change:
int buttonStateRing1 = 0;         // variable for reading the pushbutton status
int buttonStateRing2 = 0;         // variable for reading the pushbutton status
int buttonStateRing3 = 0;         // variable for reading the pushbutton status

const int led1 = 11;     // status led
const int led2 = 12;     // status led
const int led3 = 13;     // status led




#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
  #include <avr/power.h>
#endif

#define PIN 6 // Digital Out to digital in ledstrip.

// Parameter 1 = number of pixels in strip
// Parameter 2 = Arduino pin number (most are valid)
// Parameter 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)
Adafruit_NeoPixel strip = Adafruit_NeoPixel(8, PIN, NEO_GRB + NEO_KHZ800);

// IMPORTANT: To reduce NeoPixel burnout risk, add 1000 uF capacitor across
// pixel power leads, add 300 - 500 Ohm resistor on first pixel's data input
// and minimize distance between Arduino and first pixel.  Avoid connecting
// on a live circuit...if you must, connect GND first.


void setup() {

    pinMode(Ring1, INPUT);
    pinMode(Ring2, INPUT);
    pinMode(Ring3, INPUT);

    pinMode(led1, OUTPUT);
    pinMode(led2, OUTPUT);
    pinMode(led3, OUTPUT);
    
  // This is for Trinket 5V 16MHz, you can remove these three lines if you are not using a Trinket
  #if defined (__AVR_ATtiny85__)
    if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
  #endif
  // End of trinket special code


  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
}

void loop() {

  buttonring1();
  buttonring2();
}

void buttonring1(){    // read the state of the pushbutton value:
  buttonStateRing1 = digitalRead(Ring1);

  // check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH:
  if (buttonStateRing1 == HIGH) {

    digitalWrite(led1, HIGH); // status led
    
    // turn led pixels ring 1 red:
    Serial.print("rood1");
    red1(20); // Red

      
  } else {
    digitalWrite(led1, LOW); // status led
    // turn led pixels ring 1 blauw:
    blue1(20);
      }
  }



void buttonring2(){    // read the state of the pushbutton value:
  buttonStateRing2 = digitalRead(Ring2);

  // check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH:
  if (buttonStateRing2 == HIGH) {

    digitalWrite(led2, HIGH); // status led
    
    // turn led pixels ring 1 red:
    Serial.print("rood2");
    red2(20); // Red

      
  } else {
    digitalWrite(led2, LOW); // status led
    // turn led pixels ring 1 blauw:
    blue2(20);
      }
  }

  

void red1( uint8_t wait) {
  
  for(uint16_t i=0; i<256; i++) {
    strip.setPixelColor(0, i, 0, 0); // pixelnummer / R / G / B
    strip.setPixelColor(3, i, 0, 0); // pixelnummer / R / G / B
    strip.show();
    delay(wait);
  }
}



void blue1( uint8_t wait) {
  
  for(uint16_t i=0; i<256; i++) {
    strip.setPixelColor(0, 0, 0, i); // pixelnummer / R / G / B
    strip.setPixelColor(3, 0, 0, i); // pixelnummer / R / G / B
    strip.show();
    delay(wait);
  }
}



void red2( uint8_t wait) {
  
  for(uint16_t j=0; j<256; j++) {
    strip.setPixelColor(1, j, 0, 0); // pixelnummer / R / G / B
    strip.setPixelColor(4, j, 0, 0); // pixelnummer / R / G / B
    strip.show();
    delay(wait);
  }
}



void blue2( uint8_t wait) {
  
  for(uint16_t j=0; j<256; j++) {
    strip.setPixelColor(1, 0, 0, j); // pixelnummer / R / G / B
    strip.setPixelColor(4, 0, 0, j); // pixelnummer / R / G / B
    strip.show();
    delay(wait);
  }
}

Open de voorbeeldsketch "Blink without delay" en leer hoe die sketch werkt.

Als je loops met delay gebruikt kan je het niet "tegelijk laten verlopen".

ArdLab_Gent:
Open de voorbeeldsketch "Blink without delay" en leer hoe die sketch werkt.

Als je loops met delay gebruikt kan je het niet "tegelijk laten verlopen".

die heb ik al inderdaad eens open gehad, maar heel oneerbiedig gezegd snap ik daar net geen bal van :smiley:

tot nu toe heb ik alleen waarschijnlijk heel omslachtig looplichten gemaakt voor mijn kermis attracties die ik bouw. Maar dat zijn toch loops dus kan ik gewoon met delays werken.

Die sketch van blink without delay ziet er voor mij uit als chinees, maar zal er nog eens naar gaan kijken

Zie millis() als een klok (die begint met lopen zodra de Arduino aan zet). Als ik jouw vraag over 5 minuten de vuilnis buiten te zetten kan jij dat gewoon. Jij onthoudt hoe laat het nu is:

previousMillis = currentMillis;

en kijkt af en toe op de klok en zet de vuilnis buiten als de 5 minuten om is:

if (currentMillis - previousMillis >= interval)