Tira LED WS2812

Buen día para todos.

Estoy realizando un proyecto que consiste en activar un segmento de la tira WS2812 según la detección de un sensor infrarrojo, sin embargo cuando todos los sensores están activos los LEDS se comporta diferente que cada segmento individual, no creo que sea un tema de fuente además coloque resistencias, entre los data de los sensores para mejorar la sensibilidad, así mismo otra resistencia entre el data de la tira LED.

Tal vez pueda ser algo de el código un tema de optimización, si alguien puede guiarme le agradezco.

Anexo un vídeo de la prueba.
https://drive.google.com/drive/folders/1ep3K35rFPAYApVoT7d4kh9luyABBFhBz?usp=sharing

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
 #include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif
const byte S1=3;
const byte S2=4;
const byte S3=5;
const byte S4=6;
const byte S5=7;
const byte S6=8;
const byte S7=9;
const byte S8=10;
#define DELAYVAL 100
#define DATA 33
#define NUMPIXELS 60 // Popular NeoPixel ring size
Adafruit_NeoPixel pixels(NUMPIXELS, DATA, NEO_GRB + NEO_KHZ800);
int D1;
int D2;
int D3;
int D4;
int D5;
int D6;
int D7;
int D8;

void setup() {
  // put your setup code here, to run once:
  #if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
  clock_prescale_set(clock_div_1);
#endif
pinMode(S1, INPUT);
pinMode(S2, INPUT);
pinMode(S3, INPUT);
pinMode(S4, INPUT);
pinMode(S5, INPUT);
pinMode(S6, INPUT);
pinMode(S7, INPUT);
pinMode(S8, INPUT);
pinMode(DATA, OUTPUT);
pixels.begin(); // INITIALIZE NeoPixel strip object (REQUIRED)

}

void loop() {

pixels.clear(); // Set all pixel colors to 'off'

  D1 = digitalRead(S1);
  if (D1 == LOW) {


  
   pixels.setPixelColor(0, pixels.Color(255, 255, 255));
   pixels.setPixelColor(1, pixels.Color(255, 255, 255));
   pixels.setPixelColor(2, pixels.Color(255, 255, 255));
   pixels.setPixelColor(3, pixels.Color(255, 255, 255));
   pixels.setPixelColor(4, pixels.Color(255, 255, 255));
   delay(50);
   pixels.show();   // Send the updated pixel colors to the hardware.
  
   //delay(DELAYVAL); // Pause before next pass through loop
  
  }
            //else if (D1 == HIGH){
              //pixels.clear();
              //pixels.show();   // Send the updated pixel colors to the hardware.
  
 // } 

   D2 = digitalRead(S2);
  if (D2 == LOW) {


  
   pixels.setPixelColor(4, pixels.Color(255, 255, 255));
   pixels.setPixelColor(5, pixels.Color(255, 255, 255));
   pixels.setPixelColor(6, pixels.Color(255, 255, 255));
   pixels.setPixelColor(7, pixels.Color(255, 255, 255));
   pixels.setPixelColor(8, pixels.Color(255, 255, 255));
   pixels.setPixelColor(9, pixels.Color(255, 255, 255));
   pixels.setPixelColor(10, pixels.Color(255, 255, 255));
   pixels.show();   // Send the updated pixel colors to the hardware.
  
   // delay(DELAYVAL); // Pause before next pass through loop
  
  }
            else if (D2 == HIGH){
              //pixels.clear();
              //pixels.show();   // Send the updated pixel colors to the hardware.
  
  } 
   D3 = digitalRead(S3);
  if (D3 == LOW) {


  
   pixels.setPixelColor(10, pixels.Color(255, 255, 255));
   pixels.setPixelColor(11, pixels.Color(255, 255, 255));
   pixels.setPixelColor(12, pixels.Color(255, 255, 255));
   pixels.setPixelColor(13, pixels.Color(255, 255, 255));
   pixels.setPixelColor(14, pixels.Color(255, 255, 255));
   pixels.setPixelColor(15, pixels.Color(255, 255, 255));
   pixels.setPixelColor(16, pixels.Color(255, 255, 255));
   pixels.show();   // Send the updated pixel colors to the hardware.
  
   // delay(DELAYVAL); // Pause before next pass through loop
  
  }
            else if (D3 == HIGH){
              //pixels.clear();
              //pixels.show();   // Send the updated pixel colors to the hardware.
  
  } 

   D4 = digitalRead(S4);
  if (D4 == LOW) {


  
   pixels.setPixelColor(16, pixels.Color(255, 255, 255));
   pixels.setPixelColor(17, pixels.Color(255, 255, 255));
   pixels.setPixelColor(18, pixels.Color(255, 255, 255));
   pixels.setPixelColor(19, pixels.Color(255, 255, 255));
   pixels.setPixelColor(20, pixels.Color(255, 255, 255));
   pixels.setPixelColor(21, pixels.Color(255, 255, 255));
   pixels.setPixelColor(22, pixels.Color(255, 255, 255));
   pixels.show();   // Send the updated pixel colors to the hardware.
  
  // delay(DELAYVAL); // Pause before next pass through loop
  
  }
            else if (D4 == HIGH){
              //pixels.clear();
              //pixels.show();   // Send the updated pixel colors to the hardware.
  
  } 

   D5 = digitalRead(S5);
  if (D5 == LOW) {


  
   pixels.setPixelColor(22, pixels.Color(255, 255, 255));
   pixels.setPixelColor(23, pixels.Color(255, 255, 255));
   pixels.setPixelColor(24, pixels.Color(255, 255, 255));
   pixels.setPixelColor(25, pixels.Color(255, 255, 255));
   pixels.setPixelColor(26, pixels.Color(255, 255, 255));
   pixels.setPixelColor(27, pixels.Color(255, 255, 255));
   pixels.setPixelColor(28, pixels.Color(255, 255, 255));
   pixels.show();   // Send the updated pixel colors to the hardware.
  
   // delay(DELAYVAL); // Pause before next pass through loop
  
  }
            else if (D5 == HIGH){
              //pixels.clear();
              //pixels.show();   // Send the updated pixel colors to the hardware.
  
  } 

   D6 = digitalRead(S6);
  if (D6 == LOW) {


  
   pixels.setPixelColor(28, pixels.Color(255, 255, 255));
   pixels.setPixelColor(29, pixels.Color(255, 255, 255));
   pixels.setPixelColor(30, pixels.Color(255, 255, 255));
   pixels.setPixelColor(31, pixels.Color(255, 255, 255));
   pixels.setPixelColor(32, pixels.Color(255, 255, 255));
   pixels.setPixelColor(33, pixels.Color(255, 255, 255));
   pixels.setPixelColor(34, pixels.Color(255, 255, 255));
   pixels.show();   // Send the updated pixel colors to the hardware.
  
   // delay(DELAYVAL); // Pause before next pass through loop
  
  }
            else if (D6 == HIGH){
              //pixels.clear();
              //pixels.show();   // Send the updated pixel colors to the hardware.
  
  } 
   D7 = digitalRead(S7);
  if (D7 == LOW) {


  
   pixels.setPixelColor(34, pixels.Color(255, 255, 255));
   pixels.setPixelColor(35, pixels.Color(255, 255, 255));
   pixels.setPixelColor(36, pixels.Color(255, 255, 255));
   pixels.setPixelColor(37, pixels.Color(255, 255, 255));
   pixels.setPixelColor(38, pixels.Color(255, 255, 255));
   pixels.setPixelColor(39, pixels.Color(255, 255, 255));
   pixels.setPixelColor(40, pixels.Color(255, 255, 255));
   pixels.show();   // Send the updated pixel colors to the hardware.
  
   // delay(DELAYVAL); // Pause before next pass through loop
  
  }
            else if (D7 == HIGH){
     //         pixels.clear();
       //       pixels.show();   // Send the updated pixel colors to the hardware.
  
  } 

   D8 = digitalRead(S8);
  if (D8 == LOW) {


  
   pixels.setPixelColor(40, pixels.Color(255, 255, 255));
   pixels.setPixelColor(41, pixels.Color(255, 255, 255));
   pixels.setPixelColor(42, pixels.Color(255, 255, 255));
   pixels.setPixelColor(43, pixels.Color(255, 255, 255));
   pixels.setPixelColor(44, pixels.Color(255, 255, 255));
   pixels.setPixelColor(45, pixels.Color(255, 255, 255));
  
   pixels.show();   // Send the updated pixel colors to the hardware.
  
   /// delay(DELAYVAL); // Pause before next pass through loop
  
  }
            else if (D8 == HIGH){
         //     pixels.clear();
           //   pixels.show();   // Send the updated pixel colors to the hardware.
  
  }
   // pixels.clear(); // Set all pixel colors to 'off'
    // pixels.show();   // Send the updated pixel colors to the hardware.
  }

Moderador:
Por favor, lee las Normas del foro.
He editado tu título retirando la palabra "Ayuda" que es considerada inutil para las normas de este foro. Evista usarla, asi como otras que estan bien determinadas en el punto 5 de dichas normas.

A ver si este enfoque mejora. Si a cada loop borras todo, se genera un efecto optico molesto.
Lo que he hecho es decirle como deben encenderse los leds sea en 1 o apagados.

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
 #include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif
const byte S1=3;
const byte S2=4;
const byte S3=5;
const byte S4=6;
const byte S5=7;
const byte S6=8;
const byte S7=9;
const byte S8=10;

#define DELAYVAL 100
#define DATA    33
#define NUMPIXELS 60 // Popular NeoPixel ring size
Adafruit_NeoPixel pixels(NUMPIXELS, DATA, NEO_GRB + NEO_KHZ800);
int D1, D2, D3, D4, D5, D6, D7, D8;
void presentoLED(int desde, int hasta) {
  for (int i=0; i<NUMPIXELS; i++) {
       if (i >= desde && i <= hasta) 
          pixels.setPixelColor(i, pixels.Color(255, 255, 255));
       else 
          pixels.setPixelColor(i, pixels.Color(0, 0, 0));
  }
  pixels.show();
}

void setup() {
    // put your setup code here, to run once:
    #if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
      clock_prescale_set(clock_div_1);
    #endif
    pinMode(S1, INPUT);
    pinMode(S2, INPUT);
    pinMode(S3, INPUT);
    pinMode(S4, INPUT);
    pinMode(S5, INPUT);
    pinMode(S6, INPUT);
    pinMode(S7, INPUT);
    pinMode(S8, INPUT);
    pinMode(DATA, OUTPUT);
    pixels.begin(); // INITIALIZE NeoPixel strip object (REQUIRED)
}

void loop() {
  pixels.clear(); // Set all pixel colors to 'off'

  D1 = digitalRead(S1);
  if (D1 == LOW) {
      presentoLED(0,4);
  }

  D2 = digitalRead(S2);
  if (D2 == LOW) {
      presentoLED(4,10);
  }
  
  D3 = digitalRead(S3);
  if (D3 == LOW) {
      presentoLED(10, 16);
  }
  
  D4 = digitalRead(S4);
  if (D4 == LOW) {
      presentoLED(16, 22);
  }
  
  D5 = digitalRead(S5);
  if (D5 == LOW) {
      presentoLED(22,28);
  }

  D6 = digitalRead(S6);
  if (D6 == LOW) {
      presentoLED(28, 34);
  }

  D7 = digitalRead(S7);
  if (D7 == LOW) {
      presentoLED(34,40);
  }

  D8 = digitalRead(S8);
  if (D8 == LOW) {
      presentoLED(40,45);
  }
}

Hola chicos.
Aunque el nuevo enfoque de @Surbyte no esta mal va a perder mas tiempo por if en apagar led (pixels.Color(0, 0, 0)) que en encenderlos y para eso ya tenemos el pixels.clear() que nos limpia el buffer.esa funcion yo la haria asi:

void presentoLED(int desde, int hasta) {
  pixels.clear();
  for (int i=0; i<NUMPIXELS; i++) {
       pixels.setPixelColor(i, pixels.Color(255, 255, 255));
  }
  pixels.show();
}

Y ahora volviendo al codigo original, que en principio esta bien pero creo @juancan00 que estas usando inadecuadamente el pixels.show() y pixels.clear(). Haz lo siguiente :

  • quita los pixels.show() de todos los if
  • Las tres primeras lineas del loop serian:
pixels.show();
delay (DELAYVAL);
pixels.clear();

Todo esto es teorico, no tengo tantos led, pero en esta semana me llegan unas flamantes tiras de china y lo podria probar.
Saludos.
PD: pixels.clear() no apaga la tira ,solo borra el bufer que se ha de enviar a la tira con pixels.show().